Hi Adam,
I do not think so, please see my example above with the
ansible-playbook -i host -v test_playbook.yaml --extra-vars "var1=false
var2='something'"
being executed as expected (skipped). In case var1 was a string, the
when: var2 is defined
when: var1
conditions would evaluate to true IMHO and the action would be triggered.
On Tue, Feb 4, 2014 at 11:38 AM, Adam Heath <[email protected]> wrote:
> "false" != false. You have a string/boolean issue. Aka, the var1 is not
> the boolean value false, but the string value "false".
>
>
> On 02/03/2014 06:32 PM, 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.
>>
>
> --
> You received this message because you are subscribed to a topic in the
> Google Groups "Ansible Project" group.
> To unsubscribe from this topic, visit https://groups.google.com/d/
> topic/ansible-project/YPfK1KYpQeI/unsubscribe.
> To unsubscribe from this group and all its topics, 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.
>
--
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.