参考博文:
ansible笔记(12):handlers的用法

1.Ansible playbook handlers剧本触发功能

  • handlers 当tasks执行成功后(change提示有变化),会触发 handlsers 执行,tasks 下通过 notify 关联 handlsers 的 name
  • handlers 执行的顺序与在playbook下定义的顺序相同,与被notify调用的顺序无关
  • 所有tasks执行完毕后,才会执行各个handler,并不是执行完某个task后,立即执行对应的handler
  • 如果你想要在执行完某些task以后立即执行对应的handler,则需要使用meta模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
shell > cat httpd-install.yaml 
--- # install httpd server
- hosts: webserver
tasks:
- name: Install httpd
yum: name=httpd,httpd-tools state=installed

- name: Configure httpd
copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: Restart httpd server

# 当httpd.conf 配置文件有变化,重启httpd服务
handlers:
- name: Restart httpd server
service: name=httpd state=restarted

2.meta 模块

  • 与task name平级,作用是影响ansible的内部运行方式
  • meta: flush_handlers 表示立即执行之前task所对应的handler。

3.listen 模块

当一个task需要同时调用多个handler时,使用listen为handler分组,在task notify下调用listen的组名,从而打到一个task同时调用多个handler的目的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
---
- hosts: test70
remote_user: root
tasks:
  - name: task1
    file: path=/testdir/testfile
          state=touch
    notify: handler group1 # 调用listen分组下的handler
 
  handlers:
  - name: handler1
    listen: handler group1 # 两个handler在同一个listen组下
    file: path=/testdir/ht1
          state=touch
  - name: handler2
    listen: handler group1
    file: path=/testdir/ht2
          state=touch