Ansible条件与何时

时间:2015-11-25 17:32:02

标签: ansible

与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]

1 个答案:

答案 0 :(得分:3)

这背后的原因是,你的事实im_false实际上是一个字符串,而不是一个布尔值。

我测试了一下,im_false == Trueim_false == False在这里有相同的结果,所以我猜它确实检查它是否为真而不是Truthy。

检查的正确方法是使用转换过滤器:

when: im_defined is defined and im_false|bool

另见this bug report