在SaltStack中合并Jinja模板的Pillar变量

45次阅读
没有评论

问题描述

在使用SaltStack时遇到了一个问题,他希望能够将多个Pillar变量合并到同一个Jinja变量中。他尝试使用以下代码进行合并,但是遇到了错误。

{%- import_yaml "server_list_de.yaml" as servers %}
{%- import_yaml "server_list_uk.yaml" as servers_uk %}
{%- servers.update(servers_uk) %}

然而,他收到了如下错误信息:

File "/usr/lib/python2.7/dist-packages/salt/utils/context.py", line 211, in __getitem__
return self._dict()[key]
KeyError: '_errors'

解决方案

请注意以下操作可能涉及版本差异,请做好备份并谨慎操作。

解决方案1:使用Map.jinja文件进行合并

在SaltStack中,通常使用map.jinja文件来执行类似的合并操作。以下是一个示例的map.jinja文件:

{%- load_yaml as serverlist %}
# 这里可以提供一个默认的服务器列表
{%- endload %}
{%- set serverlist2 = salt['grains.filter_by'](serverlist, merge=salt['pillar.get']('pillarname:server_list_de')) %}
{%- set servers = salt['grains.filter_by'](serverlist2, merge=salt['pillar.get']('pillarname:server_list_uk')) %}

在这个示例中,我们首先使用load_yaml指令加载一个服务器列表。然后,我们使用grains.filter_by函数来过滤服务器列表,将其与Pillar变量进行合并。最后,我们通过from指令在SLS文件的顶部引入这个map.jinja文件,这样合并后的变量就可以在SLS文件中使用了。

解决方案2:考虑Pillar合并的语法

根据你的描述,你希望将两个Pillar变量合并到同一个Jinja变量中。你可以尝试使用类似以下的语法:

{%- set servers = salt['pillar.get']('pillarname:server_list_de') | combine(salt['pillar.get']('pillarname:server_list_uk')) %}

在这个示例中,我们使用pillar.get函数来获取两个Pillar变量,并使用combine过滤器将它们合并到同一个Jinja变量中。

请注意,合并操作可能会因为Pillar变量的结构而有所不同,你可能需要根据实际情况进行调整。

总结

在SaltStack中,合并Jinja模板的Pillar变量可以通过创建map.jinja文件进行,或者使用适当的语法来实现。根据你的需求和Pillar变量的结构,选择合适的方法进行操作即可。记得在操作前备份,并仔细检查语法和配置,以确保安全和正确性。

正文完