- //host1代表主机与组的名称 ,下面的IP是组内的IP。
- ansible host2 -m command -a date #//对host2主机组的主机执行date命令 ,验证节点已添加
“msg”: “Failed to connect to the host via ssh: Permission denied (publickey,gssapi- keyex,gssapi-with-mic,password).”,
显示此报错 ,是因为无法远程 ,没有相应的密码登录 ,加入“ -k”选项 ,输入密码后 ,系统会自己保存 ,下次远程就 不需要“ -k”选项了。注意: 同一个主机变量组内的所有主机 ,密码必须一致。
#ansible host2 -m command -a date -k //-k选项为验证远程主机密码 ,在下面输入远程主机密码即可。
SSH password:
192.168.223.13 | CHANGED | rc=0 >> Sat Jun 6 21:16:10 CST 2020
192.168.223.14 | CHANGED | rc=0 >> Sat Jun 6 21:16:02 CST 2020
此状态显示为此成功 ,远程主机的密码符保存在/root/.ssh/know_hosts文件中 ,若有设备显示无法成功。
#vi /etc/ansible/hosts - //“:children” 这个关键字为组变量 ,可将多个组组合起来 ,使 #其同步 ,远程操作时候改为group,其下的两个组内的主机都将执 #行指定命令
- nocolor = 1
= /usr/share/my_module_utils/ #一样也是模块默认的存放路径 ,一般不要改。
= ~/.ansible/tmp #指定远程执行的路径;ansible在远程主机上操作时 ,会在对应
#表示资源清单的文件位置 ,就是Ansible管理的主机列表 #Ansible运行都需要使用模块 ,这个路径就是模块存放的路径
= /etc/ansible/hosts = /usr/share/my_modules/ - ansile-doc -t become -l
ksu Kerberos substitute user
pbrun PowerBroker run
enable Switch to elevated permissions on a network device
sesu CA Privileged Access Manager
pmrun Privilege Manager run
runas Run As user
sudo Substitute User DO
su Substitute User
doas Do As user
pfexec profile based execution
machinectl Systemd ‘s machinectl privilege escalation
dzdo Centrify ‘s Direct Authorize
以上就是可以提高权限的参数 ,常用为sudo和su。
举例: su
# ansible 192.168.223.12 -b —become-method=su -m command -a ‘touch /mnt/linux1.txt ‘ -K
BECOME password: //因为是su,所以要输入节点的root用户密码。 192.168.223.12 | CHANGED | rc=0 >> -b代表提升权限 , —become-method后代表提升权限为su, -K表示提升所属权限的密码。 远程节点验证: [root@12 ~]# ll /mnt/linux1.txt -rw-rw-r—. 1 root root 0 Jun 11 07:36 /mnt/linux1.txt //表示使用的是root权限创建的文件。
举例: sudo
# ansible 192.168.223.12 -b —become-method=sudo -m command -a ‘touch /mnt/linux2.txt ‘ -K
若报错显示共享关闭 ,不在sudoers文件中 ,这说明远程节点的普通用户一开始就没被授予sudo权限 切入远程节点端:
节点端:
# vi /etc/sudoers //最后一行添加
www ALL=(root) All
若不想让使用sudo时候输入密码 ,最后的ALL改为 NOPASSWD: ALL 然后就不用再加 -K选项就可直接操作了。
管理端:继续测试
# ansible 192.168.223.12 -b —become-method=sudo -m command -a ‘touch /mnt/linux2.txt ‘ -K
192.168.223.12 | CHANGED | rc=0 >>
节点端:
[root@12 ~]# ll /mnt/linux2.txt
-rw-r—r—. 1 root root 0 Jun 11 07:52 /mnt/linux2.txt
表明成功。
一、 Ansible基础篇

1.Ansible命令介绍
| 1、ansible :为核心命令 ,主要用于执行ad-hoc命令 ,后跟主机与选项部分 ,默认不指定模块时 ,使用command模块 2、ansible-doc :查看模块信息 ,常用参数为‘ -l’与‘ -s ’,例 :ansible-doc -s 模块名称 3、ansible-galaxy :用于在https://galaxy.ansible.com/ 站点下载第三方扩展模块 ,形似Centos的Yum。 4、ansible-lint :用于对playbook语法进行检查。 5、ansible-playbook :使用最多 ,通过读取playbook文件后 ,执行相应的操作, 6、ansible-pull :pull模式 ,平时使用的属push模式 ,适用于设备数量巨大以及ansible主机没有网络连接。 7、ansible-vault :用于对playbook配置的加密 ,避免部分密码配置泄露 ,使用cat也只能看见密码串 ,编辑时候需 要输入密码 ,在执行playbook任务时候 ,需要加“ -ask-vault-pass”参数 ,同样输入密码后方可执行。 |
|---|
2.Ansible安装
| #yum -y install epel-release #yum -y install ansible #ansible —version | //安装红帽的源 , 自带yum的ansible软件包会报错 //安装ansible包。 |
|
|---|---|---|
| ansible版本|配置文件路径|模块路径|Pthon对应模块路径|ansible二进制执行路径|python版本 | ||
| #vi /etc/ansible/ansible.cfg host_key_checking = False |
//将此命令前的注释去掉 ,保存退出。 //跳过ssh首次连接提示验证部分 , False表示跳过 |
3.Ansible主机与组定义
执行语法:ansible 主机/组 -m 模块名 -a 执行的命令
#vi /etc/ansible/hosts
[host1]
192.168.223.11
192.168.223.12
#192.168.223.[11:12]
[host2]
192.168.223.13
192.168.223.14
//host1代表主机与组的名称 ,下面的IP是组内的IP。
//主机 ( IP) 较多可用[ip: ip]来表示 ,效果一样
主机可用域名 ,主机名 ,IP三种格式代表
[cloud]
123.57.23.14
ansible host2 -m command -a date #//对host2主机组的主机执行date命令 ,验证节点已添加
“msg”: “Failed to connect to the host via ssh: Permission denied (publickey,gssapi- keyex,gssapi-with-mic,password).”,
显示此报错 ,是因为无法远程 ,没有相应的密码登录 ,加入“ -k”选项 ,输入密码后 ,系统会自己保存 ,下次远程就 不需要“ -k”选项了。注意: 同一个主机变量组内的所有主机 ,密码必须一致。
#ansible host2 -m command -a date -k //-k选项为验证远程主机密码 ,在下面输入远程主机密码即可。
SSH password:
192.168.223.13 | CHANGED | rc=0 >> Sat Jun 6 21:16:10 CST 2020
192.168.223.14 | CHANGED | rc=0 >> Sat Jun 6 21:16:02 CST 2020
此状态显示为此成功 ,远程主机的密码符保存在/root/.ssh/know_hosts文件中 ,若有设备显示无法成功。
#vi /etc/ansible/hosts
[group:children]
host1
host2
//“:children” 这个关键字为组变量 ,可将多个组组合起来 ,使 #其同步 ,远程操作时候改为group,其下的两个组内的主机都将执 #行指定命令
[gourp:vars] #变量指定group中host1和host2两个组下的所有主机远程密码。
ansible_ssh_pass= ‘haihao ‘ #指定后执行不需要输入密码也可以了。
# ansible group -m command -a date
192.168.223.11 | CHANGED | rc=0 >> Sat Jun 6 22:47:50 CST 2020
192.168.223.14 | CHANGED | rc=0 >> Sat Jun 6 22:47:27 CST 2020
192.168.223.12 | CHANGED | rc=0 >> Sat Jun 6 22:47:43 CST 2020
192.168.223.13 | CHANGED | rc=0 >> Sat Jun 6 22:47:36 CST 2020
| 常用主机变量: | |
|---|---|
| ansible_ssh_host | #用于指定被管理的主机的真实IP |
| ansible_ssh_port | #用于指定连接到被管理主机的ssh端口号 ,默认是22 |
| ansible_ssh_user | #ssh连接时默认使用的用户名 |
| ansible_ssh_pass | #ssh连接时的密码 |
| ansible_sudo_pass | #使用sudo连接用户时的密码 |
| ansible_sudo_exec | #如果sudo命令不在默认路径 ,需要指定sudo命令路径 |
ansible_ssh_private_key_file #秘钥文件路径 ,秘钥文件如果不想使用ssh-agent管理时可以使用此选项

