仅当定义了复杂 JSON 中的项目时,如何 运行 Ansible 任务?

How to run Ansible task only when item in complex JSON is defined?

我有两个主机:

foo没有host_varsbla 有一个包含以下内容的 host_vars 文件:

---
# host_vars/bla
'a': {
  'b': {
    'c': 'string'
  }
}

当复杂 JSON 存在并且包含项目 b 时,我的任务应该只 运行。我的逻辑是:当 a 存在并且有项目 b 那么它也有 c.

我的任务如下:

---
- 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

结果

此任务在 bla 时成功(因为它具有正确的 JSON)但在 foo 时失败,缺少 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'})

预计

skipping: [foo]: => (item={u'dest': u'/tmp/', u'owner': u'root'})
ok: [bla] => (item={u'dest': u'/tmp/string', u'owner': u'root'})

通知

现在我知道 when 语句是为每个项目解释的,因此它不会起作用。有人可以提供有效的解决方案吗?

Ansible 版本为 2.2.0

编辑

---
- 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

这将不起作用,因为 whenwith_items 之后计算,只要 a['b'] 未定义,它就会失败。

fatal: [foo]: FAILED! => {"failed": true, "msg": "'dict object' has no attribute 'b'"}

找到有用的东西:

- name: example task
  file:
    dest: "{{ item.dest }}"
    owner: "{{ item.owner }}"
    state: directory
  with_items:
    - { dest: "/tmp/{{ (a['b'] | default({}))['c'] | default('nA') }}", owner: root }
  when: a['b'] is defined