Доступ к значению подэлемента dict

Доступ к значению подэлемента dict

Вот мой план действий

- name: Host's luns
  debug:
    msg: "{{ luns }}"
  vars:
    luns: "{{ ansible_facts.lvm.pvs }}"

И вывод для этого такой:

TASK [Luns del vg] ************************************************************
ok: [awxworker_rhel6] => {
    "msg": {
        "/dev/sda2": {
            "free_g": "20.72",
            "size_g": "79.72",
            "vg": "vg00"
        },
        "/dev/sdb1": {
            "free_g": "3.99",
            "size_g": "4.99",
            "vg": "vg01"
        },
        "/dev/sdc1": {
            "free_g": "0.99",
            "size_g": "4.99",
            "vg": "vg02"
        },
        "/dev/sdd1": {
            "free_g": "4.99",
            "size_g": "4.99",
            "vg": "vg01"
        }
    }
}

Мне нужно получить луны соответствующего vg

Ej: "The vg01 luns are: /dev/sdb1 /dev/sdd1"

Я пробовал это разными способами

- name: Luns del VG
  set_fact:
    vg_luns: "{{ item }}"
  with_items: "{{ ansible_facts.lvm.pvs }}"
    vars:
      VGname: "{{ VG }}"
  when: ansible_facts.lvm.pvs.vg_luns.vg == VGname
  
- name: Print VG's luns
  debug:
    msg:
      - "The {{ VGname }} luns are: {{ vg_luns }}"

VG — это дополнительная переменная, куда я помещаю соответствующее VGname.

$ ansible-playbook -i proyects/Inventory/awx_hosts -l testhost getvgluns.yml -e VG=vg01

Надеюсь, вы сможете помочь.

Thanks in advance!

решение1

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

  - set_fact:
      vgs: "{{ vgs|d({})|
               combine({item.0: item.1|
                                map(attribute='key')|
                                list}) }}"
    loop: "{{ luns|dict2items|groupby('value.vg') }}"

дает

  vgs:
    vg00:
    - /dev/sda2
    vg01:
    - /dev/sdb1
    - /dev/sdd1
    vg02:
    - /dev/sdc1

Тогда выбор тривиален

    - debug:
        msg: "The {{ VG }} luns are: {{ vgs[VG]|join(' ') }}"

дает сообщение

shell> ansible-playbook playbook.yml -e VG=vg01

  msg: 'The vg01 luns are: /dev/sdb1 /dev/sdd1'

решение2

Нет необходимости в set_fact или циклах Ansible. Преобразуйте словарь в список и используйте обычные операции Jinja на нем.

- debug:
    msg: "The {{ VG }} luns are: {{ ansible_facts.lvm.pvs | dict2items | selectattr('value.vg', 'equalto', VG) | map(attribute='key') | join(' ') }}"

Связанный контент