ansibleshell_type #目标系统的shell的类型 ,默认sh
ansible_connection #SSH 连接的类型: local , ssh , paramiko,在 ansible1.2之前默认是 paramiko
,后来智能选择 ,优先使用基于ControlPersist 的ssh
ansible_python_interpreter #用来指定python解释器的路径 ,默认为/usr/bin/python 同样可以指定ruby
、perl的路径
#其他解释器路径 ,用法与ansible_python_interpreter类似 ,这里”*”可以是ruby或
perl等其它语言
#vi /etc/ansible/hosts
[group:vars] #自定义变量 ,定义servers的变量为sshd
servers=sshd
sshd_port=22
# ansible group -m command -a ‘lsof -i :{{sshd_port}} ‘ 自定义查看主机22端口的信息。 # ansible group -m command -a ‘pgrep -f {{servers}} ‘ #可以看sshd服务对应的ID号了。
192.168.223.13 | CHANGED | rc=0 >> 6997
23169
192.168.223.12 | CHANGED | rc=0 >> 7024
23900
192.168.223.11 | CHANGED | rc=0 >> 6999
23442
192.168.223.14 | CHANGED | rc=0 >> 6959
22995
ansible*_interpreter
4.配置文件ansible.cfg

目录:/etc/ansible/ansible.cfg
#inventory
#library
#module_utils
#remote_tmp
远程主机用户的/目录下创建‘ .ansible’这个目录 ,然后再创建一个tmp文件 ,ansible管理端会把相关模块的python脚 本拷贝到此文件里 ,然后远程节点根据这个pthon配置脚本文件来执行操作。
#local_tmp = ~/.ansible/tmp #管理节点的执行路径;在ansible管理端本地也会有这个一个文件,
将一些功能模块放进去 ,来执行相应的操作。
#forks = 5 #定义并发处理的进程数量 ,通俗的讲就是定义能有多少个进程同时工作,
这个需要根据主机的性能和被管理的节点数量来控制。
#轮训的间隔
#sudo使用的默认用户 ,默认是root
#是否需要用户输入sudo密码
#是否需要用户输入连接密码
#这是指定连接对端节点的管理端口 ,默认是22,除非设置了特殊的SSH端口,
#这是默认模块和系统之间通信的计算机语言 ,默认为’C’语言 . #跳过ssh首次连接提示验证部分 , False表示跳过 ,推荐去掉注释 #连接超时时间
#指定ansible默认的执行模块
#默认ansible会为输出结果加上颜色 ,用来更好的区分状态信息和失败信息 .如
#poll_interval = 15
#sudo_user = root
#ask_sudo_pass = True
#ask_pass = True
#remote_port = 22
不然这个参数一般是不需要修改的 #module_lang = C #host_key_checking = False #timeout = 10
#module_name = command
nocolor = 1
= /usr/share/my_module_utils/ #一样也是模块默认的存放路径 ,一般不要改。
= ~/.ansible/tmp #指定远程执行的路径;ansible在远程主机上操作时 ,会在对应
#表示资源清单的文件位置 ,就是Ansible管理的主机列表 #Ansible运行都需要使用模块 ,这个路径就是模块存放的路径
= /etc/ansible/hosts = /usr/share/my_modules/

果你想关闭这一功能 ,可以把’nocolor’设置为‘1’:
#private_key_file=/path/to/file.pem #在使用ssh公钥私钥登录系统时候 ,使用的密钥路径。
5.ad-hoc命令
ad-hoc是指ansible下执行一条命令 ,并且不需要保存命令。ad-hoc所有的命令都要依赖于模块 ,默认安装好的 ansible里有很多自带的模块 ,例如:command, raw,shell,file,cron等 ,可通过“ansible-hoc -l”查看 ,正常 的ad-hoc命令在使用时都用ansible来代替。例如:ansible host2 -m command -a date,这里的ansible就代 表的是ad-hoc命令。常用的ansible选项参数: -m 模块名:指定要执行的模块的名称 ,如果不指定 -m选项 ,默认是command模块。 -a 命令:指定执行模块对应的参数选项。 -k:提示输入SSH登录的密码而不是基于密钥的验证 ,小写k -K:用于输入执行su或sudo操作时需要的认证密码 ,大写K -b:表示提升权限操作。新版ansible才有的一个选项操作。 —become-method:指定提升权限的方法 ,常用的有 sudo和su,默认是sudo。 —become-user:指定执行 sudo或su命令时要切换到哪个用户下 ,默认是root用户。 -B SECONDS:后台运行超时时间 -C:测试一下会改变什么内容 ,不会真正去执行 ,主要用来测试一些可能发生的变化 -f FORKS,:设置ansible并行的任务数。默认值是5 -i INVENTORY: 指定主机清单文件的路径 ,默认为/etc/ansible/hosts。。 -h :查看帮助 ,关于ad-hoc的一些选项的详细参数 执行格式: # ansible 主机或组 -m 模块名 -a ‘模块参数’ ansible参数 主机和组:是在/etc/ansible/hosts 里进行指定的部分 ,这里可以用主机名/IP/域名/all,当然动态Inventory 使用的是脚本从外部应用里获取的主机。 模块名:可以通过ansible-doc -l 查看目前安装的模块 ,默认不指定时 ,使用的是command模块 ,具体可以查 看/etc/ansible/ansible.cfg 的“#module_name = command ” 部分 ,默认模块可以在该配置文件中进行修改; 模块参数:可以通过 “ansible-doc 模块名” 查看具体的用法及后面的参数; ansible参数:可以通过ansible命令的帮忙信息里查看到 ,这里有很多参数可以供选择 ,如是否需要输入密码、是 否sudo等。 |
|---|
6.Command模块

