Ansible-嵌套字典上的循环(无列表)
我找到了很多关于如何循环嵌套Ansible字典的答案,但每个都包含带有命名项的列表。我有一本没有列表的字典:Ansible-嵌套字典上的循环(无列表),ansible,Ansible,我找到了很多关于如何循环嵌套Ansible字典的答案,但每个都包含带有命名项的列表。我有一本没有列表的字典: xml_files: file1: key1: attr1: value1 attr2: value2 key2: attr1: value1 file2: key1: attr1: value1 此外,键(键1,键2),属性(attr1,attr2)及其值(value1,value2)是动态的,可以通过将
xml_files:
file1:
key1:
attr1: value1
attr2: value2
key2:
attr1: value1
file2:
key1:
attr1: value1
此外,键(键1,键2)
,属性(attr1,attr2)
及其值(value1,value2)
是动态的,可以通过将过滤器与从命令行发送的值相结合来添加/更新它们。只有文件名(文件1,文件2)
是已知的
现在,我想更新每个文件中由固定xpath指定的元素中每个属性的值
我用和_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 }}'
我希望保持字典的原样,如果可能的话,不要重建它以使用列表。不确定这是否是您想要的,但这就是我使用dict与在字典上交互的方式。您还需要使用loop\u control
从一个dict对象跳到另一个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
我设法用包含任务
和循环控制
来完成。我仍然会寻找更好的解决方案
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 }}'
谢谢,但是我不知道字典的键名(uid,state),所以我不能直接访问它们。默认情况下,我可能有一个空字典,用户可以发送额外的vars字典,并将其组合到此字典中。除非您创建单独的解析器来发现字典键,否则我认为您无法使用所需的方式与\u dict进行交互。Ansible需要这些正确交互的关键。