Jinja2 if/else matching both



我试图在一个可见的模板中使用if/else语句来根据我的主机名填充值。我编写了一个模块来解析主机名并将值作为事实添加。我能够在我的剧本中使用这些事实,但我很难得到一个if/else语句来正确使用它们。最后if和else都匹配了所以这两个值都在我的文件中。

<<p> jinja2模板/strong>
{% for host in groups['tag_Function_logfe'] %}
{% if hostvars[host]['tt_number'] == "01" %}
is_master = true
{% else %}
is_master = false
{% endif %}
{% endfor %}

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"}

结果:

is_master = true
is_master = false

我不知道你想要做什么,但是Ansible和Jinja在这种情况下似乎表现得像文档一样,所以可能在其他地方有误解。

你有一个模板,Ansible会在每个主机上渲染成配置文件。在这个模板中,for循环遍历给定组中的主机,并为每个主机声明is_master。这将导致在模板的每个实例中都有多个定义,等于"tag_Function_logfe"组中的主机数量。

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

也许你想做的是在模板中加入这个:

{% if inventory_hostname in groups['tag_Function_logfe'] %}
    {% if tt_number == "01" %}
        is_master = true
    {% else %}
        is_master = false
    {% endif %}
{% endif %}

inventory_hostname指向Ansible正在使用的主机。我们显然想要检查这个主机是否属于"tag_Function_logfe"组,如果不属于,我们就根本不定义is_master

然后我们要根据tt_number确定is_master的值。请注意,我们不需要使用hostvars,因为我们只对当前主机访问tt_number的值,模板被呈现到配置文件中。

进一步消除组成员资格测试可能是可能的,但如果不查看其余配置,则很难判断。

最新更新