与Ansible混淆为什么会这样。看来布尔人没有非常明确地正常工作。我没有使用任何其他方法来使用set_fact而不使用感觉它可能是罪魁祸首的Jinja2语法。有人能说清楚吗?
- hosts: 127.0.0.1
connection: local
tasks:
- set_fact:
im_defined: "something"
im_false: "{{1 == 2}}"
- name: this should be skipped
debug: msg="SHOULD NOT SEE THIS MESSAGE! im_defined={{im_defined}} im_false={{im_false}}"
when: im_defined is defined and im_false
> ansible-playbook ansible-test.yml
PLAY [127.0.0.1] **************************************************************
GATHERING FACTS ***************************************************************
ok: [127.0.0.1]
TASK: [set_fact ] *************************************************************
ok: [127.0.0.1]
TASK: [this should be skipped] ************************************************
ok: [127.0.0.1] => {
"msg": "SHOULD NOT SEE THIS MESSAGE! im_defined=something im_false=False"
}
PLAY RECAP ********************************************************************
127.0.0.1 : ok=3 changed=0 unreachable=0 failed=0
如果我将更改为时更改为
when: im_defined is defined and im_false == True
按预期工作:
TASK: [this should be skipped] ************************************************
skipping: [127.0.0.1]
答案 0 :(得分:3)
这背后的原因是,你的事实im_false
实际上是一个字符串,而不是一个布尔值。
我测试了一下,im_false == True
和im_false == False
在这里有相同的结果,所以我猜它确实检查它是否为真而不是Truthy。
检查的正确方法是使用转换过滤器:
when: im_defined is defined and im_false|bool