Рейтинг:0

ansible/jinja извлекает несколько атрибутов из сложного возврата json, отклоняя определенные совпадения

флаг vn

Я пытаюсь извлечь несколько атрибутов из сложной полезной нагрузки, возвращаемой из вызова API, при этом отклоняя элементы, которые имеют определенное значение в поле «имя». Рассмотрим следующую полезную нагрузку:

{
"npod_volumes": {
    «изменено»: ложь,
    «не удалось»: ложь,
    "тома": [
        {
            "accessible_by_host_uuids": [
                "9e8ba77c-8e09-4c69-b893-876742f83f34",
                "ad5a5431-17e1-4023-8373-a6cf64cc5151",
                "3333a278-414b-45d1-8972-611115c76f87",
                "1e36d01a-f936-4249-9045-28232bb103e7"
            ],
            "загрузка": ложь,
            "creation_time": "2022-01-26T18:25:46",
            "current_owner_host_uuid": "ad5a5431-17e1-4023-8373-a6cf64cc5151",
            "expiration_time": ноль,
            "лунь_ууидс": [
                "8cfe80b6-5773-41bd-b175-e6e495ca0023",
                "8e54f045-89dd-462a-bab4-552ed745ed24",
                "136d7028-2b20-41c7-8b30-e104d211242c",
                "4e7aac12-3b29-41c7-b016-36556feea9f1"
            ],
            "имя": "VMware_Lenovo_VV7",
            "natural_backup_host_uuid": "9e8ba77c-8e09-4c69-b893-876742f83f34",
            "natural_backup_spu_serial": "ххххххх",
            "natural_owner_host_uuid": "ad5a5431-17e1-4023-8373-a6cf64cc5151",
            "natural_owner_spu_serial": "ххххххх",
            "npod_uuid": "4b60437a-f8dc-4c80-b4b2-51b64b790487",
            "read_only_snapshot": ложь,
            "размер_байт": 4000000000000,
            "snapshot_parent_uuid": ноль,
            "snapshot_uuids": ноль,
            "sync_state": "В синхронизации",
            "uuid": "ed73e3a0-25e2-4672-8048-84ad4468c0d7",
            "wwn": "6f497c2006174fed000ab00000007000"
        },
        {
            "accessible_by_host_uuids": [
                "9e8ba77c-8e09-4c69-b893-876742f83f34",
                "1e36d01a-f936-4249-9045-28232bb103e7",
                "ad5a5431-17e1-4023-8373-a6cf64cc5151",
                "3333a278-414b-45d1-8972-611115c76f87"
            ],
            "загрузка": ложь,
            "creation_time": "2022-01-26T18:25:40",
            "current_owner_host_uuid": "9e8ba77c-8e09-4c69-b893-876742f83f34",
            "expiration_time": ноль,
            "лунь_ууидс": [
                "49e511b7-2b5f-4727-ac63-de12c4b6eb45",
                "2baba8a4-dd23-4be4-ad9d-47580efa60d2",
                "4ff844d6-c677-4c2a-a2e5-c13a5c062b3c",
                "21e7f0c8-5f1a-438f-b503-e568f3691c01"
            ],
            "имя": "VMware_Lenovo_VV4",
            "natural_backup_host_uuid": "ad5a5431-17e1-4023-8373-a6cf64cc5151",
            "natural_backup_spu_serial": "ххххххх",
            "natural_owner_host_uuid": "9e8ba77c-8e09-4c69-b893-876742f83f34",
            "natural_owner_spu_serial": "ххххххх",
            "npod_uuid": "4b60437a-f8dc-4c80-b4b2-51b64b790487",
            "read_only_snapshot": ложь,
            "размер_байт": 4000000000000,
            "snapshot_parent_uuid": ноль,
            "snapshot_uuids": ноль,
            "sync_state": "В синхронизации",
            "uuid": "cc3991e2-5443-4bd0-a75d-3e8341d26282",
            "wwn": "6f497c2006174fed000ab00000004000"
        },
        {
            "accessible_by_host_uuids": [
                "ad5a5431-17e1-4023-8373-a6cf64cc5151"
            ],
            "загрузка": правда,
            "creation_time": "2022-01-26T18:25:46",
            "current_owner_host_uuid": "ad5a5431-17e1-4023-8373-a6cf64cc5151",
            "expiration_time": ноль,
            "лунь_ууидс": [
                "d5ce25a9-15d1-4e36-878e-5e645ef0c557"
            ],
            "имя": "VMware_Lenovo_server-09.tme.nebulon.com_os",
            "natural_backup_host_uuid": "9e8ba77c-8e09-4c69-b893-876742f83f34",
            "natural_backup_spu_serial": "ххххххх",
            "natural_owner_host_uuid": "ad5a5431-17e1-4023-8373-a6cf64cc5151",
            "natural_owner_spu_serial": "ххххххх",
            "npod_uuid": "4b60437a-f8dc-4c80-b4b2-51b64b790487",
            "read_only_snapshot": ложь,
            "размер_байт": 20000000000,
            "snapshot_parent_uuid": ноль,
            "snapshot_uuids": ноль,
            "sync_state": "В синхронизации",
            "uuid": "bdbce49d-834d-438e-a56d-9c384bc229c0",
            "wwn": "6f497c2006174fed000ab00000000000"
        }
    ]
}

}

