在 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)...