Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ansible Jinja2 if/else与两者匹配_Ansible_Jinja2 - Fatal编程技术网

Ansible Jinja2 if/else与两者匹配

Ansible Jinja2 if/else与两者匹配,ansible,jinja2,Ansible,Jinja2,我正试图在ansible模板中使用if/else语句来根据我的主机名填充值。我已经编写了一个模块,解析主机名并将值作为事实添加。我能够在我的剧本中使用这些事实,但在获得正确使用它们的if/else语句时遇到了困难。最后,if和else都匹配,所以这两个值都会出现在我的文件中 jinja2模板 {% for host in groups['tag_Function_logfe'] %} {% if hostvars[host]['tt_number'] == "01" %} is_master =

我正试图在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 %}
可靠的事实:

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
结果:

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循环在给定组中的主机上迭代,并为每个主机声明
是\u master
。这将在模板的每个实例中产生多个定义,等于“tag_Function_logfe”组中的主机数

这对我来说似乎没有意义,因为我假设每个主机只有一个
is\u master
定义

也许您想要做的是在模板中包含以下内容:

{% if inventory_hostname in groups['tag_Function_logfe'] %}
    {% if tt_number == "01" %}
        is_master = true
    {% else %}
        is_master = false
    {% endif %}
{% endif %}
inventory\u hostname
指向Ansible目前正在使用的主机。我们显然想检查此主机是否属于“tag\u Function\u logfe”组,如果不是,我们根本不定义
是主主机

然后,我们想根据
tt\U number
确定
是\u master
应该有什么值。注意,我们不需要使用
hostvars
,因为我们只访问模板呈现到配置文件中的当前主机的
tt\u number


可能可以进一步取消组成员资格测试,但如果不查看其余配置,就很难判断。我不知道您总体上想做什么,但Ansible和Jinja的行为似乎与本例中记录的一样,因此其他地方可能存在误解

您有一个Ansible将在每个主机上呈现到配置文件中的模板。在此模板中,for循环在给定组中的主机上迭代,并为这些主机中的每个主机声明
is\u master
。这将导致模板的每个实例中都有多个定义,等于“tag\u Function\u logfe”中的主机数“小组

这对我来说似乎没有意义,因为我假设每个主机只有一个
is\u master
定义

也许您想要做的是在模板中包含以下内容:

{% if inventory_hostname in groups['tag_Function_logfe'] %}
    {% if tt_number == "01" %}
        is_master = true
    {% else %}
        is_master = false
    {% endif %}
{% endif %}
inventory\u hostname
指向Ansible目前正在使用的主机。我们显然想检查此主机是否属于“tag\u Function\u logfe”组,如果不是,我们根本不定义
是主主机

然后,我们想根据
tt\U number
确定
是\u master
应该有什么值。注意,我们不需要使用
hostvars
,因为我们只访问模板呈现到配置文件中的当前主机的
tt\u number


可能可以进一步取消组成员资格测试,但如果不查看其余的配置,就很难判断这一点。

太好了,效果非常好!我可以删除组成员资格测试,我使用它来拉入主机,然后检查hostvars,我没有意识到我可以像这样直接访问事实!Grea这很好!我可以删除组成员资格测试,我用它来拉入主机,然后检查hostvars,没有意识到我可以像这样直接访问事实!