2015-11-04 49 views
1

簡而言之,我只想在配置發生變化時重新啓動服務。如何在修改過的文件中實現有條件的邏輯?

下面是一個例子:

- hosts: workers 
    tasks: 
    - lineinfile: 'dest=/etc/default/autofs regexp=^OPTIONS= line="OPTIONS=\"-O soft\"" backup=yes' 
    - shell: service autofs reload 

正如你可以看到這個代碼將始終重新啓動autofs,不更新配置文件時也是如此。

我該如何改進它,以便它只會在配置文件更改時重新啓動?

注:這是一個普通的問題是不特定的autofs,它可以適用於那些我想如果配置文件發生了改變,很可能是通過lineinfileini_file核心模塊來執行的東西任何服務。

回答

2

首先,您應該使用service module來控制運行時的運行服務。一般來說,如果有一個適當的模塊用於某些事情,並且它滿足您的需求,那麼您應該這樣做,並且只會訴諸邊緣案例。

此外,當一個Ansible任務運行它returns a series of facts,您可以註冊,以便能夠直接使用。這幾乎總是包含一個changed屬性,它是一個布爾型的說法,是否Ansible認爲它改變了某些東西(如果一個shell任務返回標準輸出中的某個東西,那麼它會假設有些事情發生了變化,除非直接用changed_when覆蓋它)。

所以你可以像這樣的東西去:

- hosts: workers 
    tasks: 
    - name: Set autofs options 
    lineinfile: 'dest=/etc/default/autofs regexp=^OPTIONS= line="OPTIONS=\"-O soft\"" backup=yes' 
    register: result 

    - name: reload autofs is autofs options are changed 
    service: name=autofs state=reloaded 
    when: result.changed 
1

如果你想創建一個角色,而不是就在你的劇本,你可以用handlers工作使用鬆散的任務。另見Best practices: Task And Handler Organization For A Role

任務你的角色的文件:

- name: Change autofs config 
    lineinfile: dest=/etc/default/autofs 
       regexp=^OPTIONS= 
       line="OPTIONS=\"-O soft\"" 
       backup=yes 
    notify: 
    - Restart autfs 

然後在同一角色的處理程序文件:

- name: Restart autfs 
    service: name=autfs 
      state=restarted 

處理程序得到通知,每當配置任務有改變的狀態。

PS:我使用service module來管理服務。您應該只使用shell模塊如果您的工作沒有具體的模塊可

Regarding roles:你肯定會想要做雖然

一件事,就是使用「角色」組織的功能,它記錄爲主要劇本頁面的一部分。見Playbook Roles and Include Statements。你絕對應該使用角色。角色很棒。使用角色。角色!我們說得夠了嗎?角色很棒。

0

我知道這已經很舊了,但是我登陸了這個網站,覺得還有更多的東西要添加到別人已經回答的東西上。你應該使用一個處理程序,但是你不需要做一個謹慎的角色來使用處理程序。下面是一個在劇本中直接使用的處理程序示例。

--- 
- hosts: workers 
    tasks: 
    - lineinfile: 'dest=/etc/default/autofs regexp=^OPTIONS= line="OPTIONS=\"-O soft\"" backup=yes' 
     notify: reload autofs 
    handlers: 
    - name: reload autofs 
     service: name=autofs state=reloaded 

有一點需要注意。操作人員在劇本結束時開火。所以如果你有多個任務,並且你希望處理程序在通知它的任務之後觸發,那麼你可能會遇到一段糟糕的時間。如果您需要該處理程序以順序方式隨您的任務一起觸發,則可以對flush_handlers執行'meta'任務,或者可以使用ydaetskcoR提供的註冊/條件方式。在你的遊戲中,只需一個任務,這並不重要。