Trying to skip a task when a dict variable is not defined.

2,240 views
Skip to first unread message

Heath Henjum

unread,
May 27, 2014, 3:25:17 PM5/27/14
to ansible...@googlegroups.com
Hi,  

I have a task defined as follows: 

- name: copy defgen paramfile
  template: src={{ item.key }}.prm.j2 dest={{ ogg_home }}/{{ item.value.pfileloc }}/{{ item.key }}.prm backup=yes
  when: defgensrc is defined and oggaction == 'defgensrc'
  with_dict: defgensrc

It is operating on two hosts in a group,  but one of the hosts does not have the dictionary defgensrc defined. 

So,  I get this error:  

fatal: [mn-ldvora01.rxhub.net] => with_dict expects a dict


Is there a way to conditionally skip this task when the dictionary is not defined,  

or would it be better to further refine my groups so that the host that is a "defgensrc" is in a specific child group and the one that is not a "defgensrc"

The two hosts are defined in a group called [mn-ogg]  because they are both oracle golden gate servers,  but one is the source of "defgen" and the other is the destination of the results of "defgen". 
(not that you probably need to know the details of all that)

Thanks in advance, 
Heath Henjum

James Cammarata

unread,
May 28, 2014, 8:01:26 AM5/28/14
to ansible...@googlegroups.com
You migh want to use set_fact on the hosts, when the dict is not defined, to give it some default value instead. As you've noticed, the "when" clause is applied to each item in the loop, so it's evaluated after the with_dict is parsed.


--
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/38518aa4-a610-48c3-ae40-7f356e19e399%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Michael DeHaan

unread,
May 28, 2014, 8:10:24 AM5/28/14
to ansible...@googlegroups.com
I don't like suggesting anyone should ever need set_fact, except in cases where it's occasionally needed to multiply a variable or something, as in most cases Ansible lazy-evaluates variables, and in most cases those expressions can just be written in the "vars" section.

I'd do this:

  with_dict: defgensrc | default({})

In this case, the dict is empty when it has no value, which means the statement is skipped.




Heath Henjum

unread,
May 29, 2014, 11:18:26 AM5/29/14
to ansible...@googlegroups.com
Thanks!   I'm new to Ansible, and just learning. 
Reply all
Reply to author
Forward
0 new messages