如何使用Jinja处理不存在的文件导入

时间:2019-06-28 09:44:48

标签: jinja2 salt-stack gitfs

在盐柱中,我需要将文件的内容加载到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)...

1 个答案:

答案 0 :(得分:0)

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

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

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

原始红利问题仍然悬而未决;-)