Из этого возврата мне нужно сохранить поля «имя» и «wwn» для каждого тома. Кроме того, мне нужно отклонить любой том, который содержит «_os» в поле «имя».

Я могу получить информацию с помощью json_query, но не понял, как отклонить тома с «_os» в их именах, используя этот подход.

- name: Установить имя тома и WWN
  set_fact:
    volume_pairs: "{{ npod_volumes | json_query(volume_query) }}"
  вары: 
    volume_query: "тома[].{имя: имя, wwn: wwn}"
  тэги: тома

Это дает следующий вывод, который включает нежелательный том «VMware_Lenovo_server-09.tme.nebulon.com_os».

ок: [127.0.0.1] => {
"объем_пары": [
    {
        "имя": "VMware_Lenovo_VV7",
        "wwn": "6f497c2006187474000ab00000007000"
    },
    {
        "имя": "VMware_Lenovo_VV4",
        "wwn": "6f497c2006187474000ab00000004000"
    },
    {
        "имя": "VMware_Lenovo_server-09.tme.nebulon.com_os",
        "wwn": "6f497c2006187474000ab00000000000"
    }
]

}

Заранее спасибо за ваше время и внимание!

Рейтинг:0
флаг vn

Итак, я остановился на этом решении. Используя 'rejectattr', я опускаю все тома, имена которых содержат "_os". Возможно, это можно было бы сделать более элегантным способом, исключающим необходимость использования json-запроса, но он выполняет свою работу.

  - имя: Отфильтровать тома ОС
    set_fact:
      shared_volumes: "{{ npod_volumes.volumes | 
                        rejectattr('имя', 'содержит', '_os') | 
                        сортировка (атрибут = 'имя') | список }}"
    регистрация: результат
    тэги: тома  

  # Создается список имен томов и их WWN
  - name: Установить имя тома и WWN
    set_fact:
      volume_pairs: "{{ shared_volumes | json_query(volume_query) }}"
    вары: 
      volume_query: "[].{имя: имя, wwn: wwn}"
    тэги: тома



# {
# "объем_пар": [
# {
# "имя": "VMware_Lenovo_VV4",
# "wwn": "6f497c2006187474000ab00000004000"
# },
# {
# "имя": "VMware_Lenovo_VV5",
# "wwn": "6f497c2006187474000ab00000005000"
# },
# {
# "имя": "VMware_Lenovo_VV6",
# "wwn": "6f497c2006187474000ab00000006000"
# },
# {
# "имя": "VMware_Lenovo_VV7",
# "wwn": "6f497c2006187474000ab00000007000"
# }
# ]
# }
Zeitounator avatar
флаг fr
В большинстве случаев (например, при последующем зацикливании списка словарей) вы, скорее всего, можете отказаться от шага `json_query` и напрямую использовать `shared_volumes`, адресуя только необходимые атрибуты для каждого элемента (`name` и `wwn`). Имейте в виду, что `json_query` уже просматривает весь ваш список, чтобы скопировать уменьшенные элементы в новую переменную. Использование их в первую очередь, вероятно, лучше с точки зрения использования ресурсов обработки.

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

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