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)是动态的,可以通过将

我找到了很多关于如何循环嵌套Ansible字典的答案,但每个都包含带有命名项的列表。我有一本没有列表的字典:

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需要这些正确交互的关键。