ansible
0、介绍
默认使用SSH协议对设备进行管理, 在主控端部署Ansible环境, 无需在客户端安装agent, 基于Python开发的实现批量系统配置、程序部署、运行命令等功能的自动化运维工具
1、安装 192.168.1.155安装ansible
EPEL源:yum -y install epel-release yum install -y ansible
配置文件 (/etc/ansible/roles #存放角色的目录)
(base) [root@hdp1 ~]# rpm -qc ansible /etc/ansible/ansible.cfg /etc/ansible/hosts
2、配置主机清单 hosts , 默认 /etc/ansible/hosts ,也可以 -i 指定文件
(base) [root@hdp1 ~]# cat /etc/ansible/hosts |grep -v ^#|grep -v ^$ [hdp] 192.168.1.156 192.168.1.[157:159]
cfg配置
# 表示是否检查受控端的 SSH 密钥,默认为 True 。当 SSH 使用【账号/口令】认证的方式登录受控端时,应设置为 "False"(当注释该选项时,默认值为 "True");当 SSH 使用【非对称加密】认证的方式登录受控端应设置为 "True"。 host_key_checking = False # 表示受控端清单文件的位置。默认为 【/etc/ansible/hosts】 。 inventory = /etc/ansible/hosts # 表示远程执行临时文件目录。默认为 【~/.ansible/tmp】 。 remote_tmp = ~/.ansible/tmp # 表示本地临时文件目录。默认为 【~/.ansible/tmp】 。 local_tmp = ~/.ansible/tmp # 表示存放模块的目录,多个目录使用冒号(:)分隔。默认为 【 /usr/share/ansible】 。 library = /usr/share/ansible # 表示存放角色的目录。认为 【/etc/ansible/roles】 。 roles_path = /etc/ansible/roles # 表示受控端的并发连接数,默认为 5 。 forks = 5 # 表示 sudo 程序,默认为 sudo 。 sudo_exe = sudo # 表示使用 sudo 执行指令的用户,默认为 root 。 sudo_user = root # 表示每次执行指令时是否询问 sudo 口令,默认为 True 。 ask_sudo_pass = True # 表示是否允许提权。默认为 True 。 become=True # 表示提权指令,如:sudo、su 。 默认为 sudo。 become_method=sudo # 表示默认的提权用户。默认为 root 。 become_user=root # 表示每次执行指令时是否询问提权口令,默认为 False 。 become_ask_pass=False # 表示使用 sudo 执行指令的 Shell 环境。 executable = /bin/sh # ssh 远程登录用户名,默认为 root 。 remote_user = root # 表示每次执行指令时是否询问 ssh 口令,默认为 True 。 ask_pass = True # 表示受控端的 SSH 服务端口,默认为22。 remote_port = 22 # 表示 SSH 的连接超时时间,单位为秒,默认为 60 秒。 timeout = 60 # 表示传输模式,默认为 smart 。 transport = smart # 表示默认执行的模块,默认为 command 。 module_name = command # 表示日志文件的位置,默认不记录日志。 log_path = /var/log/ansible.log host_key_checking = False #此行注释去除,否则每次将检查主机的host_key log_path = /var/log/ansible.log #将日志文件打开,方便查看操作日志 module_name = shell #将默认的模块改为shell,command模块功能太弱
3、列出所有主机
( base ) [root@hdp1 ~]# ansible all --list-hosts
hosts (4):
192.168.1.156
192.168.1.157
192.168.1.158
192.168.1.159
模块查看
(base) [root@hdp1 ~]# ansible-doc -l |egrep -w 'yum|ping|shell|cron'|grep -v _ shell Execute shell commands on targets ping Try to connect to host, verify a usable p... yum Manages packages with the `yum' package m... cron Manage cron.d and crontab entries
4、模块 ping
(base) [root@hdp1 ~]# ansible -m ping all -o
192.168.1.158 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
192.168.1.156 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
192.168.1.157 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
192.168.1.159 | UNREACHABLE!: Failed to connect to the host via ssh: ssh: connect to host 192.168.1.159 port 22: No route to host
5、模块 shell (command 模块 先忽略)
(base) [root@hdp1 ~]# ansible -m shell -a 'cat /etc/passwd|grep zzx' hdp -o 192.168.1.158 | CHANGED | rc=0 | (stdout) zzx:x:1000:1000:centos7pure:/home/zzx:/bin/bash 192.168.1.156 | CHANGED | rc=0 | (stdout) zzx:x:1000:1000:centos7pure:/home/zzx:/bin/bash 192.168.1.157 | CHANGED | rc=0 | (stdout) zzx:x:1000:1000:centos7pure:/home/zzx:/bin/bash
通过参数
--list-hosts #查看有哪些主机组 -m MODULE_NAME #执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数 -a MODULE_ARGS #模块的参数,如果执行默认COMMAND的模块,即是命令参数,如: “date”,“pwd”等等 -o #压缩输出,尝试将所有结果在一行输出,一般针对收集工具使用 -u,–user=REMOTE_USER 指定远程执行的用户 -b --become-user=xxx_user 类似runuser ,不用验证password -k,--ask-pass #ask for SSH password。登录密码,提示输入SSH密码而不是假设基于密钥的验证
ansible 192.168.1.156 -u abc -m shell -a 'crontab -l' 需要abc的密码 需要加 -k 输入一次密码后续不用再次-k
-b参数如下:
(base) [root@hdp1 ~]# ansible 192.168.1.158 -m shell -a 'cd /tmp/;touch zzx.test' -b --become-user=zzx
192.168.1.158 | CHANGED | rc=0 >>
(base) [root@hdp1 ~]# ansible 192.168.1.158 -m shell -a 'ls -l /tmp/zzx.test' -b --become-user=zzx
192.168.1.158 | CHANGED | rc=0 >>
-rw-r--r-- 1 zzx zzx 0 Jun 11 22:09 /tmp/zzx.test
(base) [root@hdp1 ~]# ansible 192.168.1.158 -m shell -a 'ls -l /tmp/zzx.test' -u zzx
192.168.1.158 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
"unreachable": true
}
(base) [root@hdp1 ~]# ansible 192.168.1.158 -m shell -a 'ls -l /tmp/zzx.test' -u zzx -k
SSH password:
192.168.1.158 | CHANGED | rc=0 >>
-rw-r--r-- 1 zzx zzx 0 Jun 11 22:09 /tmp/zzx.test
默认不加 -m 就是command模块, 不过command模块不支持管道、特殊字符等,一般还是用shell模块比较好 比如不支持 cat /etc/host* cat /etc/hosts|grep xxx
(base) [root@hdp1 ~]# ansible all -a 'cat /etc/hostname' -o 192.168.1.158 | CHANGED | rc=0 | (stdout) hdp4 192.168.1.157 | CHANGED | rc=0 | (stdout) hdp3 192.168.1.156 | CHANGED | rc=0 | (stdout) hdp2
6、copy模块
src #被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递归复制,用法类似于"rsync"
dest #必选项,将源文件复制到的远程主机的绝对路径
(base) [root@hdp1 ~]# ansible all -m copy -a 'src=~/test.txt dest=/tmp/cp.test.txt'
192.168.1.158 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "e6dff7904004227cc55ad9a3b52122d4793f76ce",
"dest": "/tmp/cp.test.txt",
"gid": 0,
"group": "root",
"md5sum": "854b46d7345628169fe9107f6c4e6735",
"mode": "0644",
"owner": "root",
"size": 20,
"src": "/root/.ansible/tmp/ansible-tmp-1654270827.59-95240-47386337382468/source",
"state": "file",
"uid": 0
}
(base) [root@hdp1 ~]# ansible all -m shell -a 'cat /tmp/cp.*' -o
192.168.1.158 | CHANGED | rc=0 | (stdout) wjqfjqo\nhello flask
192.168.1.156 | CHANGED | rc=0 | (stdout) wjqfjqo\nhello flask
192.168.1.157 | CHANGED | rc=0 | (stdout) wjqfjqo\nhello flask
7、fetch模块 该模块用于从远程某主机获取(复制)文件到本地。
有两个选项:dest:用来存放文件的目录 src:在远程拉取的文件,并且必须是一个file,不能是目录
(base) [root@hdp1 ~]# ansible all -m fetch -a 'src=/etc/hostname dest=/tmp'
192.168.1.158 | CHANGED => {
"changed": true,
"checksum": "7cd41f5e49a7af4752ccb8dbcdc491e6d2983ee5",
"dest": "/tmp/192.168.1.158/etc/hostname",
"md5sum": "819226484589f2a5f9bfb7242d2e98b0",
"remote_checksum": "7cd41f5e49a7af4752ccb8dbcdc491e6d2983ee5",
"remote_md5sum": null
}
(base) [root@hdp1 ~]# cat /tmp/192.168.1.156/etc/hostname
hdp2
8、script 模块
(base) [root@hdp1 ~]# echo "cat /etc/hostname;echo 'scrip test'; echo \`seq -w 00 03\`" > test.sh
(base) [root@hdp1 ~]# cat test.sh
cat /etc/hostname;
echo 'scrip test';
echo `seq -w 00 03`
ansible all -m script -a '/root/test.sh' -o
192.168.1.157 | CHANGED => {"changed": true, "rc": 0, "stderr": "Shared connection to 192.168.1.157 closed.\r\n", "stderr_lines": ["Shared connection to 192.168.1.157 closed."], "stdout": "hdp3\r\nscrip test\r\n00 01 02 03\r\n", "stdout_lines": ["hdp3", "scrip test", "00 01 02 03"]}
9、cron 模块
user指定用户(需要认证指定用户 或者 加-k参数)
(base) [root@hdp1 ~]# ansible 192.168.1.156 -m cron -a 'name="date every 1 min" minute=*/1 job="/usr/bin/date >> /tmp/root.date.log &> /dev/null"' (base) [root@hdp1 ~]# ansible 192.168.1.156 -m cron -a 'user=zzx name="date every 2 min" minute=*/2 job="/usr/bin/date >> /tmp/zzx.date.log &> /dev/null"' 操作结果如下: [root@hdp2 ~]# crontab -l #Ansible: date every 1 min */1 * * * * /usr/bin/date >> /tmp/root.date.log &> /dev/null [root@hdp2 ~]# cat /var/spool/cron/zzx #Ansible: date every 2 min */2 * * * * /usr/bin/date >> /tmp/zzx.date.log &> /dev/null
参数 说明
backup 在计划任务创建前先备份 day 天 hour 小时 minute 分钟 month 月 weekday 星期 name 计划任务的名称 reboot 重启后执行 state absent:删除 job 计划任务的内容 disabled 启用和禁用
增删改
更新 name不变,job内容变化 (base) [root@hdp1 ~]# ansible 192.168.1.156 -m cron -a 'name="date every 1 min" minute=*/1 job="/usr/bin/date &>> /tmp/root.date.log "' 禁用 disabled=true (base) [root@hdp1 ~]# ansible 192.168.1.156 -m cron -a 'disabled=true name="date every 1 min" minute=*/1 job="/usr/bin/date &>> /tmp/root.date.log "' 启用 disabled=false (base) [root@hdp1 ~]# ansible 192.168.1.156 -m cron -a 'disabled=false name="date every 1 min" minute=*/1 job="/usr/bin/date &>> /tmp/root.date.log "' 删除state=absent (base) [root@hdp1 ~]# ansible 192.168.1.156 -m cron -a 'disabled=false name="date every 1 min" minute=*/1 job="/usr/bin/date &>> /tmp/root.date.log " state=absent'
state
#yum模块 state=latest #yum 安装。latest最新的包 #服务模块 state=started state=stopped state=restarted #文件模块 state=touch state=directory state=link #其他 state=absent #删除文件 取消cron 删除用户 state=present #创建文件 创建cron 创建用户
yum、service 、user 、hostname 、File等模块
10、playbook
以上只是执行当个的命令和脚本,下面演示playbook
playbook 字面意思,即剧本,现实中由演员按照剧本表演,在Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。
执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式。
以下为playbook常用到的YMAL格式:
1、文件的第一行应该以 "---" (三个连字符)开始,表明YMAL文件的开始。 2、在同一行中,#之后的内容表示注释,类似于shell,python和ruby。 3、YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。 4、同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。 5、play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以":"分隔表示,":"后面还要增加一个空格。
执行第一个playbook
(base) [root@hdp1 ~]# vi playbook.yml
---
- hosts: hdp
gather_facts: no
tasks:
- name: first task
shell: cat /etc/hostname >> /tmp/hostname ;echo "123" >> /tmp/hostname
(base) [root@hdp1 ~]# ansible-playbook -u root playbook.yml
PLAY [hdp] *************************************************************************************************
TASK [first task] ******************************************************************************************
changed: [192.168.1.157]
changed: [192.168.1.158]
changed: [192.168.1.156]
PLAY RECAP *************************************************************************************************
192.168.1.156 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.1.157 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.1.158 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@hdp2 ~]# cat /tmp/hostname
hdp2
123
gather_facts 获取被控机器的 fact 数据
其中 hosts 表示对哪些主机进行操作,
become 就是我们在命令行上用过的 -b 选项
这里我们通过 become_user: root 显式的指定把当前用户的权限提升为 root 用户权限来执行命令。
(base) [root@hdp1 ~]# cat playbook.yml
---
- hosts: 192.168.1.156
gather_facts: no
become: yes
become_user: zzx
tasks:
- name: first task
shell: rm -f /tmp/*zzx*; cat /etc/hostname > /tmp/hostname_zzx
- name: task2
shell: ls -l /tmp/*zzx*; cat /tmp/hostname_zzx
(base) [root@hdp1 ~]# ansible-playbook playbook.yml
PLAY [192.168.1.156] *******************************************************************************************************************************************************************
TASK [first task] **********************************************************************************************************************************************************************
[WARNING]: Consider using the file module with state=absent rather than running 'rm'. If you need to use command because file is insufficient you can add 'warn: false' to this
command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
changed: [192.168.1.156]
TASK [task2] ***************************************************************************************************************************************************************************
changed: [192.168.1.156]
PLAY RECAP *****************************************************************************************************************************************************************************
192.168.1.156 : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
(base) [root@hdp1 ~]# ansible 192.168.1.156 -m shell -a 'ls -lrt /tmp/*zzx*'
192.168.1.156 | CHANGED | rc=0 >>
-rw-r--r-- 1 zzx zzx 5 Jun 11 22:39 /tmp/hostname_zzx
tasks 是对任务的定义,
name 是独一无二的一个任务名(如果有多个同名的 task,只执行第一个),
接着是 task 中的module,比如 command或者shell 等模块, 注意:shell和command模块后面直接跟命令,而非key=value类的参数列表;
多任务:
tasks:
- name: first task
shell: cat /etc/hostname >> /tmp/hostname ;echo "123" >> /tmp/hostname
- name: task2
shell: cat /etc/hostname >> /tmp/hostname2 ;echo "123" >> /tmp/hostname2
handlers:任务,在特定条件下触发;接收到其它任务的通知时被触发;
(1) 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;
(2) 任务可以通过“tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用;
格式: tasks: – name: TASK_NAME module: arguments notify: HANDLER_NAME handlers: – name: HANDLER_NAME module: arguments
查语法有没有错误,没有提示即表示语法应该没有问题。
(base) [root@hdp1 ~]# ansible-playbook --syntax-check nginx.yml playbook: nginx.yml
测试运行看看,-C表示仅测试跑一边,但是不会实际操作 ansible-playbook -C nginx.yml
(base) [root@hdp1 ~]# cat test.nginx.yml
---
- hosts: 192.168.1.158
remote_user: root
roles:
tasks:
- name: install epel-release
shell: yum -y install epel-release
- name: install nginx
yum: name=nginx state=present
- name: start nginx service
service: name=nginx state=started
tags: startnginx
- name: get nginx port 1
shell: netstat -anltp|grep nginx|tee /tmp/get_nginx_port_1
tags: getPort1
- name: copy nginx.conf
copy: src=/tmp/nginx.conf dest=/etc/nginx/nginx.conf backup=yes
notify: reload
tags: reloadnginx
- name: get nginx port 2
shell: netstat -anltp|grep nginx|tee /tmp/get_nginx_port_2
tags: getPort2
handlers:
- name: reload
service: name=nginx state=reloaded
(base) [root@hdp1 ~]# ansible-playbook test.nginx.yml
PLAY [192.168.1.158] *******************************************************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************************************************
ok: [192.168.1.158]
TASK [install epel-release] ************************************************************************************************************************************************************
[WARNING]: Consider using the yum module rather than running 'yum'. If you need to use command because yum is insufficient you can add 'warn: false' to this command task or set
'command_warnings=False' in ansible.cfg to get rid of this message.
changed: [192.168.1.158]
TASK [install nginx] *******************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [start nginx service] *************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [get nginx port 1] ****************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [copy nginx.conf] *****************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [get nginx port 2] ****************************************************************************************************************************************************************
changed: [192.168.1.158]
RUNNING HANDLER [reload] ***************************************************************************************************************************************************************
changed: [192.168.1.158]
PLAY RECAP *****************************************************************************************************************************************************************************
192.168.1.158 : ok=8 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
结果
(base) [root@hdp1 ~]# ansible 192.168.1.158 -m shell -a 'cat /tmp/get_nginx_port*' 192.168.1.158 | CHANGED | rc=0 >> tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 102213/nginx: maste tcp6 0 0 :::80 :::* LISTEN 102213/nginx: maste tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 102213/nginx: maste tcp6 0 0 :::80 :::* LISTEN 102213/nginx: maste (base) [root@hdp1 ~]# ansible 192.168.1.158 -m shell -a 'netstat -anltp|grep nginx' 192.168.1.158 | CHANGED | rc=0 >> tcp 0 0 0.0.0.0:818 0.0.0.0:* LISTEN 102213/nginx: maste tcp6 0 0 :::80 :::* LISTEN 102213/nginx: maste
以上只有copy执行了(changed)才会触发handlers的reload,且是先执行 'get nginx port 2' 后再reload,不是copy完立马reload最后再 'get nginx port 2'
handle执行的顺序与notify的顺序无关,仅按照playbook中handles的任务顺序执行,如果需要执行某个tasks任务后立即执行handles任务,那么使用meta模块
1、卸载nginx
(base) [root@hdp1 ~]# ansible 192.168.1.158 -m shell -a 'yum remove nginx -y'
[WARNING]: Consider using the yum module rather than running 'yum'. If you need to use command because yum is insufficient you can add 'warn: false' to this command task or set
'command_warnings=False' in ansible.cfg to get rid of this message.
192.168.1.158 | CHANGED | rc=0 >>
Loaded plugins: fastestmirror, langpacks
Resolving Dependencies
--> Running transaction check
---> Package nginx.x86_64 1:1.20.1-9.el7 will be erased
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Removing:
nginx x86_64 1:1.20.1-9.el7 @epel 1.7 M
Transaction Summary
================================================================================
Remove 1 Package
Installed size: 1.7 M
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Erasing : 1:nginx-1.20.1-9.el7.x86_64 1/1
warning: /etc/nginx/nginx.conf saved as /etc/nginx/nginx.conf.rpmsave
Verifying : 1:nginx-1.20.1-9.el7.x86_64 1/1
Removed:
nginx.x86_64 1:1.20.1-9.el7
Complete!There are unfinished transactions remaining. You might consider running yum-complete-transaction, or "yum-complete-transaction --cleanup-only" and "yum history redo last", first to finish them. If those don't work you'll have to try removing/installing packages by hand (maybe package-cleanup can help).
2、添加 - meta: flush_handlers
(base) [root@hdp1 ~]# vi test.nginx.yml
/etc/nginx/nginx.conf
---
- hosts: 192.168.1.158
remote_user: root
roles:
tasks:
- name: install epel-release
shell: yum -y install epel-release
- name: install nginx
yum: name=nginx state=present
- name: start nginx service
service: name=nginx state=started
tags: startnginx
- name: get nginx port 1
shell: netstat -anltp|grep nginx|tee /tmp/get_nginx_port_1
tags: getPort1
- name: copy nginx.conf
copy: src=/tmp/nginx.conf dest=/etc/nginx/nginx.conf backup=yes
notify: reload
tags: reloadnginx
- meta: flush_handlers
- name: get nginx port 2
shell: netstat -anltp|grep nginx|tee /tmp/get_nginx_port_2
tags: getPort2
handlers:
- name: reload
service: name=nginx state=reloaded
3、重新运行
(base) [root@hdp1 ~]# ansible 192.168.1.158 -m shell -a 'netstat -anltp|grep nginx'
192.168.1.158 | FAILED | rc=1 >>
non-zero return code
(base) [root@hdp1 ~]# ansible-playbook test.nginx.yml
PLAY [192.168.1.158] *******************************************************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************************************************
ok: [192.168.1.158]
TASK [install epel-release] ************************************************************************************************************************************************************
[WARNING]: Consider using the yum module rather than running 'yum'. If you need to use command because yum is insufficient you can add 'warn: false' to this command task or set
'command_warnings=False' in ansible.cfg to get rid of this message.
changed: [192.168.1.158]
TASK [install nginx] *******************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [start nginx service] *************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [get nginx port 1] ****************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [copy nginx.conf] *****************************************************************************************************************************************************************
changed: [192.168.1.158]
RUNNING HANDLER [reload] ***************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [get nginx port 2] ****************************************************************************************************************************************************************
changed: [192.168.1.158]
PLAY RECAP *****************************************************************************************************************************************************************************
192.168.1.158 : ok=8 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
(base) [root@hdp1 ~]# ansible 192.168.1.158 -m shell -a 'netstat -anltp|grep nginx'
192.168.1.158 | CHANGED | rc=0 >>
tcp 0 0 0.0.0.0:818 0.0.0.0:* LISTEN 109606/nginx: maste
tcp6 0 0 :::80 :::* LISTEN 109606/nginx: maste
(base) [root@hdp1 ~]# ansible 192.168.1.158 -m shell -a 'cat /tmp/get_nginx_port*'
192.168.1.158 | CHANGED | rc=0 >>
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 109606/nginx: maste
tcp6 0 0 :::80 :::* LISTEN 109606/nginx: maste
tcp 0 0 0.0.0.0:818 0.0.0.0:* LISTEN 109606/nginx: maste
tcp6 0 0 :::80 :::* LISTEN 109606/nginx: maste
进一步验证 - meta: flush_handlers
1、
(base) [root@hdp1 ~]# cat meta.yaml
---
- hosts: 192.168.1.158
tasks:
- name: touch file 1
shell: echo "" > /tmp/1
- name: test1
shell: echo "1 shell " >> /tmp/1
notify: handlers1
tags: tagshell1
- name: test2
shell: echo "2 shell " >> /tmp/1
notify: handlers2
tags: tagshell2
- meta: flush_handlers
- name: test3
shell: echo "3 shell " >> /tmp/1
notify: handlers3
tags: tagshell3
- name: test4
shell: echo "4 shell end" >> /tmp/1
notify: handlers4
tags: tagshell4
handlers:
- name: handlers1
shell: echo "1 handlers " >> /tmp/1
- name: handlers2
shell: echo "2 handlers " >> /tmp/1
- name: handlers3
shell: echo "3 handlers " >> /tmp/1
- name: handlers4
shell: echo "4 handlers " >> /tmp/1
2、执行
(base) [root@hdp1 ~]# ansible-playbook meta.yaml
PLAY [192.168.1.158] *******************************************************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************************************************
ok: [192.168.1.158]
TASK [touch file 1] ********************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [test1] ***************************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [test2] ***************************************************************************************************************************************************************************
changed: [192.168.1.158]
RUNNING HANDLER [handlers1] ************************************************************************************************************************************************************
changed: [192.168.1.158]
RUNNING HANDLER [handlers2] ************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [test3] ***************************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [test4] ***************************************************************************************************************************************************************************
changed: [192.168.1.158]
RUNNING HANDLER [handlers3] ************************************************************************************************************************************************************
changed: [192.168.1.158]
RUNNING HANDLER [handlers4] ************************************************************************************************************************************************************
changed: [192.168.1.158]
PLAY RECAP *****************************************************************************************************************************************************************************
192.168.1.158 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3、结果
(base) [root@hdp1 ~]# ansible 192.168.1.158 -m shell -a 'cat /tmp/1'
192.168.1.158 | CHANGED | rc=0 >>
1 shell
2 shell
1 handlers
2 handlers
3 shell
4 shell end
3 handlers
4 handlers
task中如何一次性调用多个handler,使用 listen,通过把handler分组实现
1、handlers添加listen,演示触发listen 实现一个notify触发多个handler
(base) [root@hdp1 ~]# cat listen.yaml
---
- hosts: 192.168.1.158
tasks:
- name: touch file 1
shell: echo "" > /tmp/1
- name: test1
shell: echo "1 shell " >> /tmp/1
notify: handlers2
tags: tagshell1
- name: test2
shell: echo "2 shell " >> /tmp/1
notify: handler group
tags: tagshell2
- meta: flush_handlers
- name: test3
shell: echo "3 shell " >> /tmp/1
notify: handlers3
tags: tagshell3
- name: test4
shell: echo "4 shell end" >> /tmp/1
tags: tagshell4
handlers:
- name: handlers1
listen: handler group
shell: echo "1 handlers ,group" >> /tmp/1
- name: handlers2
listen: handler group
shell: echo "2 handlers ,group" >> /tmp/1
- name: handlers3
shell: echo "3 handlers " >> /tmp/1
- name: handlergrop
listen: handler group
shell: echo "handlergrop ,group" >> /tmp/1
2、执行
(base) [root@hdp1 ~]# ansible-playbook listen.yaml
PLAY [192.168.1.158] *******************************************************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************************************************
ok: [192.168.1.158]
TASK [touch file 1] ********************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [test1] ***************************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [test2] ***************************************************************************************************************************************************************************
changed: [192.168.1.158]
RUNNING HANDLER [handlers1] ************************************************************************************************************************************************************
changed: [192.168.1.158]
RUNNING HANDLER [handlers2] ************************************************************************************************************************************************************
changed: [192.168.1.158]
RUNNING HANDLER [handlergrop] **********************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [test3] ***************************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [test4] ***************************************************************************************************************************************************************************
changed: [192.168.1.158]
RUNNING HANDLER [handlers3] ************************************************************************************************************************************************************
changed: [192.168.1.158]
PLAY RECAP *****************************************************************************************************************************************************************************
192.168.1.158 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3、结果
(base) [root@hdp1 ~]# ansible 192.168.1.158 -m shell -a 'cat /tmp/1'
192.168.1.158 | CHANGED | rc=0 >>
1 shell
2 shell
1 handlers ,group
2 handlers ,group
handlergrop ,group
3 shell
4 shell end
3 handlers
多次执行 同一个notify,只会触发一次,
需要每次都触发就得每次都加 - meta: flush_handlers
1、test2也执行test1的同一个handlers1
(base) [root@hdp1 ~]# cat notify.yaml
---
- hosts: 192.168.1.158
tasks:
- name: touch file 1
shell: echo "" > /tmp/1
- name: test1
shell: echo "1 shell " >> /tmp/1
notify: handlers1
tags: tagshell1
- name: test2
shell: echo "2 shell " >> /tmp/1
notify: handlers1
tags: tagshell2
- meta: flush_handlers
- name: test3
shell: echo "3 shell " >> /tmp/1
notify: handlers3
tags: tagshell3
- name: test4
shell: echo "4 shell end" >> /tmp/1
tags: tagshell4
handlers:
- name: handlers1
listen: handler group
shell: echo "1 handlers ,group" >> /tmp/1
- name: handlers2
listen: handler group
shell: echo "2 handlers ,group" >> /tmp/1
- name: handlers3
shell: echo "3 handlers " >> /tmp/1
- name: handlergrop
listen: handler group
shell: echo "handlergrop ,group" >> /tmp/1
2、执行
(base) [root@hdp1 ~]# ansible-playbook notify.yaml
PLAY [192.168.1.158] *********************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************
ok: [192.168.1.158]
TASK [touch file 1] **********************************************************************************************************
changed: [192.168.1.158]
TASK [test1] *****************************************************************************************************************
changed: [192.168.1.158]
TASK [test2] *****************************************************************************************************************
changed: [192.168.1.158]
RUNNING HANDLER [handlers1] **************************************************************************************************
changed: [192.168.1.158]
TASK [test3] *****************************************************************************************************************
changed: [192.168.1.158]
TASK [test4] *****************************************************************************************************************
changed: [192.168.1.158]
RUNNING HANDLER [handlers3] **************************************************************************************************
changed: [192.168.1.158]
PLAY RECAP *******************************************************************************************************************
192.168.1.158 : ok=8 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3、结果
(base) [root@hdp1 ~]# ansible 192.168.1.158 -m shell -a 'cat /tmp/1'
192.168.1.158 | CHANGED | rc=0 >>
1 shell
2 shell
1 handlers ,group
3 shell
4 shell end
3 handlers
多次 - meta: flush_handlers
1、多个 - meta: flush_handlers
(base) [root@hdp1 ~]# vi notify.yaml
---
- hosts: 192.168.1.158
tasks:
- name: touch file 1
shell: echo "" > /tmp/1
- name: test1
shell: echo "1 shell " >> /tmp/1
notify: handlers1
tags: tagshell1
- meta: flush_handlers
- name: test2
shell: echo "2 shell " >> /tmp/1
notify: handlers1
tags: tagshell2
- meta: flush_handlers
- name: test3
shell: echo "3 shell " >> /tmp/1
notify: handlers3
tags: tagshell3
- name: test4
shell: echo "4 shell end" >> /tmp/1
tags: tagshell4
handlers:
- name: handlers1
listen: handler group
shell: echo "1 handlers ,group" >> /tmp/1
- name: handlers2
listen: handler group
shell: echo "2 handlers ,group" >> /tmp/1
- name: handlers3
shell: echo "3 handlers " >> /tmp/1
- name: handlergrop
listen: handler group
shell: echo "handlergrop ,group" >> /tmp/1
2、执行
(base) [root@hdp1 ~]# ansible-playbook notify.yaml
PLAY [192.168.1.158] *******************************************************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************************************************
ok: [192.168.1.158]
TASK [touch file 1] ********************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [test1] ***************************************************************************************************************************************************************************
changed: [192.168.1.158]
RUNNING HANDLER [handlers1] ************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [test2] ***************************************************************************************************************************************************************************
changed: [192.168.1.158]
RUNNING HANDLER [handlers1] ************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [test3] ***************************************************************************************************************************************************************************
changed: [192.168.1.158]
TASK [test4] ***************************************************************************************************************************************************************************
changed: [192.168.1.158]
RUNNING HANDLER [handlers3] ************************************************************************************************************************************************************
changed: [192.168.1.158]
PLAY RECAP *****************************************************************************************************************************************************************************
192.168.1.158 : ok=9 changed=8 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3、结果
(base) [root@hdp1 ~]# ansible 192.168.1.158 -m shell -a 'cat /tmp/1'
192.168.1.158 | CHANGED | rc=0 >>
1 shell
1 handlers ,group
2 shell
1 handlers ,group
3 shell
4 shell end
3 handlers
--list-hosts
--list-tasks
--list-tags
(base) [root@hdp1 ~]# ansible-playbook listen.yaml --list-hosts
playbook: listen.yaml
play #1 (192.168.1.158): 192.168.1.158 TAGS: []
pattern: [u'192.168.1.158']
hosts (1):
192.168.1.158
(base) [root@hdp1 ~]# ansible-playbook listen.yaml --list-tasks
playbook: listen.yaml
play #1 (192.168.1.158): 192.168.1.158 TAGS: []
tasks:
touch file 1 TAGS: []
test1 TAGS: [tagshell1]
test2 TAGS: [tagshell2]
test3 TAGS: [tagshell3]
test4 TAGS: [tagshell4]
(base) [root@hdp1 ~]# ansible-playbook listen.yaml --list-tags
playbook: listen.yaml
play #1 (192.168.1.158): 192.168.1.158 TAGS: []
TASK TAGS: [tagshell1, tagshell2, tagshell3, tagshell4]
TAGS
(base) [root@hdp1 ~]# ansible-playbook notify.yaml -t tagshell1 PLAY [192.168.1.158] ******************************************************************************************************************************************************************* TASK [Gathering Facts] ***************************************************************************************************************************************************************** ok: [192.168.1.158] TASK [test1] *************************************************************************************************************************************************************************** changed: [192.168.1.158] RUNNING HANDLER [handlers1] ************************************************************************************************************************************************************ changed: [192.168.1.158] PLAY RECAP ***************************************************************************************************************************************************************************** 192.168.1.158 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 (base) [root@hdp1 ~]# ansible 192.168.1.158 -m shell -a 'cat /tmp/1' 192.168.1.158 | CHANGED | rc=0 >> 1 shell 1 handlers ,group 2 shell 1 handlers ,group 3 shell 4 shell end 3 handlers 1 shell 1 handlers ,group
浙公网安备 33010602011771号