Ansible with_items if item is defined

The reason for this behavior is conditions work differently inside loops. If a loop was defined the condition is evaluated for every item while iterating over the items. But the loop itself requires a valid list.

This is also mentioned in the docs:

Note that when combining when with with_items (see Loops), be aware that the when statement is processed separately for each item. This is by design:

tasks:
  - command: echo {{ item }}
    with_items: [ 0, 2, 4, 6, 8, 10 ]
    when: item > 5

I think this is a bad design choice and for this functionality they better should have introduced something like with_when.

As you have already figured out yourself, you can default to an empty list.

with_items: "{{ symlinks  | default([]) }}"

Finally if the list is dynamically loaded from a var, say x, use:

with_items: "{{ symlinks[x|default('')] | default([])}}" 

This will default to an empty list when 'x' is undefined

Accordingly, fall back to an empty dict with default({}):

# service_facts skips, then dict2items fails?
with_dict: "{{ ansible_facts.services|default({})|dict2items|selectattr('key', 'match', '[^@]+@.+\\.service')|list|items2dict }}"

with_items: "{{ symlinks | default([]) }}"

Tags:

Ansible