Ansible with_subelements default value

ansible

Solution

Hm, looks like having a non-uniform structure for the elements in `sites` is something `with_subelements` doesn't like. And also that `item` doesn't contain the subelement you specified in the with_subelements list. You can do several things:

Make sure to have an `exec_init` list, even if it's empty. `with_subelements` will skip items with empty subelements. I think this is the best option, although a bit inconvenient when writing the playbook.

Don't use `with_subelements` and batch execute yourself (a bit ugly):

- name: Execute init scripts for all sites
  shell: "echo '{{item.exec_init | join(';')}}' | bash"
  when: item.exec_init is defined
  with_items: sites

Customize `with_subelements` so that it would items with the missing subelement. You can copy the original (mine is in `/usr/local/lib/python2.7/dist-packages/ansible/runner/lookup_plugins/with_subelements.py`) and put it in a `lookup_plugins` directory next to your playbook, under a different name (say `subelements_missingok.py`). Then change line 59 from:

raise errors.AnsibleError("could not find '%s' key in iterated item '%s'" % (subelement, item0))

to:

continue

Then your task can look like this:

- name: Execute init scripts for all sites
  debug: "msg={{item.1}}"
  with_subelements_missingok:
    - sites
    - exec_init

Problem

i have a vars definition like this: ``` sites: - site: mysite1.com exec_init: - "command1 to exec" - "command2 to exec" - site: mysite2.com ``` then i have play with the following task ``` - name: Execute init scripts for all sites shell: "{{item.1}}" with_subelements: - sites - exec_init when: item.0.exec_init is defined ``` The idea here is that i will have multiple "Site" definitions with dozens of other properties in my vars, then i would like to execute multiple Shell script commands for those sites having "exec_init" defined Doing it this way it just always skip executing the task, i've tried this in all combinations i can imagine but i just can't get it to work... Is this the proper way of doing it? maybe i'm trying to achieve something that doesn't make sense? Thanks for your help

Original source