command模块包含如下选项:
creates:后跟文件名 ,文件名后再跟命令。当该文件存在 ,则该命令不执行 ,反正 ,则执行。一般用于检测服务有没有 开启。
free_form:要执行的linux指令
chdir:在执行指令之前 ,先切换到该指定的目录
removes:后跟文件名 ,文件名后再跟命令 ,当该文件存在时 ,则该选项执行 ,反之 ,不执行。
注意:command模块的执行 ,在远程主机上 ,需要有python环境的支持。
该模块通过 -a跟上要执行的命令可以直接执行 ,不过命令里如果有带有特殊字符 ( “<“ , “>” , “ |” , “&”等) 那么则 执行不成功。
举例:
①chdir举例
# ansible host1 -m command -a ‘chdir=/tmp pwd ‘

192.168.223.11
/tmp
192.168.223.12
/tmp
注释:chdir先切换进了/tmp目录 ,后执行pwd命令 ,所以返回结果为/tmp。
②creates与removes举例
# ansible 192.168.223.12 -a ‘creates=/tmp/text date ‘ //查看text这个文件是否存在。不存在就执行date
192.168.223.12 | CHANGED | rc=0 >>
Wed Jun 10 01:59:37 CST 2020
# ansible 192.168.223.12 -a ‘touch /tmp/text ‘ //远程在/tmp目录下创建一个text文件测试。
192.168.223.12 | CHANGED | rc=0 >>
# ansible 192.168.223.12 -a ‘creates=/tmp/text date ‘ //当文件存在时 ,不执行date命令。
192.168.223.12 | SUCCESS | rc=0 >>
skipped, since /tmp/text exists //跳过 ,原因是/tmp/text文件存在。
注释:creates后跟文件名 ,文件名后跟命令 ,若文件存在就不执行后面的命令 ,若不存在就执行。
# ansible 192.168.223.12 -a ‘removes=/tmp/text date ‘
192.168.223.12 | CHANGED | rc=0 >>
Wed Jun 10 02:08:24 CST 2020
注释: removes则正好是creates相反。
rc=0 >>
rc=0 >>
CHANGED
CHANGED
|
|
|
|
7.管理端root用户在节点的普通用户下创建文件。
| 原理:ansible的管理端是root,想要在被管理端的普通用户下实现一些创建文件的需求。 管理端: #vi /etc/ansible/hosts 192.168.223.12 ansible_ssh_user=www ansible_ssh_passwd=wwwpasswd #ansible 192.16.223.12 -m command -a ‘toch file ‘ 客户端: ls -al /home/www drwx———. 3 www www 17 Jun 10 03:27 .ansible -rw-rw-r—. 1 www www 0 Jun 10 03:28 file 注释:当ansible管理端在远程节点进行操作时 ,会在远程主机节点下产生一个’.ansible/tmp’的文件 ,文件下回有对 应的模块的python文件 ,来执行管理端所在远程节点进行的操作。 |
|---|
8.远程主机批量提高权限

