這裏的最佳做法是使用handlers。
在你的角色創建一個文件handlers/main.yml
與內容:
- name: restart mypackage
service: name=mypackage state=restarted
然後從所有任務通知該處理程序。只有在任務報告改變的狀態(=黃色輸出)
- name: install package
apt: name=mypackage state=latest
notify: restart mypackage
- name: modify a file
lineinfile: do stuff
notify: restart mypackage
- name: modify a second file
lineinfile: other stuff
notify: restart mypackage
處理程序將在您的遊戲的最後執行的處理程序將另行通知。如果你有參與這取決於重新啓動的mypackage的服務等角色,你可能想在角色的最後刷新所有的處理程序:
- meta: flush_handlers
另外看看在force_handlers設置。如果在mypackge角色之後處理的任何其他角色發生錯誤,則處理程序不會被觸發。在您的ansible.cfg
中設置force_handlers=True
仍然強制您的處理程序在錯誤後執行。這是一個非常重要的話題,因爲當你下一次運行你的劇本時,文件不會被改變,因此處理程序不會得到通知,因此你的服務從不重新啓動。
你也可以做到這一點,沒有處理程序,但這是非常醜陋的。您需要註冊每個任務的輸出,以便稍後檢查應用於重新啓動任務的狀態。
- name: install package
apt: name=mypackage state=latest
register: mypackage_1
- name: modify a file
lineinfile: do stuff
register: mypackage_2
- name: modify a second file
lineinfile: other stuff
register: mypackage_3
- name: restart if anything changed
service: name=mypackage state=restarted
when: mypackage_1 | changed or mypackage_2 | changed or mypackage_3 | changed
另請參閱對Ansible Handler notify vs register的回答。
啊,輝煌的,我從來沒有想過,處理程序只有在註冊變更時觸發**和**,他們都在遊戲結束時被解僱。我最初是在考慮註冊和通知之間的混合,但是這可以解決這個問題。謝謝! – rasebo