Forgot to mention that I use 

ansible-playbook 1.5 (devel 27199dc219) last updated 2013/12/04 20:39:15 
(GMT +1100)

On Tuesday, February 4, 2014 11:32:14 AM UTC+11, Roman Revyakin wrote:
>
> Hi,
>
> I am not sure whether someone has come across this issue previously - 
> trying to search the group for 'when' and 'is defined' did not yield me 
> anything useful. So I am posting it as a new topic here.
> I have encountered that in case I use 'when:' clause where I need to test 
> whether one variable is set to 'true' and another one is defined, the 
> following playbook triggers action even if the first variable is 'false':
>
> cat > test_playbook.yaml <<EOF
> ---
> - hosts: all
>   gather_facts: false
>
>   tasks:
>     - name: Play only if var1 is true and var2 is defined
>       local_action: command echo "Yes {{ var1 }} is true and {{ var2 }} is 
> defined"
>       when: var1 and var2 is defined
> EOF
>
> $ ansible-playbook -i host -v test_playbook.yaml --extra-vars "var1=false 
> var2='something'"
>
> PLAY [all] 
> ******************************************************************** 
>
> TASK: [Play only if var1 is true and var2 is defined] 
> ************************* 
> changed: [localhost] => {"changed": true, "cmd": ["echo", "Yes false is 
> true and something is defined"], "delta": "0:00:00.003256", "end": 
> "2014-02-04 11:19:56.720699", "rc": 0, "start": "2014-02-04 
> 11:19:56.717443", "stderr": "", "stdout": "Yes false is true and something 
> is defined"}
>
> PLAY RECAP 
> ******************************************************************** 
> localhost                  : ok=1    changed=1    unreachable=0   
>  failed=0   
>  
> Only if I change the conditions to be supplied on separate 'when:' lines, 
> it works as expected:
>
> cat > test1_playbook.yaml <<EOF
> ---
> - hosts: all
>   gather_facts: false
>
>   tasks:
>     - name: Play only if var1 is true and var2 is defined
>       local_action: command echo "Yes {{ var1 }} is true and {{ var2 }} is 
> defined"
>       when: var2 is defined
>       when: var1
> EOF
>
> $ ansible-playbook -i host -v test_playbook.yaml --extra-vars "var1=false 
> var2='something'"
>
> PLAY [all] 
> ******************************************************************** 
>
> TASK: [Play only if var1 is true and var2 is defined] 
> ************************* 
> skipping: [localhost]
>
> PLAY RECAP 
> ******************************************************************** 
> localhost                  : ok=0    changed=0    unreachable=0   
>  failed=0   
>
> $ ansible-playbook -i host -v test_playbook.yaml --extra-vars "var1=true 
> var2='something'"
>
> PLAY [all] 
> ******************************************************************** 
>
> TASK: [Play only if var1 is true and var2 is defined] 
> ************************* 
> changed: [localhost] => {"changed": true, "cmd": ["echo", "Yes true is 
> true and something is defined"], "delta": "0:00:00.002733", "end": 
> "2014-02-04 11:22:20.289360", "rc": 0, "start": "2014-02-04 
> 11:22:20.286627", "stderr": "", "stdout": "Yes true is true and something 
> is defined"}
>
> PLAY RECAP 
> ******************************************************************** 
> localhost                  : ok=1    changed=1    unreachable=0   
>  failed=0   
>
> However in this case it fails (not skips) when the var2 is undefined and 
> var1 is true, which is not really a desired behaviour:
>
> $ ansible-playbook -i host -v test_playbook.yaml --extra-vars "var1=true"
>
> PLAY [all] 
> ******************************************************************** 
>
> TASK: [Play only if var1 is true and var2 is defined] 
> ************************* 
> fatal: [localhost] => One or more undefined variables: 'var2' is undefined
>
> FATAL: all hosts have already failed -- aborting
>
> PLAY RECAP 
> ******************************************************************** 
>            to retry, use: --limit @/Users/roman/test_playbook.yaml.retry
>
> localhost                  : ok=0    changed=0    unreachable=1   
>  failed=0   
>
> The order of  'when's also matters, in case their order is reverted like 
> follows
>
>       when: var1
>       when: var2 is defined
>
> the playbook starts behaving like in the first example where 'when' 
> conditions were supplied on one line using the 'and' operator.
> If I use 
>
>      when: var1==true and var2 is defined
>
> the playbook would skip the action even all conditions are satisfied: 
>
> $ ansible-playbook -i host -v test_playbook.yaml --extra-vars "var1=true 
> var2='defined'"
>
> PLAY [all] 
> ******************************************************************** 
>
> TASK: [Play only if var1 is true and var2 is defined] 
> ************************* 
> skipping: [localhost]
>
> PLAY RECAP 
> ******************************************************************** 
> localhost                  : ok=0    changed=0    unreachable=0   
>  failed=0   
>
> The 
> docs<http://docs.ansible.com/playbooks_conditionals.html#the-when-statement> 
> do 
> not shed any more light on that strange behaviour.
>
> Thanks a lot in advance,
>
> With kind regards,
> Roman
>

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to