仅当定义了复杂 JSON 中的项目时,如何 运行 Ansible 任务?
How to run Ansible task only when item in complex JSON is defined?
我有两个主机:
foo
bla
foo
没有host_vars
。 bla
有一个包含以下内容的 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
这将不起作用,因为 when
在 with_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
我有两个主机:
foo
bla
foo
没有host_vars
。 bla
有一个包含以下内容的 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
这将不起作用,因为 when
在 with_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