Как выполнить цикл в словаре со списком словарей в ansible?

#ansible

#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. Не могли бы вы объяснить свою пьесу?

2. Я смог получить то, что хотел, изменив структуру переменных.

3. — hosts: localhost gather_facts: нет переменных: volumeGroupName: — vg_name: datavg1 lvms: — имя: logs_lv размер: «1G» — имя: apps_lv размер: 2G — имя: projects_lv размер: 3G — vg_name: datavg2 lvms: — имя: logs_lv размер: «4G» задачи: — имя:»Отладочные переменные» debug: msg: «vg_name = {{ item.0.vg_name }} lvms_names ={{ item.1.name }} size= {{ item.1.size}}» with_subelements: — «{{ volumeGroupName }}» — размер lvms: «4G»

Ответ №1:

Создайте словарь списков из списка словарей. Например

     - 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