2017-10-05 72 views
0

Ansible中有一個Jinja2模板,我需要有條件地包含一些文件。Ansible:包含一個文件,如果它不存在並且什麼都不做

基本上,我有一個for循環,其中包含可能或可能不存在的「子部分」。下面的示例演示了基本的代碼,如果所有的工具竟然出現了「pbr.j2」文件,將工作,但它崩潰,因爲Ansible不能找到一些文件:

{% for tool in tools %} 
    {% set template = 'tools/' + tool.name + '/pbr.j2' %} 
    {% include template %} 
{% endfor %} 

我也曾嘗試existsis_file過濾器,但即使文件存在,我也總是得到「假」。這裏是我已經嘗試過的示例代碼:

{% for tool in tools %} 
    {% set template = 'tools/' + tool.name + '/pbr.j2' %} 
    {% if template|exists %} 
     {% include template %} 
    {% endif %} 
{% endfor %} 

這最後一個示例的結果是沒有包含文件。如果我用代替exists,我會得到相同的行爲。

我需要改變什麼來完成我想要的?

回答

0

您試圖在Jinja2模板中使用Ansible過濾器(exists,is_file)。這適用於由Ansible模板引擎處理的模板,但不適用於由template模塊處理的模板。

Jinja2無法檢查文件的存在,因此您需要將您的邏輯移至Ansible。

例如:創建一個find任務tools/搜索目錄,並提供find - 結果列表中的交叉口tools列表的Jinja2。

+0

我看到過濾器應該在.yml文件中使用,並且我無法在Jinja2模板中找到任何有關引用文件測試的幫助,但是我發現可能有一些簡單的方法,例如過濾器來完成我想要的但它只是沒有記錄。我將使用任務路線,並將列表傳遞給Jinja2模板。感謝您的幫助,我真的很感激! – Drizzt

1

我找到了解決我的問題的方法:在include指令中使用ignore missing

在這種情況下,我會用:

{% for tool in tools %} 
    {% set template = 'tools/' + tool.name + '/pbr.j2' %} 
    {% include template ignore missing %} 
{% endfor %} 

Ansible將忽略丟失的文件,只有現有的文件從該循環將得到包括在內。

相關問題