首页 > 解决方案 > 如何使用不存在的 Jinja 处理文件的导入

问题描述

在 Salt Pillars 中,我需要将文件的内容加载到 Jinja 变量中。如果文件不存在 Jinja 抛出错误 (TemplateNotFound:...)

我的支柱中有一些文件夹(公司 A、公司 B 等)可能包含也可能不包含名为 Default.sls 的文件。如果文件存在 - 它将被加载到变量中。当文件不存在时就会出现问题——在这种情况下,Jinja 会抛出 TemplateNotFound 异常。我的 Pillar 文件夹如下所示:

pillar
|
|-Default.sls
|
|-Company A
| |-Default.sls  <-- This could be missing
| |-init.sls
| |-prod.sls
| |-test.sls
| |-etc...
|
|-Company B
| |-Default.sls  <-- This could be missing
| |-init.sls
| |-prod.sls
| |-test.sls
| |-etc...
|
|-Company C
|...

我还没有找到解决这个问题的好方法。我一直在使用以下代码(信息:tpldir 包含 sls 文件(在本例中为 init.sls)所在的当前文件夹名称):

{{Company x}}/init.sls
----------------------
{% from tpldir + '/default.sls' import companyDefaultX with context %}
xx:
  companyDefault: {{ companyDefaultX | yaml }}

为了检查文件是否存在 - 我一直在使用:

salt['file.file_exists']('/srv/pillar/' + tpldir + "/default.sls")

只要将 Salt master 配置中定义的 file_roots 设置为默认设置,它就可以正常工作。我们现在已经开始使用 gitfs - 现在上面对 file.file_exists 的使用显然不起作用,因为文件不再位于 /srv/pillar/... 的 salt master 上!

上面代码的原因是它是一种在 default- 和 companyDefault 配置之间进行分层的方法。读取第一个默认值 (Defalt.sls),然后将 {{Company X}}/Default.sls 合并到默认值中。第三个环境(prod.sls、test.sls 等)与新的默认值合并...

额外问题:如何在不使用的情况下遍历文件夹中的文件:

salt['file.readdir']('/srv/pillar/' + tpldir)

因为这是同一个问题(/srv/pillar)...

标签: jinja2salt-stackgitfs

解决方案


我已经找到了解决上述问题的方法。唯一的方法是将包含与“忽略缺失”结合使用:

{%- load_yaml as customerDefaultX %}
{% include tpldir + '/default.sls' ignore missing with context %}
{%- endload %}

customerDefaultX 变量现在将包含 {{Company X}}/default.sls 文件的内容,如果不存在,则为 None ...

原来的奖金问题仍然开放;-)


推荐阅读