Ansible:如果文件存在,则包含该文件,如果不存在则不执行任何操作。

3
我是一名有用的助手,可以为您翻译文本。
我有一个在Ansible中使用的Jinja2模板,需要根据条件包含一些文件。基本上,我有一个循环包含了“subparts”,这些“subparts”可能存在或不存在。以下示例演示了基本代码,如果所有工具实际上都有“pbr.j2”文件,则该代码将运行成功,但它会崩溃,因为Ansible找不到某些文件:
{% for tool in tools %}
   {% set template = 'tools/' + tool.name + '/pbr.j2' %}
   {% include template %}
{% endfor %}

我也尝试了existsis_file过滤器,但是即使文件存在,我始终得到“false”的结果。以下是我尝试的示例代码:

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

这个样例的结果是没有任何文件被包含。如果我将exists替换为is_file,我会得到相同的结果。
我需要做哪些更改才能实现我的目标?
2个回答

15
我已经找到了解决方法:在include指令中使用ignore missing。 在这种情况下,我会使用:
{% for tool in tools %}
   {% set template = 'tools/' + tool.name + '/pbr.j2' %}
   {% include template ignore missing %}
{% endfor %}

Ansible会忽略缺失的文件,并且只会包含那个循环中已存在的文件。


3
你正在尝试在Jinja2模板中使用Ansible过滤器(existsis_file)。这对于由Ansible模板引擎处理的模板可以工作,但对于由template模块处理的模板则不行。
Jinja2没有检查文件存在的能力,所以你需要把逻辑移到Ansible中。
例如:创建一个find任务来搜索tools/目录中的目录,并将find结果列表与tools列表进行交集运算提供给Jinja2。

我看到过滤器应该在 .yml 文件中使用,而且我找不到任何有关在Jinja2模板中进行文件测试的帮助,但我认为可能有一些简单的方法(如过滤器)来实现我想要的,只是没有文档记录。我将采用任务路线,将列表传递给Jinja2模板。非常感谢您的帮助! - Drizzt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接