Рейтинг:1

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

флаг ph
azk

Вот моя книга игр

- название: Луны хозяина
  отлаживать:
    сообщение: "{{ лунс }}"
  вары:
    Лунс: "{{ ansible_facts.lvm.pvs }}"

И выход для этого

ЗАДАНИЕ [Luns del vg] **************************************************** ****************
хорошо: [awxworker_rhel6] => {
    "сообщение": {
        "/dev/sda2": {
            "free_g": "20,72",
            "размер_g": "79,72",
            "вг": "вг00"
        },
        "/dev/sdb1": {
            "free_g": "3,99",
            "размер_г": "4,99",
            "вг": "вг01"
        },
        "/dev/sdc1": {
            "free_g": "0,99",
            "размер_г": "4,99",
            "вг": "вг02"
        },
        "/dev/sdd1": {
            "free_g": "4,99",
            "размер_г": "4,99",
            "вг": "вг01"
        }
    }
}

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

Ej: «Луны vg01: /dev/sdb1 /dev/sdd1»

Я пробовал это между другими способами

- имя: Лунс дель В.Г.
  set_fact:
    vg_luns: "{{ элемент }}"
  with_items: "{{ ansible_facts.lvm.pvs }}"
    вары:
      Имя ВГ: "{{ ВГ }}"
  когда: ansible_facts.lvm.pvs.vg_luns.vg == VGname
  
- название: Распечатать луны В.Г.
  отлаживать:
    сообщение:
      - "Луны {{ VGname }}: {{ vg_luns }}"

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

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

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

Заранее спасибо!
Рейтинг:1
флаг th

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

- отладка:
    msg: "Луны {{ VG }}: {{ ansible_facts.lvm.pvs | dict2items | selectattr('value.vg', 'equalto', VG) | map(attribute='key') | join(' ' ) }}"
azk avatar
флаг ph
azk
Большое спасибо! Это прямо указывает на то, что мне нужно.
Рейтинг:0
флаг br

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

  - set_fact:
      vgs: "{{ vgs|d({})|
               объединить ({элемент.0: элемент.1|
                                карта (атрибут = 'ключ') |
                                список}) }}"
    цикл: "{{ luns|dict2items|groupby('value.vg') }}"

дает

  ВГС:
    vg00:
    - /dev/sda2
    vg01:
    - /dev/sdb1
    - /dev/sdd1
    vg02:
    - /dev/sdc1

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

    - отладка:
        msg: "Луны {{ VG }}: {{ vgs[VG]|join(' ') }}"

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

оболочка> ansible-playbook playbook.yml -e VG=vg01

  msg: 'Luns vg01: /dev/sdb1 /dev/sdd1'
azk avatar
флаг ph
azk
Это тоже привлекательное решение. Возможно, есть проблема с синтаксисом, потому что это дает мне ошибку: ``` НЕУСПЕШНЫЙ! => {"msg": "|комбинировать ожидает словари, получил \"{'vg00': }\""} ``` Я постараюсь узнать, что это такое.
флаг br
Добавьте фильтр *list*. Я обновил ответ. На самом деле оба решения используют одну и ту же процедуру. *list* не нужен в принятом вами решении из-за фильтра *join* сразу после *map*. Здесь фильтр *join* используется после выбора группы.
azk avatar
флаг ph
azk
Идеальный. Я тоже принимаю ваше решение. Это работает хорошо. Большое спасибо!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.