2014-09-05 89 views
9

我想將一個變量傳遞給通知處理程序,但在SO,文檔或github回購中的問題中找不到任何地方,該如何實現。我正在做的是部署多個webapps,並且當其中一個webapps的代碼發生更改時,它應該重新啓動該webapp的服務。ansible:使用帶通知處理程序的with_items

this SO question,我得到這個工作,有點:

- hosts: localhost 
    tasks: 
    - name: "task 1" 
    shell: "echo {{ item }}" 
    register: "task_1_output" 
    with_items: [a,b] 
    - name: "task 2" 
    debug: 
     msg: "{{ item.item }}" 
    when: item.changed 
    with_items: task_1_output.results 

(把它放在test.yml與ansible-playbook test.yml -c local運行)

但這注冊的第一個任務的結果,有條件地在第二個任務中循環。我的問題是當你有兩個或更多需要通知第二個任務的任務時,它會變得雜亂無章!例如,如果更新代碼或更改了配置,請重新啓動Web服務。

AFAICT,沒有辦法將變量傳遞給處理程序。這將爲我徹底解決它。我在github上發現了一些其他人碰到相同問題的問題,並且提出了一些語法,但是他們中沒有一個真正起作用。

包括子劇本也不起作用,因爲使用with_itemsinclude一起被棄用。

在我的手冊中,我有一個site.yml,列出了一個組的角色,然後在該組的group_vars中定義了應該安裝的webapps(包括版本)的列表。這對我來說似乎是正確的,因爲這樣我可以使用相同的劇本進行舞臺和製作。但也許唯一的解決方案是多次定義角色,並複製分段和生產的角色列表。

那麼這裏的智慧是什麼?

回答

5

我終於通過了分裂的應用程序進行解決它同一個角色的多個實例。這樣,角色中的處理程序可以引用定義爲角色變量的變量。

在site.yml:

- hosts: localhost 
    roles: 
    - role: something 
    name: a 
    - role: something 
    name: b 

在角色/事/任務/ main.yml:

- name: do something 
    shell: "echo {{ name }}" 
    notify: something happened 

- name: do something else 
    shell: "echo {{ name }}" 
    notify: something happened 

在角色/事/處理器/ main.yml:

- name: something happened 
    debug: 
    msg: "{{ name }}" 

似乎比第一個解決方案少得多!

+1

我認爲這是行不通的,只是用Ansible 1.8.4和1.9.0測試一下。處理程序始終根據第一個角色調用「a」來解析'name',即使在後續角色調用觸發時也是如此。由於處理程序及其通知在角色調用中是全局的,因此不能像這樣對其進行參數化。 – famousgarkin 2015-04-08 12:22:54

+2

奇怪!我想我測試了這個,當時是1.7.1。但是我通過改變通知到'''在tasks/main.yml中{{name}}「發生的事情,並通過將處理程序的名稱更改爲'」發生{{name}發生的事情} '。 – j0057 2015-04-08 12:48:36

+0

請參見:https://gist.github.com/j0057/5af0ac913a203a5b94ef - 對不起,我不得不平坦的目錄,也許如果你分叉,你可以訪問早期提交的目錄不平坦。 – j0057 2015-04-08 12:55:46

14

Ansible中的變量是全局變量,因此沒有理由將變量傳遞給處理函數。如果你試圖使一個處理程序參數化,你試圖在處理程序的名字中使用一個變量,你將無法在Ansible中做到這一點。

你可以做的是創建一個遍歷很輕鬆地服務列表的處理程序,這裏是一個工作的例子,可以在本地進行測試:

- hosts: localhost 
    tasks: 
    - file: > 
     path=/tmp/{{ item }} 
     state=directory 
    register: files_created 
    with_items: 
     - one 
     - two 
    notify: some_handler 

    handlers: 
    - name: "some_handler" 
     shell: "echo {{ item }} has changed!" 
     when: item.changed 
     with_items: files_created.results 
+2

我試過這種方法,但它並沒有當兩個或多個任務可以工作的人可能不通知處理程序。 – j0057 2014-09-06 19:46:35

0

從處理程序中,您可以調用任何註冊的變量,但註冊的變量會被上一個任務覆蓋。

- hosts: localhost 
    tasks: 
    - name: Task1 
    file: path=/toto/ state=directory 
    register: files_created 
    notify: some_handler 

    - name: Task2 
    file: path=/toto/ state=directory 
    register: files_created 
    notify: some_handler 

    handlers: 
    - name: "some_handler" 
     debug: msg="{{ file_created.results }}" 

在這個例子中,'file_created'變量只包含'Task2'結果。 我有同樣的問題,並提出了PR:https://github.com/ansible/ansible/pull/6674

有了這個,這將是:

- hosts: localhost 
    tasks: 
    - name: Task1 
    file: path=/toto/ state=directory 
    register: files_created 
    notify: some_handler 
    append_to_list: yes 

    - name: Task2 
    file: path=/toto/ state=directory 
    register: files_created 
    notify: some_handler 
    append_to_list: yes 


    handlers: 
    - name: "some_handler" 
     debug: msg="{{ item.results }}" 
     with_items: files_created 
+0

很好的公關,但這實際上並不是真正的 – Evan 2014-12-22 21:36:00

+0

公關已關閉,從未合併,因此這不是一個答案。 – 2018-02-18 09:02:52