2017-04-16 33 views
0

我有一個Ansible操作手冊在一組服務器中安裝可變數量的應用程序。安裝的應用程序,一些順序任務必須運行,並且因爲可能有多個應用程序,我遍歷他們with_items:Ansible處理器讀取本地事實

我也以這樣一種方式,如果三個任務都登記在一個地域的實際情況的任何變化在應用程序A上執行,應用程序A被標記。

我遇到處理程序問題。它應該讀取這些本地事實並重新啓動任何已被標記的應用程序,但我無法實現此目的。我的處理程序只是跳過,但調試顯示標誌的本地事實。

劇本與此類似:

--- 
- name: Ensure the application's jar file exists 
    copy: 
    src: '{{ item.appName }}/{{ item.jarName }}' 
    dest: '{{ AppsRootFolder }}/{{ item.appName }}/{{ item.jarName }}' 
    register: task 
    with_items: '{{ deployApp }}' 
    notify: Restart application 

- name: Registering App for later restart 
    set_fact: 
    myapps_toberestarted_{{ item.item.appName }}: "{{ item.changed }}" 
    with_items: "{{ task.results }}" 
    when: "{{ item.changed }}" 

- name: Ensure the application's conf file exists 
    template: 
    src: '{{ item.confName }}.j2' 
    dest: '{{ AppsRootFolder }}/{{ item.appName }}/{{ item.confName }}' 
    register: task 
    with_items: '{{ deployApp }}' 
    notify: Restart application 

- name: Registering App for later restart 
    set_fact: 
    myapps_toberestarted_{{ item.item.appName }}: "{{ item.changed }}" 
    with_items: "{{ task.results }}" 
    when: "{{ item.changed }}" 

處理器我需要幫助如下。它跳過 「重新啓動應用程序」 任務:

- name: Restart application 
    debug: var=myapps_toberestarted_{{ item.appName }} 
    with_items: "{{ deployApp }}" 
    when: myapps_toberestarted_{{ item.appName }} == 'true' 

而且finaly我group_vars

AppsRootFolder: /opt/Apps 
deployApp: 
    - { appName: "API", jarName: "api.jar", confName: "api.conf" } 
    - { appName: "Demo", jarName: "demo.jar", confName: "demo.conf" } 
    - { appName: "Another", jarName: "another.jar", confName: "another.conf" } 

回答

0

true/false(在任務結果changed變量註冊,在item.changed因此也)是布爾值不是字符串,所以你可以用這種方式在處理程序中定義你的條件:

when: myapps_toberestarted_{{ item.appName }} 

Wi th == 'true'你將它與一個總是給出否定結果的字符串進行比較。

+0

你說得對,謝謝。現在它按預期工作。實際上,我還添加了一個默認設置,以避免其他應用程序未被修改的錯誤,因此,本地事實未設置**'when:myapps_toberestarted _ {{item.appName}} |默認([])'**這可以防止像這樣的錯誤:'在評估條件'var時出錯是未定義的' – felichas