Ansible 2.0 with_items failing on variable that doesn't exist even though it is in where clause.

604 views
Skip to first unread message

Alan LaCombe

unread,
Nov 23, 2015, 6:33:15 PM11/23/15
to Ansible Project
This test playbook used to work in ansible 1.9.x and is no longer working. I have no variables (foo or  php_packages)defined for this example.

---
- debug: msg "Foo is " {{ foo }}
 
when: foo is defined

- debug: msg "Foo is " {{ foo }}
  when: php_packages is defined

- name: Install generic php
  yum
: name={{ item }} enablerepo=epel state=present
  with_items
:
   
- php
 
when: php_packages is not defined

- name: Install php and packages from php_packages
  yum
: name={{ item }} enablerepo=epel state=present
  with_items
: [ '{{ php_packages }}' ]
 
when: php_packages is defined


I am getting 

PLAY [configure and deploy the webservers and application code] ****************

TASK [setup] *******************************************************************
ok: [localhost]

TASK [test : debug] ************************************************************
skipping: [localhost]

TASK [test : debug] ************************************************************
skipping: [localhost]

TASK [test : Install generic php] **********************************************
ok: [localhost] => (item=[u'php'])

TASK [test : Install php and packages from php_packages] ***********************
fatal: [localhost]: FAILED! => {"failed": true, "msg": "ERROR! 'php_packages' is undefined"}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=1


The debug steps acts correctly so I assume the when clause is working as expected. 

Brian Coca

unread,
Nov 23, 2015, 6:39:23 PM11/23/15
to Ansible Project
This has not changed, when: always executes after with_ : , this is so
you can use 'item' in your when clause to conditionally execute each
loop iteration. This means you CANNOT use it to prevent an undefined
error in with_, you need to use default([]) to provide an empty list,
which will skip the task:

- name: Install php and packages from php_packages
yum: name={{ item }} enablerepo=epel state=present
with_items:
- '{{ php_packages|default([]) }}'


--
Brian Coca

Matt Martz

unread,
Nov 23, 2015, 6:40:13 PM11/23/15
to ansible...@googlegroups.com
When statements are evaluated for every loop of with_items.  So your when statement will not prevent ansible from attempting to loop over the value.

You will need to ensure that the value is at least an empty list.  Something like:

- name: Install php and packages from php_packages
  yum
: name={{ item }} enablerepo=epel state=
present
  with_items
: php_packages|default([])

The side effect, is that you also don't need to check that it is defined, as the default filter will set it to an empty list which has no iterations, if the var was not defined to begin with.

--
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/6aaa9fb5-dfa7-40f9-bbd5-5262e25152ed%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



--
Matt Martz
@sivel
sivel.net

Alan LaCombe

unread,
Nov 23, 2015, 7:02:17 PM11/23/15
to Ansible Project
Thanks Brian (and Matt) the |default([]) did fix it.  I did test it on 1.9.4 as presented and it did work. Here is my output 

[vagrant@ansibleserver provisioning]$ ansible --version
ansible
1.9.4
  configured
module search path = /usr/share/ansible


[vagrant@ansibleserver provisioning]$ ansible-playbook -i host test.yml


PLAY
[configure and deploy the webservers and application code] ***************


GATHERING FACTS
***************************************************************
ok
: [localhost]


TASK
: [test | debug msg "Foo is " {{ foo }}] **********************************
skipping
: [localhost]


TASK
: [test | debug msg "Foo is " {{ foo }}] **********************************

skipping
: [localhost]


TASK
: [test | Install generic php] ********************************************

changed
: [localhost] => (item=php)


TASK
: [test | Install php and packages from php_packages] *********************
skipping
: [localhost]


PLAY RECAP
********************************************************************
localhost                  
: ok=2    changed=1    unreachable=0    failed=0

You can see the step does get skipped when running on 1.9.4
Reply all
Reply to author
Forward
0 new messages