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

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

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.

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.

Thanks! I’m new to Ansible, and just learning.