我正在尝试在 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 %}
Run Code Online (Sandbox Code Playgroud)
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"}
Run Code Online (Sandbox Code Playgroud)
结果:
is_master = true
is_master = false
Run Code Online (Sandbox Code Playgroud)
我不知道您\xe2\x80\x99t 总体上想要做什么,但 Ansible 和 Jinja 的行为似乎与本例中记录的一样,因此其他地方可能存在误解。
\n\n您有一个模板,Ansible 会将其呈现到每个主机上的配置文件中。在此模板中,for 循环迭代给定组中的主机并is_master
为每个主机进行声明。这将导致模板的每个实例中都有多个定义,等于 \xe2\x80\x9ctag_Function_logfe\xe2\x80\x9c 组中的主机数。
这对我来说似乎没有意义,因为我假设每个主机只有一个is_master
定义。
也许您想做的是将其添加到模板中:
\n\n{% if inventory_hostname in groups[\'tag_Function_logfe\'] %}\n {% if tt_number == "01" %}\n is_master = true\n {% else %}\n is_master = false\n {% endif %}\n{% endif %}\n
Run Code Online (Sandbox Code Playgroud)\n\ninventory_hostname
此时 Ansible 正在使用主机的点。我们显然想检查该主机是否属于 \xe2\x80\x9ctag_Function_logfe\xe2\x80\x9d 组,如果它不属于\xe2\x80\x99t,我们根本不定义\xe2\x80\x99t is_master
。
然后我们要根据 确定is_master
应该具有什么值tt_number
。请注意,我们不需要使用\xe2\x80\x99t hostvars
,因为我们tt_number
仅针对模板渲染到配置文件中的当前主机访问\xe2\x80\x99s 值。
它\xe2\x80\x99s可能可以进一步消除组成员资格测试,但是\xe2\x80\x99s在不查看配置的其余部分的情况下很难判断。
\n 归档时间: |
|
查看次数: |
8779 次 |
最近记录: |