这是我的剧本:
---
- 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
总结Ansible
set_fact
andif
inloop
not work
按预期工作,
为什么
myvar
不是aaa
?
,因为条件不满足。
如何在不使用
when
子句的情况下改变我的测试以给出正确的值,即仅使用if
?
即使我不清楚你想要实现什么,引入{% else %}
可能会有所帮助。
{% if myvar == 'none' %}{{ item }}{% else %}not none{% endif %}