Ansible中set_fact结合loop内if语句失效问题排查
Ansible Playbook变量赋值问题分析与解决
原Playbook代码
--- - 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 " }
问题原因
循环执行set_fact时,每次迭代按顺序处理:
- 第一次迭代(item=aaa):
myvar初始值为"none",满足if条件,成功赋值为"aaa"; - 第二次迭代(item=bbb):此时
myvar已变为"aaa",不满足myvar == 'none'的条件,模板输出为空字符串,set_fact将myvar覆盖为空; - 第三次迭代(item=ccc):
myvar为空,仍不满足条件,再次赋值为空;
最终myvar的值为空字符串,而非预期的"aaa"。
解决方法(不使用when子句,仅修改if逻辑)
修改set_fact中的模板逻辑,当条件不满足时保留当前myvar的值,避免被覆盖为空:
--- - hosts: localhost vars: myvar: "none" tasks: - name: set new value set_fact: myvar: "{% if myvar == 'none' %}{{ item }}{% else %}{{ myvar }}{% endif %}" loop: - aaa - bbb - ccc - name : print myvar debug: msg: "myvar is {{ myvar }}"
修改后执行,myvar会被赋值为"aaa"并在后续迭代中保留该值,最终输出myvar is aaa。
内容的提问来源于stack exchange,提问作者troubadour
相关产品推荐
相关产品推荐

