handlers可以理解成另一種tasks,handlers是另一種’任務列表’,handlers中的任務會被tasks中的任務進行”調用”,但是,被”調用”并不意味著一定會執行,只有當tasks中的任務”真正執行”以后(真正的進行實際操作,造成了實際的改變),handlers中被調用的任務才會執行,如果tasks中的任務并沒有做出任何實際的操作,那么handlers中的任務即使被’調用’,也并不會執行。
handler執行的順序與handler在playbook中定義的順序是相同的,與”handler被notify”的順序無關。
默認情況下,所有task執行完畢后,才會執行各個handler,并不是執行完某個task后,立即執行對應的handler,如果你想要在執行完某些task以后立即執行對應的handler,則需要使用meta模塊。
meta任務是一種特殊的任務,meta任務可以影響ansible的內部運行方式,meta任務的參數值為flush_handlers,”meta: flush_handlers”表示立即執行之前的task所對應handler。
如果想要每個task在實際操作后都立馬執行對應handlers,則可以在每個任務之后都添加一個meta任務,并將其值設置為flush_handlers。 所以,我們可以依靠meta任務,讓handler的使用變得更加靈活。
如果想要一次notify多個handler,則需要借助另一個關鍵字,它就是’listen’,你可以把listen理解成”組名”,我們可以把多個handler分成”組”,當我們需要一次性notify多個handler時,只要將多個handler分為”一組”,使用相同的”組名”即可,當notify對應的值為”組名”時,”組”內的所有handler都會被notify
[root@server4 ~]# cat mkdir3.yml
---
- hosts: testBremote_user: roottasks:- name: task1file: path=/testdir/testfilestate=touchnotify: handler group1handlers:- name: handler1listen: handler group1file: path=/testdir/ht1state=touch- name: handler2listen: handler group1file: path=/testdir/ht2state=touch
?