jinja2 - 如何使用不存在的 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)...
解决方案
我已经找到了解决上述问题的方法。唯一的方法是将包含与“忽略缺失”结合使用:
{%- load_yaml as customerDefaultX %}
{% include tpldir + '/default.sls' ignore missing with context %}
{%- endload %}
customerDefaultX 变量现在将包含 {{Company X}}/default.sls 文件的内容,如果不存在,则为 None ...
原来的奖金问题仍然开放;-)
推荐阅读
- ubuntu - Elasticsearch 集群崩溃
- python - 发生错误,例如 myclass() 没有参数
- ironpython - 为什么 strptime() 不接受我的输入字符串?
- c# - 如何通过 TLS(显式)连接到 FTP 服务器并向其上传文件 [C#]
- git - 我可以在合并到 master 之前检查已经合并到其他分支的更改吗
- input - 如何在朱莉娅的每次击键时读取键盘输入?
- java - java - 如何通过在java中递归连接字符串来生成方程?
- java - 由于 java.util.zip.ZipException,Tomcat 8 组件启动失败
- sql - 如何在选定的字符串中插入逗号?
- java - 如何在junit 5中为测试用例设置环境变量