ansible常用模块
1、主机连通性测试:

ansible all -m ping

执行效果如下:

[root@CentOS7-master ~]# ansible all -m ping
172.17.254.165 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.17.254.180 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.17.250.230 | SUCCESS => {
"changed": false,
"ping": "pong"
}

若出现以下结果,则说明未配置主机列表,则需要在/etc/ansible/hosts 中添加主机列表:

[root@CentOS7-master ~]# ansible all -m ping
[WARNING]: provided hosts list is empty, only localhost is available

[WARNING]: No hosts matched, nothing to do

2、command:在远程主机执行命令;不支持|管道命令

命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。它不会通过shell进行处理,比如$HOME和操作如”小于”<“,”>”, “|”, “;”,”&”‘ 工作(需要使用(shell)模块实现这些功能)。

action: command

chdir #在执行命令之前,先切换到该目录

creates #一个文件名,当这个文件存在,则该命令不执行,可以用来做判断

executable #切换shell来执行命令,需要使用命令的绝对路径

free_form #要执行的Linux指令,一般使用ansible的-a参数代替。

removes #一个文件名,这个文件不存在,则该命令不执行,与creates相反的判断

[root@CentOS7-master ~]# ansible all -m command -a 'ifconfig'
172.17.250.230 | SUCCESS | rc=0 >>
ens32: flags=4163 mtu 1500
inet 172.17.250.230 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::20c:29ff:fefc:13f0 prefixlen 64 scopeid 0x20
ether 00:0c:29:fc:13:f0 txqueuelen 1000 (Ethernet)
RX packets 15924367 bytes 1678705351 (1.5 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8677333 bytes 1589494094 (1.4 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

ens33: flags=4163 mtu 1500
inet 192.168.73.130 netmask 255.255.255.0 broadcast 192.168.73.255
inet6 fe80::20c:29ff:fefc:13fa prefixlen 64 scopeid 0x20
ether 00:0c:29:fc:13:fa txqueuelen 1000 (Ethernet)
RX packets 8003 bytes 1375066 (1.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 78 bytes 5016 (4.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

172.17.254.165 | SUCCESS | rc=0 >>
ens32: flags=4163 mtu 1500
inet 172.17.254.165 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::20c:29ff:fe6a:1f0f prefixlen 64 scopeid 0x20
ether 00:0c:29:6a:1f:0f txqueuelen 1000 (Ethernet)
RX packets 6028867 bytes 489629406 (466.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 322593 bytes 58991897 (56.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

ens33: flags=4163 mtu 1500
inet 192.168.73.137 netmask 255.255.255.0 broadcast 192.168.73.255
inet6 fe80::20c:29ff:fe6a:1f19 prefixlen 64 scopeid 0x20
ether 00:0c:29:6a:1f:19 txqueuelen 1000 (Ethernet)
RX packets 7859 bytes 1345936 (1.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 20 bytes 1536 (1.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

172.17.254.180 | SUCCESS | rc=0 >>
ens32: flags=4163 mtu 1500
inet 172.17.254.180 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::20c:29ff:fedb:9611 prefixlen 64 scopeid 0x20
ether 00:0c:29:db:96:11 txqueuelen 1000 (Ethernet)
RX packets 8231638 bytes 3839144807 (3.5 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2504227 bytes 177542489 (169.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

ens33: flags=4163 mtu 1500
inet 192.168.73.151 netmask 255.255.255.0 broadcast 192.168.73.255
inet6 fe80::20c:29ff:fedb:961b prefixlen 64 scopeid 0x20
ether 00:0c:29:db:96:1b txqueuelen 1000 (Ethernet)
RX packets 10665 bytes 1901294 (1.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2600 bytes 521922 (509.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

[root@CentOS7-master ~]# ansible all -m command -a 'chdir=/tmp ls'
172.17.254.165 | SUCCESS | rc=0 >>
ansible_nDr_sW
systemd-private-6524f00099a646b28e1484e64e97f459-nginx.service-SDDItJ
systemd-private-6524f00099a646b28e1484e64e97f459-vmtoolsd.service-9zL9Z3

172.17.250.230 | SUCCESS | rc=0 >>
ansible_W9Cey7
systemd-private-cbd6ab787c1047f49bd164e1928bc50c-mariadb.service-ZWF9XI
systemd-private-cbd6ab787c1047f49bd164e1928bc50c-vmtoolsd.service-7NjwSi

172.17.254.180 | SUCCESS | rc=0 >>
ansible_p4DDLJ
hsperfdata_tomcat
systemd-private-e8fcbe84909942deb6ea742ed68dca4e-vmtoolsd.service-7sY3og

3、shell模块

shell模块在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等 :

[root@CentOS7-master ~]# ansible webservers -m shell -a 'cat /etc/passwd |grep "root"'
172.17.254.180 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

172.17.254.165 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

4、copy:复制文件到远程主机,可以改权限等

用法:
(1) 复制文件

-a "src= dest= "

1

(2) 给定内容生成文件

-a "content= dest= "

1

相关选项如下:
backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no

content:用于替代“src”,可以直接设定指定文件的值

dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录

directory_mode:递归设定目录的权限,默认为系统默认权限

force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes

others:所有的file模块里的选项都可以在这里使用

src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

[root@CentOS7-master ~]# ansible webservers -m copy -a 'content="hello\nworld" dest=/tmp/test.ansible mode=666'
172.17.254.165 | SUCCESS => {
"changed": true,
"checksum": "7db827c10afc1719863502cf95397731b23b8bae",
"dest": "/tmp/test.ansible",
"gid": 0,
"group": "root",
"md5sum": "9195d0beb2a889e1be05ed6bb1954837",
"mode": "0666",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 11,
"src": "/root/.ansible/tmp/ansible-tmp-1512465712.79-212682551827039/source",
"state": "file",
"uid": 0
}
172.17.254.180 | SUCCESS => {
"changed": true,
"checksum": "7db827c10afc1719863502cf95397731b23b8bae",
"dest": "/tmp/test.ansible",
"gid": 0,
"group": "root",
"md5sum": "9195d0beb2a889e1be05ed6bb1954837",
"mode": "0666",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 11,
"src": "/root/.ansible/tmp/ansible-tmp-1512465712.87-100512759759497/source",
"state": "file",
"uid": 0
}

5、file 设置文件属性:

创建目录:-a "path= state=directory"
创建链接文件:-a "path= src= state=link"
删除文件:-a "path= state=absent"

force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no

group:定义文件/目录的属组 mode:定义文件/目录的权限

owner:定义文件/目录的属主 path:必选项,定义文件/目录的路径

recurse:递归设置文件的属性,只对目录有效 src:被链接的源文件路径,只应用于state=link的情况

dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件

[root@CentOS7-master ~]# ansible webservers -m file -a 'path=/tmp/test state=directory'
172.17.254.165 | SUCCESS => {
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/tmp/test",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 6,
"state": "directory",
"uid": 0
}
172.17.254.180 | SUCCESS => {
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/tmp/test",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 6,
"state": "directory",
"uid": 0
}
[root@CentOS7-master ~]#
[root@CentOS7-master ~]#
[root@CentOS7-master ~]# ansible webservers -m file -a 'path=/data/web.sh state=touch'
172.17.254.165 | SUCCESS => {
"changed": true,
"dest": "/data/web.sh",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": 0,
"state": "file",
"uid": 0
}
172.17.254.180 | SUCCESS => {
"changed": true,
"dest": "/data/web.sh",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": 0,
"state": "file",
"uid": 0
}
[root@CentOS7-master ~]#
[root@CentOS7-master ~]# ansible webservers -m file -a 'path=/data/web.sh state=file'
172.17.254.165 | SUCCESS => {
"changed": false,
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"path": "/data/web.sh",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": 0,
"state": "file",
"uid": 0
}
172.17.254.180 | SUCCESS => {
"changed": false,
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"path": "/data/web.sh",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": 0,
"state": "file",
"uid": 0
}

6、fetch从远程某主机获取文件到本地:

dest:用来存放文件的目录,例如存放目录为backup,源文件名称为/etc/profile在主机pythonserver中,那么保存为/backup/pythonserver/etc/profile;

Src:在远程拉取的文件,并且必须是一个file,不能是目录。

[root@CentOS7-master ~]# ansible webservers -m fetch -a 'src=/var/log/messages dest=/root'
172.17.254.165 | SUCCESS => {
"changed": true,
"checksum": "8065eb47956eaa59d3ca64a2c69a38084ae7505d",
"dest": "/root/172.17.254.165/var/log/messages",
"md5sum": "c864d77846965436f8d7feb660c103a1",
"remote_checksum": "d7f2d4876e65962444963531e4ed10b319e7b277",
"remote_md5sum": null
}
172.17.254.180 | SUCCESS => {
"changed": true,
"checksum": "0d0829396b7dfdc1951c3ec35fa266f3195c6763",
"dest": "/root/172.17.254.180/var/log/messages",
"md5sum": "7a3f75bb76aed49282bc7cbc3142448c",
"remote_checksum": "0d0829396b7dfdc1951c3ec35fa266f3195c6763",
"remote_md5sum": null
}

7、cron管理cron计划任务

ansible all -m cron -a “ ”: 设置管理节点生成定时任务

action: cron backup= #如果设置,创建一个crontab备份 [yes|no]
cron_file= #如果指定, 使用这个文件cron.d,而不是单个用户

crontab

day= #日应该运行的工作( 1-31, , /2, )

hour= #小时 ( 0-23, , /2, )

minute= #分钟( 0-59, , /2, )

month= #月( 1-12, *, /2, )

weekday #周 ( 0-6 for Sunday-Saturday,, )

job= #指明运行的命令是什么

name= #定时任务描述

reboot #任务在重启时运行,不建议使用,建议使用special_time

special_time #特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)

state #指定状态,present表示添加定时任务,也是默认设置,absent表示删除定时任务

user #以哪个用户的身份执行

ansible webservers -m cron -a 'name="sync time from ntpserver" minute="*/10" job="/sbin/ntpdate asia.pool.ntp.org &>/dev/null" '

8、yum安装软件

conf_file #设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。
disable_gpg_check #是否禁止GPG checking,只用于‘present’ or `latest’。
disablerepo #临时禁止使用yum库。 只用于安装或更新时。
enablerepo #临时使用的yum库。只用于安装或更新时。

#下面带“”的都是重点的
name= #所安装的包的名称
state=present|latest|absent #present安装,latest安装最新的,absent 卸载软件。
update_cache #强制更新yum的缓存。

[root@CentOS7-master ~]# ansible 172.17.254.165 -m yum -a 'name=htop state=present'
172.17.254.165 | SUCCESS => {
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\nResolving Dependencies\n--> Running transaction check\n---> Package htop.x86_64 0:2.0.2-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n htop x86_64 2.0.2-1.el7 epel 98 k\n\nTransaction Summary\n================================================================================\nInstall 1 Package\n\nTotal download size: 98 k\nInstalled size: 207 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : htop-2.0.2-1.el7.x86_64 1/1 \n Verifying : htop-2.0.2-1.el7.x86_64 1/1 \n\nInstalled:\n htop.x86_64 0:2.0.2-1.el7 \n\nComplete!\n"
]
}

9、service: 服务程序管理

arguments #命令行提供额外的参数
enabled=true|false #设置开机启动。
name= #服务名称
runlevel #开机启动的级别,一般不用指定。
sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。
state= #started启动服务, stopped停止服务, restarted重启服务, reloaded重载配置

ansible 172.17.254.165 -m service -a 'name=nginx state=stopped enabled=true'

10、user模块管理

用户模块,管理用户帐号 action: user

comment #用户的描述信息
createhome #是否创建家目录
force #在使用state=absent是, 行为与userdel –force一致.
group #指定基本组
groups #指定附加组,如果指定为(groups=)表示删除所有组
home #指定用户家目录
move_home #如果设置为home=时, 试图将用户主目录移动到指定的目录
name #指定用户名
non_unique #该选项允许改变非唯一的用户ID值
password #指定用户密码
remove #在使用state=absent时, 行为是与userdel –remove一致
shell #指定默认shell
state #设置帐号状态,不指定为创建,指定值为absent表示删除
system #当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid #指定用户的uid
update_password #更新用户密码

#创建一个name为tom,uid为1006,shell为、bin/zshell,home为/home/tomhome的用户
[root@CentOS7-master ~]# ansible webservers -m user -a 'name=tom comment="tom is tom" uid=1066 shell=/bin/zshell home=/home/tomhome'
172.17.254.165 | SUCCESS => {
"changed": true,
"comment": "tom is tom",
"createhome": true,
"group": 1066,
"home": "/home/tomhome",
"name": "tom",
"shell": "/bin/zshell",
"state": "present",
"system": false,
"uid": 1066
}
172.17.254.180 | SUCCESS => {
"changed": true,
"comment": "tom is tom",
"createhome": true,
"group": 1066,
"home": "/home/tomhome",
"name": "tom",
"shell": "/bin/zshell",
"state": "present",
"system": false,
"uid": 1066
}

11、group

用户组模块,添加或删除组:action: group

gid # 设置组的GID号
name= # 管理组的名称
state # 指定组状态,默认为创建,设置值为absent为删除
system # 设置值为yes,表示为创建系统组

[root@CentOS7-master ~]# ansible webservers -m group -a 'name=tom state=present'
172.17.254.165 | SUCCESS => {
"changed": false,
"gid": 1066,
"name": "tom",
"state": "present",
"system": false
}
172.17.254.180 | SUCCESS => {
"changed": false,
"gid": 1066,
"name": "tom",
"state": "present",
"system": false
}

12、script在指定节点运行服务端的脚本

[root@CentOS7-master ~]# vim test.sh
#/bin/bash

#创建/tmp/test.sh.log
touch /tmp/test.sh.log

#将date命令结果输出到/tmp/test.sh.log
echo “hello” >> /tmp/test.s.sh'

在webservers组中所有主机执行/root/test.sh脚本

[root@CentOS7-master ~]# ansible webservers -m script -a '/root/test.sh'

13、setup模块

facts组件是ansible用于采集被管机器设备信息的一个功能,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。

facts就是变量,内建变量 。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。

setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。

setup模块下经常使用的一个参数是filter参数,具体使用示例如下(由于输出结果较多,这里只列命令不写结果):

ansible 172.17.254.165 -m setup -a 'filter=ansible*mb' //查看主机内存信息
ansible 172.17.254.180 -m setup -a 'filter=ansible_ens3[2-3]' //查看地接口为eth0-2的网卡信息

ansible all -m setup --tree /tmp/facts //将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名)