Ansible set_fact和if in循环不工作?



这是我的剧本:

---
- hosts: localhost
vars:
myvar: "none"
tasks:
- name: set new value
set_fact:
myvar: "{% if myvar == 'none' %}{{ item }}{% endif %}"
loop:
- aaa
- bbb
- ccc
- name : print myvar
debug:
msg: "myvar is {{ myvar }}"

及其结果:

TASK [set new value] *******************************************************************************************************************************************
ok: [localhost] => (item=aaa)
ok: [localhost] => (item=bbb)
ok: [localhost] => (item=ccc)
TASK [print myvar] *********************************************************************************************************************************************
ok: [localhost] => {
"msg": "myvar is "
}

为什么myvar不是"aaa"?

如何在不使用when:子句的情况下改变我的测试以给出正确的值,即仅使用if?

PS:我有这句话告诉Stackoverflow,我的问题并不主要是代码,并看到我的问题被接受:)

实现的逻辑中似乎有错误。下面的示例将显示这一点。

---
- hosts: localhost
become: false
gather_facts: false
vars:
myvar: "none"
tasks:
- name: Show new value
debug:
msg: "{% if myvar == 'none' %}{{ item }}{% endif %}"
loop:
- first
- second
- name: Set new value
set_fact:
myvar: "{% if myvar == 'none' %}{{ item }}{% else %}not none{% endif %}"
loop:
- first
- second
- name: Show new value
debug:
msg: "myvar was {{ myvar }}"

因此,仅仅输出该值将导致输出

TASK [Show new value] *************
ok: [localhost] => (item=first) =>
msg: first
ok: [localhost] => (item=second) =>
msg: second

使用该方法设置值不会导致输出

TASK [Set new value] ***********
ok: [localhost] => (item=first)
ok: [localhost] => (item=second)
TASK [Show new value] **********
ok: [localhost] =>
msg: myvar was not none

这是因为在第二次运行时,myvar的值已经是first,而不是none,因此条件{% if myvar == 'none' %}不能到位。看到

- name: Set new value
set_fact:
myvar: "{% if myvar == 'none' %}{{ item }}{% else %}not none{% endif %}"
loop:
- first
- name: Show new value
debug:
msg: "myvar was {{ myvar }}"

,因为它将导致输出

TASK [Set new value] **********
ok: [localhost] => (item=first)
TASK [Show new value] *********
ok: [localhost] =>
msg: myvar was first

总结

Ansibleset_factandifinloopnot work

按预期工作,

为什么myvar不是aaa?

,因为条件不满足。

如何在不使用when子句的情况下改变我的测试以给出正确的值,即仅使用if?

即使我不清楚你想要实现什么,引入{% else %}可能会有所帮助。

{% if myvar == 'none' %}{{ item }}{% else %}not none{% endif %}

最新更新