Jinja2 if / else匹配两者

时间:2016-06-28 03:40:44

标签: ansible jinja2

我试图在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"}

1 个答案:

答案 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值。

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