如何在Salt状态下使用OrderedDict Jinja2变量?

时间:2018-04-09 12:42:00

标签: python jinja2 salt-stack

我正在尝试编写一个允许我模拟文件配置的Jinja宏。配置文件本身需要按顺序显示某些设置。我希望能够将dict作为可选变量传递给我的宏,以便我可以覆盖配置文件中的默认设置以及传递非默认设置。

例如,我的默认设置可能如下所示:

{% set default = {
   'default_setting': 'default_value',
   'another_default_setting': 'another_default_value',
} %}

我的新设置:

{% set new = {
   'default_setting': 'new_value',
   'new_setting': 'another_new_value',
} %}

然后在我的模板中:

{% set settings = salt['slsutil.merge'](default, new, 'overwrite') %}
{% for setting, value in settings.items() %}
{{ setting }} = {{ value }};
{% endfor %}

应该输出:

default_setting = new_value;
another_default_setting = another_default_value;
new_setting = another_new_value;

1 个答案:

答案 0 :(得分:0)

Jinja2中没有OrderedDict,因此您需要使用元组的元组代替默认设置。由于您的新设置仅是为了覆盖默认设置而不篡改原始顺序,因此应保留该命令。

{% set default = (
   ('name1', 'value1'),
   ('name2', 'value2'),
   ('name3', 'value3')
) %}

{% set new = {
   'name1': 'new_value1',
   'name2': 'new_value2',
} %}

{% for setting in default -%}
  {%- set name, value = setting %}
{{ name }} = {{ new[name] if name in new else value }};
{%- endfor -%}