我试图在ansible模板中使用if / else语句来根据我的主机名填充值。我编写了一个解析主机名并将值添加为事实的模块。我可以在我的剧本中使用这些事实但是在获取if / else语句时无法正确使用它们。我最终得到了if和else匹配,因此这两个值最终都在我的文件中。
jinja2模板
Net::SSH.start("1.2.3.4", keys: ["~/.ssh/id_rsa.pub"]) do |ssh|
ssh.exec!(cmd_item)
end
Ansible Facts:
{% for host in groups['tag_Function_logfe'] %}
{% if hostvars[host]['tt_number'] == "01" %}
is_master = true
{% else %}
is_master = false
{% endif %}
{% endfor %}
结果:
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"}
答案 0 :(得分:3)
我没有全面了解你要做的整体事情,但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
。
然后我们想根据is_master
确定tt_number
应具有的值。请注意,我们不需要使用hostvars
,因为我们只访问将模板呈现到配置文件中的当前主机的tt_number
值。
可能会进一步消除群组成员资格测试,但如果不查看其余配置,则很难判断。