Jinja2 if/else 两者都匹配

twe*_*200 1 jinja2 ansible

我正在尝试在 ansible 模板中使用 if/else 语句来根据我的主机名填充值。我编写了一个模块来解析主机名并将值添加为事实。我可以在我的剧本中使用这些事实,但无法获得 if/else 语句来正确使用它们。我最终得到了 if 和 else 匹配,因此这两个值最终都出现在我的文件中。

jinja2 模板

{% for host in groups['tag_Function_logfe'] %}
{% if hostvars[host]['tt_number'] == "01" %}
is_master = true
{% else %}
is_master = false
{% endif %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

Ansible 事实:

ok: [node1] => {"ansible_facts": {"tt_number": "01"}, "changed": false, "msg": "Additional facts added successfully"}
ok: [node2] => {"ansible_facts": {"tt_number": "02"}, "changed": false, "msg": "Additional facts added successfully"}
Run Code Online (Sandbox Code Playgroud)

结果:

is_master = true
is_master = false
Run Code Online (Sandbox Code Playgroud)

Ant*_*off 5

我不知道您\xe2\x80\x99t 总体上想要做什么,但 Ansible 和 Jinja 的行为似乎与本例中记录的一样,因此其他地方可能存在误解。

\n\n

您有一个模板,Ansible 会将其呈现到每个主机上的配置文件中。在此模板中,for 循环迭代给定组中的主机并is_master为每个主机进行声明。这将导致模板的每个实例中都有多个定义,等于 \xe2\x80\x9ctag_Function_logfe\xe2\x80\x9c 组中的主机数。

\n\n

这对我来说似乎没有意义,因为我假设每个主机只有一个is_master定义。

\n\n

也许您想做的是将其添加到模板中:

\n\n
{% if inventory_hostname in groups[\'tag_Function_logfe\'] %}\n    {% if tt_number == "01" %}\n        is_master = true\n    {% else %}\n        is_master = false\n    {% endif %}\n{% endif %}\n
Run Code Online (Sandbox Code Playgroud)\n\n

inventory_hostname此时 Ansible 正在使用主机的点。我们显然想检查该主机是否属于 \xe2\x80\x9ctag_Function_logfe\xe2\x80\x9d 组,如果它不属于\xe2\x80\x99t,我们根本不定义\xe2\x80\x99t is_master

\n\n

然后我们要根据 确定is_master应该具有什么值tt_number。请注意,我们不需要使用\xe2\x80\x99t hostvars,因为我们tt_number仅针对模板渲染到配置文件中的当前主机访问\xe2\x80\x99s 值。

\n\n

它\xe2\x80\x99s可能可以进一步消除组成员资格测试,但是\xe2\x80\x99s在不查看配置的其余部分的情况下很难判断。

\n