Ansible not evaluating parameters correctly

70 views
Skip to first unread message

Petar Petkov

unread,
May 18, 2015, 11:52:07 AM5/18/15
to ansible...@googlegroups.com
Lets suppose we have the following code sample:

- name: Bug report
  hosts
: localhost
  gather_facts
: no
  connection
: local
  vars
:
    foo
: no
    bar
: "{{ foo }}"
  tasks
:
   
- debug: msg='This should not be skipped!'
     
when: not bar


Seeing the code one would expect that the message "This should not be skipped" is displayed when the code is executed. In reality, however, the code gets skipped because the bar parameter is not correctly resolved to its value no. Rewriting the when clause to look like this:
when: not {{ bar }}

seems to fix the problem. 
Also it seems that this problem is only caused when the not operator is used, because if I use the following code sample:

- name: Bug report
  hosts: localhost
  gather_facts: no
  connection: local
  vars:
    foo: yes
    bar: "{{ foo }}"
  tasks:
    - debug: msg='This should not be skipped!'
      when: bar


everything seems to work as expected.

So is this a bug (perhaps a known issue) or am I doing something wrong?

Matt Martz

unread,
May 18, 2015, 12:11:50 PM5/18/15
to ansible...@googlegroups.com
This is mostly due to how ansible casts values when dereferencing.

It is always safest to use the |bool filter when evaluating a variable that you think should be a boolean.

Such as:

when: not bar|bool

Otherwise, in your example it is evaluating the string value "no" instead of a falsely YAML no value.  And a non-zero length string evaluates as truthy.

--
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 ansible-proje...@googlegroups.com.
To post to this group, send email to ansible...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/75974d5e-0fc8-4d37-b088-9950ff0abe5c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



--
Matt Martz
@sivel
sivel.net

Ivaylo Bratoev

unread,
May 18, 2015, 2:53:54 PM5/18/15
to ansible...@googlegroups.com
Seems related to:
https://github.com/ansible/ansible/issues/5094 
https://github.com/ansible/ansible/issues/10460
https://groups.google.com/forum/#!searchin/ansible-project/boolean/ansible-project/PcVKMT0Mw9Y/gVqt8YdCpVUJ

It seems this is a source of a lot of confusion. Looking at it - it should be a best practice to use the *bool* filter whenever you use *when*. The documentation doesn't do that and this leads to confusion.

I am interested on the opinions of others - can this be fixed in Ansible to work as expected or should casting to *bool* should be a best practice in *when*-s? 
Reply all
Reply to author
Forward
0 new messages