原理:
# vi /etc/ansible/hosts //此内容定义登录远程节点的用户名为www,密码为wwwpasswd,
[host1]
192.168.223.12 ansible_ssh_user=www ansible_ssh_pass=wwwpasswd
管理端:节点主机/mnt属主属组都为root,所以ansible管理端以www普通用户远程操作时候 ,是权限被拒绝的。例如
# ansible 192.168.223.12 -m command -a ‘touch /mnt/linux1.txt ‘
192.168.223.12 | FAILED | rc=1 >>
touch: cannot touch ‘/mnt/linux1.text’ : Permission deniednon-zero return code
//权限拒绝 ,这是因为ansible管理端访问223.12的节点用的是www用户 ,所以要在root下的/mnt目录下创建文件是权 限不够的 ,所以要提高权限 ,使用sudo或者su。
查看提高权限的方法:
#ansible -h /找到 -b选项 ,代表become参数 ,同页的 —become-method下有着提高权限的种类。
—become-method BECOME_METHOD
privilege escalation method to use (default=sudo), useansible-doc -t become -l to list valid choices.
-K, —ask-become-pass
ask for privilege escalation password
ansile-doc -t become -l
ksu Kerberos substitute user
pbrun PowerBroker run
enable Switch to elevated permissions on a network device
sesu CA Privileged Access Manager
pmrun Privilege Manager run
runas Run As user
sudo Substitute User DO
su Substitute User
doas Do As user
pfexec profile based execution
machinectl Systemd ‘s machinectl privilege escalation
dzdo Centrify ‘s Direct Authorize
以上就是可以提高权限的参数 ,常用为sudo和su。
举例: su
# ansible 192.168.223.12 -b —become-method=su -m command -a ‘touch /mnt/linux1.txt ‘ -K
BECOME password: //因为是su,所以要输入节点的root用户密码。 192.168.223.12 | CHANGED | rc=0 >> -b代表提升权限 , —become-method后代表提升权限为su, -K表示提升所属权限的密码。 远程节点验证: [root@12 ~]# ll /mnt/linux1.txt -rw-rw-r—. 1 root root 0 Jun 11 07:36 /mnt/linux1.txt //表示使用的是root权限创建的文件。
举例: sudo
# ansible 192.168.223.12 -b —become-method=sudo -m command -a ‘touch /mnt/linux2.txt ‘ -K
若报错显示共享关闭 ,不在sudoers文件中 ,这说明远程节点的普通用户一开始就没被授予sudo权限 切入远程节点端:
节点端:
# vi /etc/sudoers //最后一行添加
www ALL=(root) All
若不想让使用sudo时候输入密码 ,最后的ALL改为 NOPASSWD: ALL 然后就不用再加 -K选项就可直接操作了。
管理端:继续测试
# ansible 192.168.223.12 -b —become-method=sudo -m command -a ‘touch /mnt/linux2.txt ‘ -K
192.168.223.12 | CHANGED | rc=0 >>
节点端:
[root@12 ~]# ll /mnt/linux2.txt
-rw-r—r—. 1 root root 0 Jun 11 07:52 /mnt/linux2.txt
表明成功。
| Shell模块和command模块用法一致 ,不过shell模块执行命令时候使用的是/bin/sh,所以可以使用任何命令 command模块:无法在远端执行命令的参数中加入、 |、等特殊符号, shell模块: 专用于在远端执行命令的参数中使用特殊符号。 例如: # ansible 192.168.223.12 -m shell -a “ps -ef |grep sshd “ //查看sshd服务进程 # ansible 192.168.223.12 -m shell -a “ls -al /tmp/“ //查看远程节点的/tmp下的所有文件 若出现报错 ,注意登录远程主机节点的用户权限是否足够查看 |
|---|
| Raw模块:功能类似于command和shell所能完成的操作 , raw也能完成 , 区别在于 , raw不需要远程主机上有python环境 #因为ansible要执行自动化操作 ,需要管理机上有ansible,节点上需要有python环境 ,如果节点没有python没有 python环境 ,或者python环境低于python2.4,那么command和shell模块无法运行 ,所以此时可以用raw模块直接执 行 ,也可以用raw模块来安装python、python-simplejson等。 装不了python环境的设备 (交换机 ,路由器) ,可以直接用raw模块操作。 raw与command模块和shell模块相比较 ,少了一些参数 ,例如:chdir,creates, removes参数。在raw模块中是不生 效的。 |
|---|
10、script模块,脚本拷贝
| script:是将管理端的shell脚本拷贝到被管理的远程主机上执行 ,其原理是先将shell复制到远程主机 ,再在远程主机 上执行 ,此模块的执行 ,也不需要远程主机上的python环境。 例: 管理端: # more /tmp/install.sh //这是ansible管理端的一个脚本文件 ,安装httpd并启动。 #!/bin/bash yum -y install httpd systemctl start httpd #chmod 755 /tmp/install.sh //要给执行权限 ,不然在客户端会报错。 # ansible 123.57.23.14 -m script -a ‘/tmp/install.sh > /mnt/install.log ‘ 123.57.23.14 | CHANGED => { :脚本/tmp/install1.sh在管理端本机上 ,script 模块执行的时候将脚本传送到远程的172.16.213.233主机中 ,然 后执行这个脚本 ,同时 ,将执行的输出日志文件保存在远程主机对应的路径/tmp/install.log下 ,这里保存日志文件的 时候 ,最好用全路径 客户端查看: # tail /mnt/install.log 发现httpd已经安装并启动就算完成 |
|---|
11、 Ping模块
| ping:用于测试管理端与节点端的连通性 ,没有多余参数。 #ansible 123.57.23.14 -m ping 123.57.23.14 | SUCCESS => { |
|---|
| file模块主要用于远程主机上的文件操作 ,file模块包含如下选项: force:需要在两种情况下强制创建软链接 ,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在 , 需要先取消之前的软链 ,然后创建新的软链 ,有两个选项:yes|no group:定义文件/目录的属组 mode:定义文件/目录的权限 owner:定义文件/目录的属主 path:必选项 ,定义文件/目录的路径 recurse:递归的设置文件的属性 ,只对目录有效 ,确定是递归的话就yes。 src:要被链接的源文件的路径 ,只应用于state=link的情况 dest:被链接到的目标路径 ,只应用于state=link的情况 state: 有如下几个选项: directory:表示目录 ,如果目录不存在 ,则创建目录。 link:创建软链接 hard:创建硬链接 touch:如果文件不存在 ,则会创建一个新的文件 ,如果文件或目录已存在 ,则更新其最后修改时间 absent:删除目录、文件或者取消链接文件。 举例: 1、创建目录或者文件 # ansible 192.168.223.12 -m file -a “path=/mnt/MuLu state=directory” 192.168.223.12 | CHANGED => { //创建成功这个目录 注释: -m表示指定模块为file模块 , -a表示后面跟参数 ,path定义对端创建目录的路径以及名称 ,state主要是用于定 义path路径是目录还是文件。如果是创建文件 ,就写成state=touch。 #在远程端测试 ,发现/mnt下已经有MuLu这个目录了。 # ansible 192.168.223.12 -m file -a “path=/mnt/file.txt state=touch” 192.168.223.12 | CHANGED => { //创建成功这个文件 2、给已有目录/文件、修改属主 ,属组 ,权限, # ansible 192.168.223.12 -m file -a “path=/mnt/MuLu owner=nobody group=nobody mode=0644 recurse=yes” 注释:path指定要修改的目录 ,owner指定属主 ,group指定属组 ,mode后跟权限位 , recurse表示递归此目录下的所有 文件的属主属组。如果是修改文件的权限 ,最后去掉recurse选项 ,因为此选项只针对于目录文件。 3、给已有文件创建软连接。 # ansible 192.168.223.12 -m file -a “src=/etc/ssh/sshd_config dest=/mnt/ssh owner=sshd state=link” 注释: src代表着指定的源文件路径 ,dest代表着源文件路径要被指定到哪 ,owner代表着设置此文件的属主 ,state表 示此链接为软连接。软连接为link,硬链接为hard。 4、删除目录、文件、软连接 # ansible 192.168.223.12 -m file -a “path=/mnt/file.txt state=absent” # ansible 192.168.223.12 -m file -a “path=/mnt/sshd_config state=absent” file为远端主机文件 ,sshd_config为远端主机软链接 |
|---|
| copy模块主要用于复制文件到远程主机。 backup:在覆盖之前将原文件备份 ,备份文件包含时间信息。有两个选项:yes|no content:用于替代”src” ,可以直接设定指定文件的值 dest:必选项。要将源文件复制到的远程主机的绝对路径 ,如果源文件是一个目录 ,那么该路径也必须是个目录 directory_mode:递归的设定目录的权限 ,默认为系统默认权限 force:如果目标主机包含该文件 ,但内容不同 ,如果设置为yes,则强制覆盖 ,如果为no,则只有当目标主机的目标位 置不存在该文件时 ,才复制。默认为yes others:所有的file模块里的选项都可以在这里使用 src:要复制到远程主机的文件在本地的地址 ,可以是绝对路径 ,也可以是相对路径。如果路径是一个目录 ,它将递归复 制。在这种情况下 ,如果路径使用”/”来结尾 ,则只复制目录里的内容 ,如果没有使用”/”来结尾 ,则包含目录在内的整 个内容全部复制 ,类似于rsync。 举例: 1、将文件复制到远程主机, # ansible 192.168.223.12 -m copy -a “src=/etc/sudoers dest=/mnt/sudoers owner=root group=root mode=644 backup=yes” 注释: src是在ansible管理端的本地文件 ,dest后跟的是远程复制过来的文件路径 ,backup是如果这已经有一样的文件 名称了 ,那么复制过来之前 ,先把这个文件做备份 ,然后再复制到本地。 # ansible 192.168.223.12 -m copy -a “src=/etc/sudoers dest=/mnt/sudoers validate= ‘visudo -cf %s ‘“ 注释:验证文件是否远程备份过去有没有误差 , ‘visudo -cf %s ‘ 。这个语法可以检测。 2、将目录复制到远程主机 # ansible 192.168.223.12 -m copy -a “src=/etc/yum dest=/mnt owner=root group=root directory_mode=644” # ansible 192.168.223.12 -m copy -a “src=/etc/yum/ dest=/mnt/abc owner=root group=root directory_mode=644” 注释:复制目录与文件差别 ,复制文件是将本地文件复制到了指定远程主机的文件配置里 ,复制目录是直接将父目录的 名称以及所包含的子目录所有内容都复制过去。directory_mode是指将该目录以及该目录下的所有文件权限递归都修 改。 两条命令都是复制目录到远程主机 , 区别在于src指定的路径跟不跟“/” ,第一条命令不加“/” ,表示yum这个目 录下的所有内容包含yum目录都copy过去。在对端mnt下可直接看到yum这个目录。 而src后指定路径跟“/” ,表示只拷 贝过去yum目录下的内容 ,而不包含yum目录本身。在对端abc这个文件下就有了管理端yum目录下的所有文件 ,但是不包 含yum。 |
|---|
14、Service模块

