Ansible-循环嵌套字典(无列表)

时间:2019-09-05 15:20:27

标签: ansible

我找到了很多有关如何循环嵌套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 }}'

我想保留字典原样,并且尽可能不重建它以使用列表。

2 个答案:

答案 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_tasksloop_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 }}'