Не удается извлечь данные из вложенного массива в Ansible

#json #ansible

#json #ansible

Вопрос:

Я пытаюсь извлечь значения vs_name для каждого элемента в списке массивов, но, похоже, я что-то делаю неправильно, но не могу понять это.

Вот результат, который я хочу проанализировать

 ok: [localhost] => {
 "msg": {
  "AV-FAS": {
            "vs_name": "AV-FAS",
            "vs_type": "admin"
        },
  "AV-FAS-01": {
            "vs_name": "AV-FAS-01",
            "vs_type": "node"
        },
  "AV-FAS-02": {
            "vs_name": "AV-FAS-02",
            "vs_type": "node"
        }
 

Вот мой код:

 - name: populate vs list
       set_fact: 
        vs_list: "{{ vs_list|default([]) }}   [ '{{ item.vs_name }}' ]"
       with_items: "{{ output }}"
 

Ответ №1:

Вопрос: «Извлеките значения vs_name».

A: Используйте filter json_query. Например

     - set_fact:
        vs_list: "{{ output|json_query('*.vs_name') }}"
 

дает

     "vs_list": [
        "AV-FAS",
        "AV-FAS-01",
        "AV-FAS-02"
    ]
 

Следующий вариант — сопоставление атрибута. Фильтр dict2items необходим для преобразования словаря в список. Например, задача ниже дает тот же результат

     - set_fact:
        vs_list: "{{ output|dict2items|
                     map(attribute='value.vs_name')|
                     list }}"
 

Вопрос: «Перечислите vs_name, когда vs_type = ‘admin’«

A: Добавьте фильтр selectattr в канал. Например

     - set_fact:
        vs_list: "{{ output|dict2items|
                     selectattr('value.vs_type', 'eq', 'admin')|
                     map(attribute='value.vs_name')|
                     list }}"
 

дает

     "vs_list": [
        "AV-FAS"
    ]
 

Комментарии:

1. спасибо, это работает. Что, если я затем захочу добавить vs_name, когда vs_type = «admin»? Возможно ли это?

2. Пожалуйста. Да, это возможно. Я добавил пример. Откройте новый вопрос, если у вас есть другие проблемы.