用于管理远程主机上的服务 ,centos上要注意是否包含service操作 ,例如centos6和centos7都可以使用“service httpd start”参数来启动服务 ,必须支持service才能使用service模块。
该模块包含如下选项:
enabled:是否开机启动 yes|no
name:必选项 ,服务名称
pattern:定义一个模式 ,如果通过status指令来查看服务的状态时 ,没有响应 ,就会通过ps指令在进程中根据该模式 进行查找 ,如果匹配到 ,则认为该服务依然在运行
sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟
state:对当前服务执行启动 ,停止、重启、重新加载等操作 (started,stopped,restarted,reloaded)
举例:

1、远程重启服务
# ansible cloud -m service -a “name=httpd state=restarted”
123.57.23.14 | CHANGED => {
在客户端上使用“ps -ef”可以查看httpd的状态 ,发现进程ID有变 ,说明httpd重启成功了。
2、远程关闭服务
# ansible cloud -m service -a “name=httpd state=stopped”
在客户端上使用“ps -ef | grep httpd”发现没有此进程ID 就表示此服务关闭了
3、远程开启服务
# ansible cloud -m service -a “name=httpd state=started”
在客户端上“systemctl status httpd”就可以查看。
4、远程开机自启服务
# ansible cloud -m service -a “name=httpd enabled=yes” yes为开 ,no为关
在客户端上直接查看即可 ,“systemctl status httpd ”
centos6查看服务是否开机自启 ,可用“chkconfig —list httpd”查看,
centos7查看服务可在配置文件下查看“/etc/systemd/system/multi-user.target.wants/”
15、cron模块
用于管理计划任务 ,包含以下选项:
backup:对远程主机上的原任务计划内容修改之前做备份
cron_file:用来指定一个计划任务文件 ,也就是将计划任务写到远程主机上/etc/cron.d目录下 ,创建一个文件对应的 计划任务。
day: 日 ( 1-31,,/2,……)
hour:小时 ( 0-23,,/2,……)
minute:分钟 ( 0-59,,/2,……)
month:月 ( 1-12,,/2,……)
weekday:周 ( 0-7,*,……)
job:要执行的任务 ,依赖于state=present
name:定义定时任务的描述信息
special_time: 特殊的时间范围 ,参数: reboot (重启时) ,annually (每年) ,monthly (每月) ,weekly (每 周) ,daily (每天) ,hourly (每小时)
state:确认该任务计划是创建还是删除 ,有两个值可选 ,分别是present和absent,present表示创建定时任务, absent表示删除定时任务 ,默认为present。
user:以哪个用户的身份执行job指定的任务。
举例:
1、定时更新/安装
# ansible 123.57.23.14 -m cron -a ‘name=”yum autoupdate” weekday=”5” minute=”20” hour=”1” user=root job=”yum -y install update” ‘
注释:在123.57.23.14这个IP上 ,计划任务名为:yum autoupdate ,每周五的1点20分 ,以root用户的权限 ,进行更 新 ,就是安装update。
2、定时备份。
# ansible 123.57.23.14 -m cron -a ‘backup=”true” name=”autobackup” weekday=”6” minute=”30” hour=”1” user=”root” job=”/home/backup.sh” ‘
注释:true表示确定备份 ,name为计划任务的名称 ,weekday代表周六 ,minute代表30分 ,hour代表1点 ,user表示执 行的用户权限是root,job是备份此数据要执行的脚本。
含义为:在周6的1点30分对123.57.23.14这台主机使用root用户进行备份 ,调用的是/home/backup.sh脚本
3、指定任务计划文件的存放位置
# ansible 123.57.23.14 -m cron -a ‘name=”cronfile” minute=30 hour=1 user=”root”

job=”/home/cronfile.sh” cron_file=”cronfilename” ‘
注释:在1点30分以root用户权限运行/home/cronfile.sh这个脚本,任务计划写在cronfilename这个文件中。
以cron_file指定的文件都会放在/etc/cron.d下面 ,文件里面写的任务计划 ,也是可以正常执行的。
4、删除任务计划
# ansible 123.57.23.14 -m cron -a ‘name=”yum autoupdate” state=”absent” user=”root” ‘
注释:删除掉123.57.23.14主机上的“yum autoupdate”这个任务计划
5、在特定的时候执行相应的操作
# ansible 123.57.23.14 -m cron -a ‘name=”job reboot” special_time=reboot job=”/date/service.sh” ‘
注释:在重启时运行/date、 service.sh这个脚本。
16、yum模块
| 使用yum包管理器来管理软件包 ,其选项有: config_file:yum的配置文件 ,如果yum的配置文件不再默认路径下 ,就需要指定一下 disable_gpg_check:关闭gpg_check,关闭后 ,一些yum中的不信任软件也可以直接装上。 disablerepo:不启用某个源 ,以防某些源冲突。 enablerepo:启用某个源 name:要进行操作的软件包的名字 ,也可以传递一个url或者一个本地的rpm包的路径 state:表示要安装还是删除软件包 ,要安装软件包 ,可选择present (安装) 、installed (安装) 、 latest (安装 最新版本) ,删除软件包可选择absent、 removed。 举例: 1、安装软件 # ansible 123.57.23.14 -m yum -a “name=redis state=installed “ 注释:name为安装软件的名称 ,state后是需要执行的状态 ,是安装还是删除。 若安装不成功显示没有安装包 ,看看客户端本地源是否为开启的 (enabled=? 1代表开启) ,若未开启 ,可以加上 参数“enablerepo=epel” 指定源来操作安装 ,即为: # ansible 123.57.23.14 -m yum -a “name=redis state=installed enablerepo=epel” 安装完成后 ,在客户端“rpm -qa | grep redis” ,查看是否安装。 “name”后不只是可以跟软件包的名称 ,还可以直接跟源路径。 2、删除软件 # ansible 123.57.23.14 -m yum -a “name=redis state=removed” 注释:name为软件包的名字 , removed表示删除。 |
|---|
17、 user模块

user模块是请求的是useradd, userdel, usermod三个指令 ,goup模块请求的是groupadd, groupdel, groupmod 三个指令。
# 指定用户名
# 指定用户的主组
# 指定附加组 ,如果指定为( ‘groups= ‘)表示删除所有组。
# 指定默认shell
#设置帐号状态 ,不指定为默认为present,表示创建 ,指定值为absent表示删除 #当使用状态为state=absent时使用 ,类似于userdel —remove选项。
举例:
1、创建用户
# ansible 123.57.23.14 -m user -a “name= ‘usertest1 ‘“
name group groups shell state remove

注释:创建一个用户 ,用户名是usertest1,在客户端 “id usertest1” ,可以看到用户的uid等信息
2、给用户指定附加组
# ansible 123.57.23.14 -m user -a “name=usertest2 groups=fushu1,fushu2”
注释:添加两个附属组 ,以逗号为间隔 ,但是必须保证客户端有这两个附属组的组名才可以。
3、删除用户
# ansible 123.57.23.14 -m user -a “name=usertest2 state=absent remove=yes”
注释: “state=absent”表示删除这个用户 , “remove=yes”表示同时删除用户的家目录 ,若不家此参数 ,只会删除用 户 ,不会删除用户的家目录
4、批量修改密码
# echo “haihao” | openssl passwd -1 -salt $(< /dev/urandom tr -dc ‘[:alnum:] ‘ | head -c 32) - stdin
$1$qMtHf7t4$eQs/8MlYzEMRiCvDsLLnI/
# ansible 123.57.23.14 -m user -a ‘name=usertest1 password=”$1$qMtHf7t4$eQs/8MlYzEMRiCvDsLLnI/“ ‘
注释:“ -1”是数字1,表示采用的是MD5加密算法 ,“ -salt”指的是salt值 ,在加密时即使密码一样 ,salt不一样 ,所计 算出来的hash值也不一样 ,除非密码和salt值一样 ,计算出来的才能一样。
‘< /dev/urandom tr -dc ‘[:alnum:] ‘ | head -c 32’ ,这是一个变量 ,主要就是来生成字符串。 password后面批量改密码只能是密文 ,不能是明文 ,所有的密文都在/etc/shadow文件中。
# ssh -l usertest1 123.57.23.14
注释:测试密码设置是否完成
18、synchronize模块
| 此模块通过调用rsync进行文件或目录同步。 archive:归档 ,相当于同时开启recursive(递归),links,perms,itmes,owner,group,-D选项都为yes,默认该选项 为开启 checksum:跳过检测sum值 ,默认关闭 compress:是不开启压缩 ,默认开启 copy_links:复制链接文件 ,默认为no,注意后面还有一个links参数 delete:删除不存在的文件 ,默认为no dest:目录路径 dest_prot:默认为22,ssh协议 mode:push和pull模块 ,push模块的话 ,一般用于从本机向远程主机上传文件 ,pull模式用于从远程主机上拉取文件 举例: 1、将本地文件目录同步到客户端目录下 # ansible 123.57.23.14 -m synchronize -a ‘src=/mulu dest=/aaa ‘ 注释:/mulu是管理端本地的目录文件 ,/aaa是远程节点端的路径 ,就是将本地的mulu同步到远程节点的aaa下。 2、将远程主机的目录拉取过来同步到本地主机 # ansible 123.57.23.14 -m synchronize -a ‘mode=pull src=/aaa dest=/mulu ‘ 注释:mode模式为pull表示从远程节点拉取到本地 ,在这里源目录aaa就是远程节点的目录 , 目的目录mulu就是本地管 理端的目录 |
|---|
19、Setup模块

setup模块 ,主要用于获取主机信息 ,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。 setup模 块下经常使用的一个参数是filter参数 ,具体使用示例如下 (由于输出结果较多 ,这里只列命令不写结果) :

举例:
1、查看节点设备的内存信息。
# ansible 123.57.23.14 -m setup -a “filter=ansible_*_mb”
123.57.23.14 | SUCCESS => { “ansible_facts”: {
“ansible_memfree_mb”: 1228, //表示内存剩余空间大小
“ansible_memory_mb”: {
“nocache”: {
| “free”: 1691, “used”: 148 }, “real”: { “free”: 1228, “total”: 1839, “used”: 611 “ansible_memtotal_mb”: 1839, “ansible_swapfree_mb”: 0, “ansible_swaptotal_mb”: 0, |
//nocache (没有缓存的) 内存剩余大小为1691,used表示已经使用的 // free为剩余空间大小 ,total表示内存所有容量 ,used为已经使用 //表示内存总的大小, //swap内存的剩余大小 //swap内存的总大小 |
|---|---|
2、查看节点的所有信息 (内存 ,cpu,系统 ,bios等)
# ansible 123.57.23.14 -m setup
注释:此命令没有后面的命令参数 ,可直接查看设备的所有信息,
3、查看网卡的详细信息
# ansible 123.57.23.14 -m setup -a “filter=ansible_eth0”
注释:查看网卡为eth0的信息 ,包含了网卡的所有信息 ,包括mac地址等。
同时多个网卡em1和em2可以用“filter=ansible_em[1-2]”表示,
4、将所有主机的信息输出到指定的文件夹中
# ansible all -m setup —tree /tmp/facts
注释:将所有主机的信息 ,都输出到/tmp/facts这个目录下 ,对应的主机信息就是主机名称
20、get_url模块
| 该模块主要用于在http,ftp,https 服务器上下载文件 ,类似于 (wget) , sha256sum:下载完成后进行sha256 check; timeout:下载超时时间 ,默认10s url:下载的URL url_password、url_username:主要用于需要用户名密码进行验证的情况 use_proxy:表示使用代理 ,代理需事先在环境变更中定义 举例: 1、在阿里云下载repo文件 # ansible 123.57.23.14 -m get_url -a “url=https://mirrors.aliyun.com/repo/Centos-7.repo dest=/mnt/Centos-7.repo” 注释:在阿里云官网下载repo文件到123.57.23.14这个节点上,下载到/mnt下的Centos-7.repo里 ,下载的文件就在 节点的文件名里。 在主节点的下载的时候 ,会在客户端的/tmp下生成一个目录 ,这个目录里就是所下载的文件信息。下载完成后 ,这个文 件会自动删除。 |
|---|
1.playbook简介
| #简介: playbook:即是剧本的意思 ,类似于拍电视演员要跟着剧本走 ,在ansible中 ,计算机按照playbook走 , 由计算机进行 安装 ,配置 ,部署 ,提供各类服务 ,以及组织计算机处理各类事情。 #使用playbook的原因: 执行一些简单的任务 ,使用ad-hoc命令可以方便的解决问题 ,但是有时一个设施过于复杂 ,需要大量的操作时候 ,执行 的ad-hoc命令是不适合的 ,这时最好使用playbook,就像执行shell命令与写shell脚本一样 ,也可以理解为批处理任 务 ,不过playbook有自己的语法格式。 #playbook文件格式 playbook文件由YAML语言编写。 YAML是一个类似 XML、 JSON的标记性语言 ,YAML强调以数据为中心 ,并不是以标识语 言为重点。因而YAML本身的定义比较简单 ,号称“一种人性化的数据格式语言”。首先学习了解一下YAML的格式 ,对后面 书写playbook很有帮助。以下为playbook常用到的YAML格式。 大小写敏感 使用空格作为嵌套缩进工具 ,缩进时不允许使用Tab键 缩进的空格数目不重要 ,只要相同层级的元素左侧对齐即可 使用“ -” (横线) + 单个空格:表示单个列表项 使用 “ :” (冒号) + 空格:表示单个键值对 使用”{}”表示一个键值表 playbook文件是通过ansible-playbook命令进行解析的 ,ansbile-playbook命令会根据自上而下的顺序依次执 行playbook文件中的内容。 同时 ,playbook开创了很多特性 ,它可以允许传输某个命令的状态到后面的指令 ,它也可以从 一台机器的文件中抓取内容并附为变量 ,然后在另一台机器中使用 ,这使得playbook可以实现一些复杂的部署机制 ,这是 ansible命令无法实现的。 #playbook的构成 playbook是由一个或多个“play”组成的列表。play的主要功能在于 ,将事先合并为一组的主机装扮成事先通过 ansible定义好的角色。将多个play组织在一个playbook中就可以让它们联同起来按事先编排的机制完成一系列复杂的 任务。 其主要有以下四部分构成 |
||
|---|---|---|
| target部分: variable部分: task部分: handler部分: | 定义将要执行 playbook 的远程主机组 定义playbook运行时需要使用的变量 定义将要在远程主机上执行的任务列表 定义task 执行完成以后需要调用的任务 |
|
| 而其对应的目录层为五个(视情况可变化),分别为: | ||
| vars tasks | 变量层 任务层 |
|
| handlers 触发条件 files 文件 template 模板 |
2.Playbook语法详解
1、Hosts和Users (属于target部分)
playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。
hosts:用于指定要执行指定任务的主机 ,每个playbook都必须指定hosts,hosts也可以使用通配符格式。主机或主机 组在inventory清单中指定 ,可以使用系统默认的/etc/ansible/hosts,也可以自己编辑 ,在运行的时候加上 -i选项, 可指定自定义主机清单的位置。在运行清单文件的时候 , —list-hosts选项会显示那些主机将会参与执行任务的过程 中。
remote_user:用于指定在远程主机上执行任务的用户。可以指定任意用户 ,也可以使用sudo,但是用户必须要有执行

相应任务的权限。
2、任务列表 (tasks list)
play的主体部分是task list。
task list中的各任务按次序逐个在hosts中指定的所有主机上执行 ,即在所有主机上完成第一个任务后再开始第二个。 在运行自上而下某playbook时 ,如果中途发生错误 ,则所有已执行任务都将回滚 ,因此在更正playbook后需要重新执行 一次。
task的目的是使用指定的参数执行模块 ,而在模块参数中可以使用变量。模块执行是幂等的 (幂等性; 即一个命令 ,即 使执行一次或多次 , 其结果也一样) ,这意味着多次执行是安全的 ,因为其结果均一致。tasks包含name和要执行的模 块 ,name是可选的 ,只是为了便于用户阅读 ,建议加上去 ,模块是必须的 ,同时也要给予模块相应的参数。
定义tasks推荐使用module: options”的格式 ,例如:
service: name=httpd state=running
3、handlers
用于当关注的资源发生变化时采取一定的操作。handlers是和“notify”配合使用的。
“notify”这个动作可用于在每个play的最后被触发 ,这样可以避免多次有改变发生时 ,每次都执行指定的操作 ,通 过“notify” ,仅在所有的变化发生完成后一次性地执行指定操作。
在notify中列出的操作称为handler,也就是说notify用来调用handler中定义的操作。
注意:在 notify中定义的内容一定要和handlers中定义的“ - name”内容一样 ,这样才能达到触发的效果 ,否则会不 生效。
4、tags
tags用于让用户选择运行或略过playbook中的部分代码。ansible具有幂等性 ,因此会自动跳过没有变化的部分;但是 当一个playbook任务比较多时 ,一个一个的判断每个部分是否发生了变化 ,也需要很长时间。因此 ,如果确定某些部分 没有发生变化 ,就可以通过tags跳过这些代码片断。
5、Playbook执行结果解析
使用ansible-playbook运行playbook文件 ,输出的内容为JSON格式。并且由不同颜色组成 ,便于识别。一般而言 ,输 出内容中:
绿色代表执行成功 ,但系统保持原样
黄色代表系统状态发生改变 ,也就是执行的操作生效
红色代表执行失败 ,会显示错误信息。
3.Playbook简单实例

1、在远程主机上创建用户:
# vi /etc/ansible/playbook.yml
- name: create user hosts: 123.57.23.14 user: root gather_facts: false vars:
- user1: “playbookuser” tasks:
- name: createuser
user: name=”{{ user1 }}”
# ansible-playbook /etc/ansible/playbook.yml
解析:
上面的playbook 实现的功能是新增一个用户:
name参数对该playbook实现的功能做一个概述 ,后面执行过程中 ,会输出name的值;

hosts参数指定了对哪些主机进行操作。
user参数指定了使用什么用户登录到远程主机进行操作。
gather_facts参数指定了在下面任务执行前 ,是否先执行setup模块获取主机相关信息 ,这在后面的task会使用到 setup获取的信息时需要用到。
vars参数 ,指定了变量 ,这里指字一个user1变量 ,其值为testuser,需要注意的是 ,变量值一定要用引号括起来。 tasks指定了一个任务 ,其下面的name参数同样是对任务的描述 ,在执行过程中会打印出来。user是一个模块 ,user后 面的name是user模块里的一个参数 ,而增加的用户名字调用了上面user1变量的值。
4.关于facts
| facts组件是Ansible用于采集被管理机器设备信息的一个功能。可以使用setup模块查机器的所有facts信息 ,facts信 息包括远端主机发行版 ,IP地址 ,CPU核数 ,系统架构 ,主机名等等 ,可以使用filter来查看指定信息。整个facts信息 被包装在一个json格式的数据结构中。 [root@ansible playbook]# ansible 172.16.213.233 -m setup 所有数据格式都是JSON格式 ,facts还支持查看指定信息 ,如下所示: [root@ansible playbook]# ansible 172.16.213.233 -m setup -a ‘filter=ansible_all_ipv4_addresses ‘ playbook在执行的时候 ,默认的第一个tasks就是收集远端被管主机的facts信息 ,如果后面的task不会使用到setup获 取的信息时 ,可以禁止ansible收集facts,在playbook中的hosts指令下面设置“gather_facts: false”即可。默认 gather_facts的值为true。 facts经常被用在条件语句和模板当中 ,也可以用于根据指定的标准创建动态主机组。 |
|---|
5.facts举例playbook

- hosts: all remote_user: root gather_facts: True tasks:
- name: update bash in cetnos 7 version
yum: name=http://mirrors.aliyun.com/centos/7.4.1708/os/x86_64/Packages/bash-4.2.46- 28.el7.x86_64.rpm state=present
when: ansible_distribution == ‘CentOS ‘ and ansible_distribution_major_version == “7”
- name: update bash in cetnos 6 version
yum: name=http://mirrors.aliyun.com/centos/6.9/os/x86_64/Packages/bash-4.1.2- 48.el6.x86_64.rpm state=present
when: ansible_distribution == ‘CentOS ‘ and ansible_distribution_major_version == “6”
注释:hosts:all 表示的是所有主机
remote_user为root表示远程使用的是root
gather_facts为true表示的是收集远程主机的信息
task表示要开始写任务了,
name是标识 ,解释一下所要执行的任务是做什么的。
yum后这是要升级一下centos7的bash语言版本 ,但是远程主机有7版本主机也有6版本主机 ,鉴定的方法就是下 面的when,
when后的 ansible_distribution参数 ,就是gather_facts:中收集的远程主机信息的一个参数 , gather_facts其实就是setup模块 ,然后== ‘CentOS ‘ and ansible_distribution_major_version == “7”,这条 输出表示在收集的参数中确定是Centos和版本 (ansible_distribution_major_version) 为7,才执行7版本低bash 语言更新 ,如果后面的版本是6,那就执行6版本的bash语言,
总体来说就是:当系统为centos,版本是7的时候 ,就执行yum模块更新7.4版本的更新 ,如果系统为centos版本

为6,就执行6.9版本的bash语言更新。
6.playbook案例
| - hosts: 123.57.23.14 remote_user: root gather_facts: False vars: packages: httpd tasks: - name: install httpd |
//远程节点执行的主机 ,可用all //要在远程登录使用的用户名 //默认是读取节点的设备信息的 ,不需要就关闭 ,注意大小写 //设置变量 ,httpd用packages来表示 //tasks就说明下面的就是要执行的任务计划了 // “ - name”就表示这是个标签 ,让人知道这是要做什么 |
|
|---|---|---|
| yum: name={{ packages }} state=present //使用yum模块 ,安装httpd服务 ,状态为安装 - name: Configuration httpd //“ - name”还是标签 ,标志这是要配置httpd |
||
| copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf //将管理的配置复制到节点上, tags: httpd_conf //tags就是一个标签纸的意思 ,表示一下是httpd的配置 notify: //notify就是表示配置后先不重启htppd服务 ,避免麻烦 - restart httpd - name: Add CentOSUser //“ - name”还是标签的意思 |
||
| user: name={{ item }} state=present //使用user模块 ,创建用户 ,这可以提前定义变量 ,状态为安装 tags: adduser //还是标签纸的意思 with_items: //带上with对上面user模块的item变量做出解释 ,这个变量可同 - www 时创建多个用户 ,www和qqq与eee就能一起创建。 - qqq - eee - name: start httpd //标签 ,下面用sevice模块对httpd服务进行开启 ,并设置开机自启 service: name=httpd state=started enabled=yes tags: start httpd |
||
| handlers: - name: restart httpd |
// handlers作用就是完成tasks任务后所要触发的东西。在此就 是在tasks任务完成后开始执行服务重启的操作 | |
| service: name=httpd state=restarted tags: restart httpd 注释:因为上面的notify表示了不配置一步重启一下 ,所以在完成所有的tasks任务后 ,用handlers对服务统一进行重 启确保正常。 |
