Рейтинг:1

json_query help - не дает ожидаемого результата

флаг cn

Я пытаюсь создать массив для использования with_nested, но я не могу понять, почему json_query не выводит фактические хосты, назначенные каждому кластеру:

Играть:

- имя: Index clusters.json
  оболочка: кошка {{ tower_var_path }}/clusters.json
  регистрация: result_clusters

- имя: сохранить данные Json в переменную как факт
  set_fact: 
    clusters_jsondata: "{{ result_clusters.stdout | from_json }}"

- отладка:
    сообщение: " {{ clusters_jsondata }}"

- имя: Установить факты кластера
  set_fact:
    кластер: "{{ кластер|по умолчанию([]) + [ {
      'имя': предмет,
      «хозяева»: элемент | json_query('*.hosts[*].имя')
       } ] }}"  
  with_items: "{{ clusters_jsondata.clusters}}"      

- отладка: 
    сообщение: "{{ кластер }}"

данные clusters.json:

    {
    "кластеры": {
        "Кластер_1": {
            "хозяева": [
                {
                    "Путь к папке",
                    "имя": "host1.domain.com"
                },
                {
                    "Путь к папке",
                    "имя": "host2.domain.com"
                }
            ],

        },
        "Кластер_2": {
            "хозяева": [
                {
                    "Путь к папке",
                    "имя": "host3.domain.com"
                },
                {
                    "Путь к папке",
                    "имя": "host4.domain.com"
                }
            ],

        },
    }

Ожидаемые результаты:

ЗАДАЧА [отладка] **************************************************** ******************************************************* ******************************************************* *************************************************
хорошо: [локальный хост] => {
    "сообщение": [
        {
            "hosts": "host1.domain.com, host2.domain.com",
            "имя": "Кластер_1"
        },
        {
            "hosts": "host3.domain.com, host4.domain.com",
            "имя": "Кластер_2"
        }
    ]
}

Фактические результаты:

    ЗАДАЧА [отладка] **************************************************** ******************************************************* ******************************************************* *************************************************
хорошо: [локальный хост] => {
    "сообщение": [
        {
            "хозяева": ноль,
            "имя": "Кластер_1"
        },
        {
            "хозяева": ноль,
            "имя": "Кластер_2"
        }
    ]
}
Рейтинг:2
флаг fr

Короче говоря, вы можете получить результат с помощью одного выражения без каких-либо циклов.

Следующий сборник игр:

---
- хосты: локальный
  сбор_фактов: ложь

  вары:
    # Ваши исходные данные в одну строку для удобочитаемости
    результат_кластеры:
      стандартный вывод: >-
        {"clusters":{"Cluster_1":{"hosts":[{"folder":"/path","name":"host1.domain.com"},{"folder":"/path"," имя":"host2.domain.com"}]},"Cluster_2":{"hosts":[{"папка":"/путь","имя":"host3.domain.com"},{"папка ":"/путь","имя":"host4.domain.com"}]}}}

  задачи:
    - имя: получить ожидаемый результат из данных json в одной задаче
      вары:
        запрос: >-
          [].{name: key, hosts: join(', ', value.hosts[].name)}
        кластеры: "{{ (result_clusters.stdout | from_json).clusters }}"
      отлаживать:
        msg: "{{ кластеры | dict2items | json_query (запрос) }}"

Дает:

ИГРАТЬ [localhost] **************************************************** ********

ЗАДАЧА [получить ожидаемый результат из данных json в одной задаче] *********
хорошо: [локальный хост] => {
    "сообщение": [
        {
            "hosts": "host1.domain.com, host2.domain.com",
            "имя": "Кластер_1"
        },
        {
            "hosts": "host3.domain.com, host4.domain.com",
            "имя": "Кластер_2"
        }
    ]
}

ОБЗОР ИГРЫ ******************************************************* ************
localhost: ok=1 изменено=0 недостижимо=0 не удалось=0 пропущено=0 спасено=0 проигнорировано=0

Примечание: хотя приведенное выше дает очень точно тот результат, который вы просили, я сильно подозреваю, что вы ищете немного другой результат. Заменив приведенный выше запрос на:

        запрос: >-
          [].{имя: ключ, хосты: value.hosts[].название}

вместо этого даст это:

ЗАДАЧА [получить ожидаемый результат из данных json в одной задаче] *************************************** ******************************************************* ******************************************************* *************************************
хорошо: [локальный хост] => {
    "сообщение": [
        {
            "хозяева": [
                "host1.domain.com",
                "host2.domain.com"
            ],
            "имя": "Кластер_1"
        },
        {
            "хозяева": [
                "host3.домен.com",
                "host4.domain.com"
            ],
            "имя": "Кластер_2"
        }
    ]
}

флаг cn
Идеальный! Спасибо. Сильно отличается от того, о чем я думал, поэтому не могли бы вы предоставить ссылку на ресурс, который мог бы объяснить, как вы пришли к такому подходу?
Zeitounator avatar
флаг fr
Я с трудом могу найти ссылку, которая указывает на резюме моего опыта работы с такими проблемами за последние 8 с лишним лет ;) Между тем, три хороших отправных точки, связанных с предметом: [встроенные фильтры jinja2] (https://jinja.palletsprojects .com/en/3.0.x/templates/#list-of-builtin-filters), [встроенные фильтры] (https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html) и [учебник по jmespath ](https://jmespath.org/tutorial.html)

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

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