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

问题描述 投票:0回答:2

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

我的 Pillars 中有一些文件夹(公司 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 上!

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

奖金问题:如何在不使用的情况下循环访问文件夹中的文件:

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

因为这是同样的问题 (/srv/pillar)...

jinja2 salt-stack gitfs
2个回答
1
投票

我已经找到了解决上述问题的方法。唯一的方法是将 include 与“ignore missing”结合使用:

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

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

原来的奖金问题仍然悬而未决;-)


0
投票

对我有用的技巧是使用

cp.cache_(dir|file)
Salt 函数。在
.sls
文件中(注意它必须是 SLS 才能使
slspath
tpldir
工作)然后我可以使用:

{%- set include_dir = opts['id'] | replace('.', '_') %}
{%- if salt['cp.cache_dir']("salt://{0}/{1}".format(slspath, include_dir)) %}
include:
  - .{{ include_dir }}
{%- endif %}

在 minion 上,该函数将尝试确保给定的

salt://..
路径是可扩展的,并且 (dir|file) 在本地下载和缓存。成功返回缓存实体的实际位置,但我们只对确认此类身份确实存在感兴趣。

© www.soinside.com 2019 - 2024. All rights reserved.