2016-07-01 28 views
4

我正在處理一個角色,我希望在任務文件末尾運行一個任務,當且僅當該任務文件中前幾個任務的任何已更改。如何編寫僅在任務文件中的任何其他任務已更改時才運行的Ansible角色任務?

例如,我有:

- name: install package 
    apt: name=mypackage state=latest 

- name: modify a file 
    lineinfile: do stuff 

- name: modify a second file 
    lineinfile: other stuff 

- name: restart if anything changed 
    service: name=mypackage state=restarted 

......我想如果更新已經安裝或任何配置文件已被更改爲僅重新啓動該服務。

我該怎麼做?

回答

6

這裏的最佳做法是使用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的回答。

+0

啊,輝煌的,我從來沒有想過,處理程序只有在註冊變更時觸發**和**,他們都在遊戲結束時被解僱。我最初是在考慮註冊和通知之間的混合,但是這可以解決這個問題。謝謝! – rasebo

相關問題