为什么ansible或有条件地给我带来意外的误报?

时间:2018-08-27 22:36:19

标签: ansible

鉴于以下原因由于when指令解析为FALSE而无法运行,

 - name: testin1
    command: echo 'hello'
    when: dig_output|d('') == ''

,并且由于when指令解析为FALSE导致以下任务也无法运行,

 - name: testin2
    command: echo 'hello'
    when: "'NOERROR' not in dig_output.results.0.stdout"

为什么当我期望它也不会运行时,以下任务出乎意料地运行?

  - name: testin3
    command: echo 'hello'
    when: (dig_output|d('') == '') or ("'NOERROR' not in dig_output.results.0.stdout")

1 个答案:

答案 0 :(得分:1)

  

为什么当我期望它也不会运行时,以下任务出乎意料地运行?

因为您在第二步中混淆了YAML引用中的义务,但是Python将所有非空字符串视为Truthy

观察:

- debug: msg="hello"
  when: False or ("hello world")

将运行,但是

- debug: msg="hello"
  when: False or ()

将无法运行。因此:

- command: echo 'hello'
  when: False or ("'NO ERROR' actually the rest does not matter")

是第三个示例的实际操作。您可能想要:

- command: echo 'hello'
  when: (dig_output|d('') == '') or ('NOERROR' not in dig_output.results.0.stdout)

因为将其从字符串文字更改为not in表达式,Python将对该表达式进行评估