我找到了很多有关如何循环嵌套Ansible字典的答案,但是每个字典都包含带有命名项的列表。我有一本没有列表的字典:
xml_files:
file1:
key1:
attr1: value1
attr2: value2
key2:
attr1: value1
file2:
key1:
attr1: value1
此外,键(key1, key2)
,属性(attr1, attr2)
及其值(value1, value2)
是动态的,可以通过combine
过滤器使用从命令行发送的值来添加/更新它们。仅文件名(file1, file2)
是已知的。
现在,我想更新每个文件中由固定xpath指定的元素中每个属性的值。
我为每个文件尝试了with_dict
的任务,但我不知道如何获取属性名称和值。我还需要为每个属性运行任务。
- name: update XML values in file1
xml:
path: '/path/to/file1/{{ item.key }}'
xpath: '/some/xpath'
attribute: '{{ ??? }}'
value: '{{ ??? }}'
with_dict: '{{ xml_files.file1 }}'
- name: update XML values in file2
xml:
path: '/path/to/file2/{{ item.key }}'
xpath: '/different/xpath'
attribute: '{{ ??? }}'
value: '{{ ??? }}'
with_dict: '{{ xml_files.file2 }}'
我想保留字典原样,并且尽可能不重建它以使用列表。
答案 0 :(得分:0)
不确定这是否是您要查找的内容,但这就是我使用with_dict
通过字典进行交互的方式。同样,您需要使用loop_control
才能从一个dict对象跳转到另一个。
playbook
---
- name: Manage users group
group:
name: "{{ item.key }}"
gid: "{{ item.value.uid }}"
state: "{{ item.value.state }}"
with_dict: '{{ adminusers }}'
loop_control:
label: "{{ item.key }}"
Dictionary file
---
adminusers:
a123:
uid: 123
realname: "Brian"
groups: admin
state: absent
a456:
uid: 456
realname: "john"
groups: admin
state: present
答案 1 :(得分:0)
我设法用include_tasks
和loop_control
做到了。我仍然会寻找更好的解决方案。
xml_files:
file1:
key1:
attr1: value1
attr2: value2
file2:
key1:
attr1: value1
my_task.yml
-----------
- include_tasks: set_xml.yml file='file1' xpath='/some/xpath'
with_dict: '{{ xml_files.file1 }}'
loop_control:
loop_var: xml_keys
- include_tasks: set_xml.yml file='file2' xpath='/different/xpath'
with_dict: '{{ xml_files.file2 }}'
loop_control:
loop_var: xml_keys
set_xml.yml
-----------
- name: update XML values in {{ file }}
xml:
path: '/path/to/file/{{ file }}.xml'
xpath: '{{ xpath }}'
attribute: '{{ item.key }}'
value: '{{ item.value }}'
with_dict: '{{ xml_keys.value }}'