本文是马哥教育特约金牌讲师、Linux运维专家魏巍的分享《Anisble常用模块入门指南》的文字整理篇。
朋友们晚上好:
今天我为大家带来的分享是
Ansible系列课堂之基础入门-基础模块的使用
难度指数: 2星(满星5星)
技术指数: 5星(满星5星)
理论指数: 2星(满星5星)
面向人群: 自动化运维&初中级运维
简单做下自我介绍:
魏巍: 出生时经医生证实为90后超早期,狂热的单车与开源爱好者,6年Linux一线运维经验,《Ansible权威指南》一书联合作者,做事情常出于“我不懂所以我想知道”的好奇心,在运维界界颇负“魏巍是谁啊没听说过”的盛名。
简介
众所周知,ansible是自动化运维神器
可以方便的实现大批量定制任务
首先,我们来了解一下ansible的整体架构
接下来,我们对上图中ansible的核心组件进行简单的解析
第一条ansible命令
今天我们将借助一些ansible基础命令来初步了解一下Host inventory,深入学习几个常用的Core module
我们来看一条简单的ansible命令:
ansible datanodes -mcommand -a “uptime”
下面我们对其基本命令格式进行解析
adnsible的基本使用格式,如下:
ansible <host-pattern> [-f forks] [-mmodule_name] [-a args]
主机池
# ansible datanodes -mcommand -a uptime 中,
datanodes即所谓的host-pattern
定义在/etc/ansible/hosts文件中,格式如下:
(主机列表可以为域名,也可为IP地址)
data[4:6]为data4,data5,data6的简写形式
只有在/etc/ansible/hosts中定义过的主机,才能被ansible管理
主机变量
可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用。例如:
[webservers] www1.magedu.com http_port=80maxRequestsPerChild=100 www2.magedu.com http_port=8080maxRequestsPerChild=200
需要注意的是这些变量只能在playbook中使用
组变量
组变量是指赋予给指定组内所有主机上的在playboo中可用的变量。例如:
[webservers] www1.magedu.com www2.magedu.com
共享如下变量:
[webservers:vars] ntp_server=ntp.magedu.com nfs_server=nfs.magedu.com
如此,ntp_server和nfs_server两个变量,便可被webservers组内所有主机共享
主机池
Ansible默认使用root用户,通过ssh对各主机进行管理
建议使用ssh密钥免密码认证来连接各主机
但也可以全用指定用户和密码,可直接在ansible hosts文件中指定:
ssh相关的参数如下:
ansible_ssh_host
指定域名对应的IP地址
ansible_ssh_port
指定ssh连接端口号
ansible_ssh_user
指定ssh默认使用哪个用户进行管理
ansible_ssh_pass
ssh连接所用的密码 (这非常不安全,强烈建议全用ssh密钥认证或交互式输入密码 --ask-pass )
ansible_sudo_pass
指定sudo的密码 (这非常不安全,强烈建议全用ssh密钥认证或交互式输入密码 --ask-pass)
简单明了,不是吗?
关于主机池的应用,先说这么多
下面我们深入介绍一下几个常用的核心模块
常用模块
Ansible 默认使用command模块,所以
#ansible –m commanddatanodes -a uptime
可以简写为: #ansible datanodes -a uptime
如图所示:
执行命令成功,返回结果为绿色
获取帮助
Anbible的模块那么多,我该如何获取各模块的信息和帮助呢?
Ansible为我们提供了ansible-doc命令
基本用法为:
ansible-doc [-Mmodule_path] [-l] [-s] [module...]
-M 文件路径, --moudle-path=文件路径
指定额外目录来寻找模块所需的库文件
-s, --snipet=
产生一段可以应用playbook中内容,类似于一种任务模板
-l, --list=
显示简洁的模块列表和一些简单的注释
如图所示,ansible-doc会显示两列信息
左侧为模块名,右侧为模块简介
左右一一对应
简单明了
以group模块为例
# ansible-doc -s group
group部共四个参数
(注意:group模块需要依赖系统命令:groupadd,groupdel,groupmod)
如此,我们在各datanode结点上分别创建gid为501的组
#ansible datanodes -m group -a 'name=developer' data2| success >> { "changed": true, "gid": 501, "name": "developer", "state": "present", "system": false } data3| success >> { "changed": true, "gid": 501, "name": "developer", "state": "present", "system": false }
删除developer组操作
# ansible datanodes -m group -a'name=developer state=absent' data4 | success>> { "changed": true, "name": "developer", "state": "absent" } data3 | success>> { "changed": true, "name": "developer", "state": "absent" }
user模块
ansible-doc user
user模块常用的参数有:
一个直观的例子:
ansible all –m user –a‘name=dev uid=666 group=developer’
我们看到,uid和group均为我们设置的值
group显示的是gid,gid501即为我们刚才新建的组ID
状态值state为present
当我们需要删除用户时,使用state设为absent就可以了,如:
ansible all –m user –a‘name=dev uid=666 group=developer state=absent’
copy模块
顾名思义,copy模块是用来远程传输文件的
常用参数如下:
一个简单的例子
我们要把本地文件/etc/issue复制到远程主机/tmp/目录下
属主为:zabbix用户
同时,还要求只有属主对该文件有读写权限
ansible datanodes -m copy -a 'src=/etc/issuedest=/tmp/issue.ansible mode=600 owner=zabbix'
content 参数的用法
比如,我们传送一段内容
“hello world
how are you ?” 到远程主机上的文件/tmp/content.ansible,操作如下:
# ansible datanodes -m copy -a'content="hello world!\n how are you? \n"dest="/tmp/content.ansible"'
# ssh data3 "cat /tmp/content.ansible" hello world! how areyou?
content可以对\n进行转义
是不是很棒?!~
定时任务管理模块:cron
批量管理定时任务
cron模块下的参数:day,hour,minute,month,weekday与系统crontab中的值一一对应
默认值都是*
为了演示效果
要求第分钟ping 一个www.baidu.com
# ansible data1 -m cron -a 'name="pingtest" minute="*/1" job="ping www.baidu.com" ' data1 | success >> { "changed": true, "jobs": [ "ping test" ] }
注意:
name变量是必须指定的
删除某个job时,使用state参数:
state=absent
shell模块:在远程主机上执行命令
类似command模块
但是稍有不同,功能更为强大
比如,使用command中要使用管道符“|”
报出一系列的错误
使后shell模块后
顺利执行
所以,当命令中需要用到管道符时,一定要使用shell模块替代command模块
最后,给初学都一个最容易上手的模块 ping模块
Ping 模块用于检测主机的网络连通性
正常通信的主机,会返回一个pong信号