Ansible系列基础篇 1.7.2、PlayBook之handlers
Handlers介绍:
handlers本质上是一个task,可执行task任务。handlers用来解决触发任务的,也就是当一个tasks真正的执行后,结果发生了变化(changed=1),会去触发handlers里的task。(handlers配合notify使用。)一个handler最多只执行一次,并且在所有的任务都执行完成之后再执行;如果有多个任务调用同一个handler,那么也只执行一次,这个也是同普通的Event机制的一个不同点。handler是按照handlers里定义的顺序执行的,而不是按照在任务中的调用顺序执行的。
普通示例:
--- # 修改nignx配置文件,修改成果,则重启nginx - hosts: test70 remote_user: root tasks: - name: Modify the configuration lineinfile: path=/etc/nginx/conf.d/test.nginx.conf regexp="listen(.*) 8080(.*)" line="listen\1 8088\2" backrefs=yes backup=yes notify: restart nginx handlers: - name: restart nginx service: name=nginx state=restarted ...
多个tasks调用多个handlers里的任务:
--- - hosts: all remote_user: root tasks: - name: make testfile1 file: path=/testdir/testfile1 state=directory notify: ht2 - name: make testfile2 file: path=/testdir/testfile2 state=directory notify: ht1 handlers: - name: ht1 file: path=/testdir/ht1 state=touch - name: ht2 file: path=/testdir/ht2 state=touch
执行结果:
从上图可以看出,handler执行的顺序与handler在playbook中定义的顺序是相同的,与"handler被notify"的顺序无关。
如上图所示,默认情况下,所有task执行完毕后,才会执行各个handler,并不是执行完某个task后,立即执行对应的handler,如果你想要在执行完某些task以后立即执行对应的handler,则需要使用meta模块,示例如下("meta: flush_handlers"表示立即执行之前的task所对应handler):
--- - hosts: test70 remote_user: root tasks: - name: task1 file: path=/testdir/testfile state=touch notify: handler1 - name: task2 file: path=/testdir/testfile2 state=touch notify: handler2 - meta: flush_handlers - name: task3 file: path=/testdir/testfile3 state=touch notify: handler3 handlers: - name: handler1 file: path=/testdir/ht1 state=touch - name: handler2 file: path=/testdir/ht2 state=touch - name: handler3 file: path=/testdir/ht3 state=touch ...
执行结果:
正如上图所示,meta任务之前的任务task1与task2在进行了实际操作以后,立即运行了对应的handler1与handler2,然后才运行了task3,在所有task都运行完毕后,又逐个将剩余的handler根据情况进行调用。
notify多个handlers任务(使用listen语法),如下两种方式:
--- - hosts: test70 remote_user: root tasks: - name: task1 file: path=/testdir/testfile state=touch notify: handler group1 handlers: - name: handler1 listen: handler group1 file: path=/testdir/ht1 state=touch - name: handler2 listen: handler group1 file: path=/testdir/ht2 state=touch ...
--- - hosts: test70 remote_user: root tasks: - name: task1 file: path=/testdir/testfile state=touch notify: - handler1 - handler2 handlers: - name: handler1 file: path=/testdir/ht1 state=touch - name: handler2 file: path=/testdir/ht2 state=touch ...