如何在ansible中用字典列表在字典中循环?

时间:2020-10-27 14:16:30

标签: ansible

我具有以下结构

volumeGroupName:
  - name: datavg1
    log_lv:
      name: logs_lv
      size: "1G"
    app_lv:
      name: apps_lv
      size: 2G
    project_lv:
      name: projects_lv
      size: 3G
  - name: datavg2
    log_lv:
      name: logs_lv
      size: "4G"

我想遍历所有项目。我尝试使用的是 with_subelements ,但是我只能得到一个类别,例如 apps_lvm ,我也尝试了 wih_dict 属性,但是我无法获得什么我想要。

也许我用于变量的结构不是正确的结构?

1 个答案:

答案 0 :(得分:0)

从字典列表中创建列表字典。例如

    - set_fact:
        GroupVolumeList: "{{ dict(my_groups|zip(my_volumes)) }}"
      vars:
        my_groups: "{{ volumeGroupName|map(attribute='name')|list }}"
        my_volumes: "{{ volumeGroupName|map('dict2items')|list }}"
    - debug:
        var: GroupVolumeList

给予

  GroupVolumeList:
    datavg1:
    - key: name
      value: datavg1
    - key: log_lv
      value:
        name: logs_lv
        size: 1G
    - key: app_lv
      value:
        name: apps_lv
        size: 2G
    - key: project_lv
      value:
        name: projects_lv
        size: 3G
    datavg2:
    - key: name
      value: datavg2
    - key: log_lv
      value:
        name: logs_lv
        size: 4G

然后使用 with_subelements 。例如

    - debug:
        msg: "{{ item.0.key }}
              {{ item.1.key }}
              {{ item.1.value.name }}
              {{ item.1.value.size }}"
      with_subelements:
        - "{{ GroupVolumeList|dict2items }}"
        - value
      when: item.1.key != 'name'

给予(删节)

  msg: datavg1 log_lv logs_lv 1G
  msg: datavg1 app_lv apps_lv 2G
  msg: datavg1 project_lv projects_lv 3G
  msg: datavg2 log_lv logs_lv 4G