When

You can evaluate a single command against multiple conditions by listing boolean expressions under the when command with - hyphens, the command will only run if all conditions evaluate to true. In the example below the debug command will not execute because not all conditions are true.

- name: Do something
  debug:
    msg: Some message
  when:
    - true
    - false

There is also a subtlety in the order of evaluation. The evaluation process of when stops as soon as a false condition is found. In the example below the second true condition does not get evaluated because the when commands evaluation stops being evaluated when it encounters its first false.

- name: Do something
  debug:
    msg: Some message
  when:
    - false    
    - true # this never gets evaluated

This allows you to do useful things with uninitialised variables that might break upon evaluation which also rely on conditions further up the chain. In the example below, if the some-CLI command fails it will return an empty string, and so, when we want to Do Something with the property component of the expected JSON object it will fail when trying to evaluate that property for a specific state, in this case, done. By checking that json_cli_result is not empty first we can ensure that the evaluation on json_cli_property works, if json_cli_result is indeed empty then the value of property is never evaluated and causes no errors.

- name: Load some JSON
  command: some-CLI-that-gets-JSON
  register: json_cli_result

- name: Get some JSON property
  set_fact:
    json_cli_property: ""
  when: json_cli_result != ''

- name: Do something with JSON property
  command: do-something-with ""
  when:
    - json_cli_result != ''
    - json_cli_property == 'done'