我试图在一个可见的模板中使用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
的值,模板被呈现到配置文件中。
进一步消除组成员资格测试可能是可能的,但如果不查看其余配置,则很难判断。