2014-11-03 40 views
1

我正在編寫一個創建Docker鏡像的手冊,僅在我的辦公室內使用。我的一個要求是允許其他開發人員在Docker鏡像構建之前輕鬆運行自己的代碼。爲此,我允許他們添加他們自己的yml文件,並在變量設置爲False時運行它。我要求他們的文件名爲{{account}}。yml,其中account是另一個必須設置的變量。Ansible包含可能不存在的文件?

對於不想在構建圖像之前運行自定義遊戲的用戶,不會有{{account}}。yml文件。我想通過添加條件錯誤不會發生,因爲我不會試圖導入文件,但即使包含應該被忽略,我仍然得到一個錯誤,告訴我該文件不存在。

- name: Custom provisioning 
    include: '{{account}}.yml' 
    when: default_prebuild_provision == 'False' or generic == 'False' 

我知道我的工作條件,因爲如果我把它更改爲類似

- name: Custom provisioning 
    shell: echo Hello World 
    when: default_prebuild_provision == 'False' or generic == 'False' 

,因爲條件不滿足,我不會得到任何輸出。

有沒有人有解決方案來解決這個問題?我也應該爲此打開一張票,因爲它似乎是一個錯誤?

+0

AFAIK這不建議使用,但如果找不到更優雅的方式,可以在該特定任務中添加「ignore_errors:yes」。 – Mxx 2014-11-04 04:19:54

+0

無論推薦與否,使用ignore_errors:true都會使用最少的代碼來完成'文件存在'的情況,如果是,則執行'code block'會執行的命令。我會高興地使用ignore_errors而不是在這種情況下自己創建一個評估案例包裝器 – PhillipHolmes 2015-01-30 23:55:44

+0

這不會起作用。見Leitos的答案。 '包括'不是正常的任務。無論條件或ignore_errors的其他語句如何,在劇本執行開始之前,所有'include'都得到解決。所以文件必須在那裏或不管是什麼。 – udondan 2015-01-31 08:30:20

回答

1

這不是一個bug,請閱讀更多有關的問題張貼:Ansible include task only if file exists

簡短的回答:when: False不會短路包括。 when子句只在「{{account}}。yml」存在時適用於所有任務,如果不存在,則會失敗。

對此的一種解決方案:我不知道,但探索寫作的可能性,我自己包括(作爲一個模塊)

3

由於Leito描述的,這是不能直接由於include S如何成這個樣子處理。作爲一個自定義模塊,如果可能的話,這也可能很難完成。

醜陋解決方法可能是,而不是給開發者的選擇提供一個定製的劇本,然後運行shell行動,檢查該劇本文件的存在,並運行另一個ansible-playbook過程。這當然有許多缺點,其中最令人擔憂的是你不會在主要劇本中看到第二部劇本的輸出。但這是我現在可以想象的唯一選擇,您可以在其中包含自定義任務。

- name: Custom provisioning 
    shell: [ -f {{account}}.yml ] && ansible-playbook ... {{account}}.yml 

如果你想要的任務的開發運行,以某種方式預先定義的,僅在配置上有所不同,你可以讓他們提供自定義瓦爾文件,然後觸發行動的角色取決於定義的變量。在include_vars任務可以忽略的錯誤:

- include_vars: {{account}}.yml 
    failed_when: false 

failed_when: false恕我直言,是優於ignore_errors: yes,因爲它沒有標記任務爲失敗。 ignore_errors仍然會拋出一個錯誤,但繼續玩這個遊戲。

或者,你可以做這樣的事情,並回落到一個默認或空瓦爾文件:

- include_vars: "{{ item }}" 
    with_first_found: 
    - "{{ account }}.yml" 
    - "empty.yml" 

,然後運行您的任務依賴於可能定義瓦爾:

- some_other_action: 
    details: some_var_from_account 
    when: some_var_from_account is defined 
相關問題