Jinja2 if/else 匹配两者
Jinja2 if/else matching both
我正在尝试在 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 %}
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
的值。
可能可以进一步消除组成员资格测试,但如果不查看其余配置就很难判断。
我正在尝试在 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 %}
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
的值。
可能可以进一步消除组成员资格测试,但如果不查看其余配置就很难判断。