基础语法结构 name: 部署nginx配置并自动重启hosts: webtasks:任务1推送nginx配置文件name: 分发nginx.confcopy:src: ./files/nginx.confdest: /etc/nginx/nginx.confowner: rootgroup: rootmode: ‘0644’配置文件发生变更时通知名为 restart nginx 的handlernotify: restart nginx任务2推送站点配置name: 分发站点vhost配置copy:src: ./files/site.confdest: /etc/nginx/conf.d/site.confnotify: restart nginx触发器定义区域和tasks同级handlers:name: restart nginxservice:name: nginxstate: restarted执行逻辑两个 copy 任务只要任意一个文件发生修改changed所有 tasks 跑完后仅执行一次 restart nginx。回到顶部handler示例多个task同时触发handler会发生什么编写playbook文件rootmaster:/data00/ansible# cat handler1.yamlname: handler使用hosts: estasks:name: copy test1文件copy:src: /data00/ansible/test1.txtdest: /tmp/test1.txtmode: 600notify: notify handlername: copy test2文件copy:src: /data00/ansible/test2.txtdest: /tmp/test2.txtmode: 600notify: notify handlerhandlers:name: notify handlerdebug:msg: “handler触发了”测试执行发现远端机器被改变handler被触发了但是只执行一次rootmaster:/data00/ansible# ansible-playbook handler1.yamlPLAY [handler使用] ***********************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.120.9]TASK [copy test1文件] ********************************************************************************************************************************************************************************************changed: [10.37.120.9]TASK [copy test2文件] ********************************************************************************************************************************************************************************************changed: [10.37.120.9]发现这里handler被触发了RUNNING HANDLER [notify handler] *********************************************************************************************************************************************************************************ok: [10.37.120.9] {“msg”: “handler触发了”}PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.120.9 : ok4 changed2 unreachable0 failed0 skipped0 rescued0 ignored0如果再执行一次会发生什么发现handler没有被触发因为文件状态没有被改变rootmaster:/data00/ansible# ansible-playbook handler1.yamlPLAY [handler使用] ***********************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.120.9]TASK [copy test1文件] ********************************************************************************************************************************************************************************************ok: [10.37.120.9]TASK [copy test2文件] ********************************************************************************************************************************************************************************************ok: [10.37.120.9]PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.120.9 : ok3 changed0 unreachable0 failed0 skipped0 rescued0 ignored0定义多个handler没有被notify会怎么样rootmaster:/data00/ansible# cat handler2.yamlname: handler使用hosts: dbtasks:name: copy test1文件copy:src: /data00/ansible/test1.txtdest: /tmp/test1.txtmode: 600notify: notify handler定义handlerhandlers:name: notify handlerdebug:msg: “handler触发了”name: handler2debug:msg: “handler2触发了”name: handler3debug:msg: “handler3触发了”执行发现只有1个handler被触发了其它的handler并没有被触发rootmaster:/data00/ansible# ansible-playbook handler2.yamlPLAY [handler使用] ***********************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.99.63]TASK [copy test1文件] ********************************************************************************************************************************************************************************************changed: [10.37.99.63]RUNNING HANDLER [notify handler] *********************************************************************************************************************************************************************************ok: [10.37.99.63] {“msg”: “handler触发了”}PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.99.63 : ok4 changed2 unreachable0 failed0 skipped0 rescued0 ignored0多个handler之间的执行顺序是怎么样的先给结论多个handler之间的执行顺序依赖文件中定义的先后顺序不依赖notify的顺序。可以看下面的案例编写playbook文件rootmaster:/data00/ansible# cat handler3.yamlname: handler使用hosts: dbtasks:name: copy test1文件copy:src: /data00/ansible/test1.txtdest: /tmp/test1.txtmode: 600notify: handler3name: copy test2文件copy:src: /data00/ansible/test2.txtdest: /tmp/test2.txtmode: 600notify: handler2handlers:name: notify handlerdebug:msg: “handler触发了”name: handler2debug:msg: “handler2触发了”name: handler3debug:msg: “handler3触发了”执行发现上文先notify的handle3然后notify的handler2。但是下面执行的handler2然后执行的handler3rootmaster:/data00/ansible# ansible-playbook handler3.yamlPLAY [handler使用] ***********************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.99.63]TASK [copy test1文件] ********************************************************************************************************************************************************************************************changed: [10.37.99.63]TASK [copy test2文件] ********************************************************************************************************************************************************************************************changed: [10.37.99.63]先执行的handler2RUNNING HANDLER [handler2] ***************************************************************************************************************************************************************************************ok: [10.37.99.63] {“msg”: “handler2触发了”}再执行handler3RUNNING HANDLER [handler3] ***************************************************************************************************************************************************************************************ok: [10.37.99.63] {“msg”: “handler3触发了”}一次性notify多个handler编写playbook文件rootmaster:/data00/ansible# cat handler4.yamlname: handler使用hosts: dbtasks:name: copy test1文件copy:src: /data00/ansible/test1.txtdest: /tmp/test1.txtmode: 600一次性notify多个handlernotify:handler3handler2notify handlerhandlers:name: notify handlerdebug:msg: “handler触发了”name: handler2debug:msg: “handler2触发了”name: handler3debug:msg: “handler3触发了”执行这里发现不依赖notify的定义顺序只依赖handlers定义的先后顺序rootmaster:/data00/ansible# ansible-playbook handler4.yamlPLAY [handler使用] ***********************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.99.63]TASK [copy test1文件] ********************************************************************************************************************************************************************************************changed: [10.37.99.63]RUNNING HANDLER [notify handler] *********************************************************************************************************************************************************************************ok: [10.37.99.63] {“msg”: “handler触发了”}RUNNING HANDLER [handler2] ***************************************************************************************************************************************************************************************ok: [10.37.99.63] {“msg”: “handler2触发了”}RUNNING HANDLER [handler3] ***************************************************************************************************************************************************************************************ok: [10.37.99.63] {“msg”: “handler3触发了”}PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.99.63 : ok5 changed1 unreachable0 failed0 skipped0 rescued0 ignored0handler 链式触发handler 内部 notify编写playbook文件rootmaster:/data00/ansible# cat handler5.yamlname: handler使用hosts: dbtasks:name: copy test1文件copy:src: /data00/ansible/test1.txtdest: /tmp/test1.txtmode: 600notify:handler3handlers:name: notify handlerdebug:msg: “handler触发了”name: handler2shell:cmd: “echo handler2”notify: notify handlername: handler3shell:cmd: “echo handler3”notify: handler2执行rootmaster:/data00/ansible# ansible-playbook handler5.yamlPLAY [handler使用] ***********************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.99.63]TASK [copy test1文件] ********************************************************************************************************************************************************************************************changed: [10.37.99.63]RUNNING HANDLER [handler3] ***************************************************************************************************************************************************************************************changed: [10.37.99.63]RUNNING HANDLER [handler2] ***************************************************************************************************************************************************************************************changed: [10.37.99.63]PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.99.63 : ok4 changed3 unreachable0 failed0 skipped0 rescued0 ignored0强制立即执行 handler默认 handler 在所有 task 末尾执行若需要中途立刻触发使用 meta 模块编写playbook文件rootmaster:/data00/ansible# cat handler6.yamlname: handler使用hosts: dbtasks:name: copy test1文件copy:src: /data00/ansible/test1.txtdest: /tmp/test1.txtmode: 600notify: handler3立刻执行上面触发的handlermeta: flush_handlersname: copy test2文件copy:src: /data00/ansible/test2.txtdest: /tmp/test2.txtmode: 600notify: notify handlerhandlers:name: notify handlerdebug:msg: “handler触发了”name: handler2debug:msg: “handler2触发了”name: handler3debug:msg: “handler3触发了”执行rootmaster:/data00/ansible# ansible-playbook handler6.yamlPLAY [handler使用] ***********************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.99.63]TASK [copy test1文件] ********************************************************************************************************************************************************************************************changed: [10.37.99.63]TASK [meta] ******************************************************************************************************************************************************************************************************RUNNING HANDLER [handler3] ***************************************************************************************************************************************************************************************ok: [10.37.99.63] {“msg”: “handler3触发了”}TASK [copy test2文件] ********************************************************************************************************************************************************************************************changed: [10.37.99.63]RUNNING HANDLER [notify handler] *********************************************************************************************************************************************************************************ok: [10.37.99.63] {“msg”: “handler触发了”}PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.99.63 : ok5 changed2 unreachable0 failed0 skipped0