随笔 - 366  文章 - 0  评论 - 101  阅读 - 30万

ansible

0、介绍

1
2
3
4
默认使用SSH协议对设备进行管理,
在主控端部署Ansible环境,
无需在客户端安装agent,
基于Python开发的实现批量系统配置、程序部署、运行命令等功能的自动化运维工具

1、安装            192.168.1.155安装ansible

1
2
EPEL源:yum -y install epel-release
yum install -y ansible

配置文件 (/etc/ansible/roles              #存放角色的目录)

1
2
3
(base) [root@hdp1 ~]# rpm -qc  ansible
/etc/ansible/ansible.cfg
/etc/ansible/hosts 

2、配置主机清单    hosts ,                默认 /etc/ansible/hosts ,也可以 -i  指定文件

1
2
3
4
(base) [root@hdp1 ~]# cat /etc/ansible/hosts            |grep -v ^#|grep -v ^$
[hdp]
192.168.1.156
192.168.1.[157:159]

cfg配置

  

 

3、列出所有主机

1
2
3
4
5
6
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

模块查看

1
2
3
4
5
(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

1
2
3
4
5
(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 模块  先忽略)

1
2
3
4
(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

 通过参数 

1
2
3
4
5
6
7
--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参数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(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   

1
2
3
4
(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模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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,不能是目录

1
2
3
4
5
6
7
8
9
10
11
12
(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 模块

1
2
3
4
5
6
7
8
9
(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"]}

  

9cron 模块     

1
user指定用户(需要认证指定用户 或者 加-k参数)
1
2
3
4
5
6
7
8
9
10
11
12
13
(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

 

参数 说明

   

增删改

1
2
3
4
5
6
7
8
9
10
11
更新 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

1
2
3
4
5
6
7
8
9
10
11
12
13
#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
2
3
4
5
1、文件的第一行应该以 "---" (三个连字符)开始,表明YMAL文件的开始。
2、在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
3、YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。
4、同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。
5、play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以":"分隔表示,":"后面还要增加一个空格。

 

执行第一个playbook

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(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 用户权限来执行命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
(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类的参数列表;

1
 

多任务:

1
2
3
4
5
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指定进行调用;

 

1
2
3
4
5
6
7
8
格式:
    tasks:
      – name: TASK_NAME
       module: arguments
       notify: HANDLER_NAME
       handlers:
      – name: HANDLER_NAME
       module: arguments

 

 

查语法有没有错误,没有提示即表示语法应该没有问题。    

  

测试运行看看,-C表示仅测试跑一边,但是不会实际操作         ansible-playbook -C nginx.yml

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
(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  

 结果

1
2
3
4
5
6
7
8
9
10
11
12
13
(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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

  

task中如何一次性调用多个handler,使用 listen,通过把handler分组实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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

--list-hosts

--list-tasks

--list-tags

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
(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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
(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

  

 

ansible常用模块

ansible中的模块和模块内置命令

ansible-copy模块详解

【网络】[::]:80是什么意思 / [::]是什么意思

posted on   寒星12345678999  阅读(66)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示