I have two hosts:
foobla
foo has no host_vars. bla has a host_vars file with this content:
---
# host_vars/bla
'a': {
'b': {
'c': 'string'
}
}
my task should only run when the complex JSON exists and contains the item b. My logic would be: when a exists and has item b then it has also c.
My task looks like:
---
- name: example task
file:
dest: "{{ item.dest }}"
owner: "{{ item.owner }}"
state: directory
with_items:
- { dest: "/tmp/{{ a['b']['c'] }}", owner: root }
when: a['b'] is defined
result
this task succeeds for bla (cause it has the correct JSON) but fails for foo which misses the JSON.
fatal: [foo]: FAILED! => {"failed": true, "msg": "'dict object' has no attribute 'b'"}
ok: [bla] => (item={u'dest': u'/tmp/string', u'owner': u'root'})
expected
skipping: [foo]: => (item={u'dest': u'/tmp/', u'owner': u'root'})
ok: [bla] => (item={u'dest': u'/tmp/string', u'owner': u'root'})
notice
Now I know that the when statement is interpreted for each item therefore it will not work. Could someone provide a solution that works?
Ansible version is 2.2.0
edit
---
- name: example task
file:
dest: "{{ item.dest }}"
owner: "{{ item.owner }}"
state: directory
with_items:
- { dest: "/tmp/{{ a['b']['c'] | default([]) }}", owner: root }
when: a['b'] is defined
this will not work because when is evaluated after with_items and as long as a['b'] is not defined it will fail.
fatal: [foo]: FAILED! => {"failed": true, "msg": "'dict object' has no attribute 'b'"}
found something that works: