извлечь несколько значений из JSON с помощью JSON запрос ANSIBLE - PullRequest
0 голосов
/ 18 октября 2019

У меня есть следующий вывод (фрагмент):

ok: [localhost] => {
    "output": {
        "ansible_facts": {
            "openstack_servers": [
                {
                    "az": "xxx",
                    "cloud": "xxx",
                    "created": "2019-10-14T09:42:42Z",
                    "created_at": "2019-10-14T09:42:42Z",
                    "disk_config": "MANUAL",
                    "flavor": {
                        "id": "s2.medium.4"
                    },
                    "has_config_drive": false,
                    "hostId": "78336513777de579fd80a528b9ace4a84bca0a725dd1dde5e7827309",
                    "host_id": "78336513777de579fd80a528b9ace4a84bca0a725dd1dde5e7827309",
                    "id": "d2fe3a68-44ec-4965-89bd-c792389bc7f7",
                    "image": {
                        "id": "ef7bf265-c69e-407d-8812-692f4a6ff6ab"
                    },
                    "interface_ip": "",
                    "key_name": "xxx",
                    "launched_at": "2019-10-14T09:42:59.000000",
                    "metadata": {},
                    "name": "QDETWR",
                    "networks": {},
                    "power_state": 1,
                    "progress": 0,
                    "project_id": "54026885c74446c2b833f4dc7cb77bd2",
                    "status": "ACTIVE",

Когда я пытаюсь получить значение состояния:

      msg: "{{ output.ansible_facts.openstack_servers | json_query('[].status')}}"

Работает нормально.

Я хочуизвлечь несколько значений, но следующие не работают:

      msg: "{{ output.ansible_facts.openstack_servers | json_query('[status, flavor, az]')}}"

или

      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"

Что не так с моим синтаксисом?

1 Ответ

0 голосов
/ 18 октября 2019

Просмотр документации для фильтра json_query Ansible у них есть пример, который может быть вам полезен.

С учетом структуры данных:

domain_definition:
    domain:
        cluster:
            - name: "cluster1"
            - name: "cluster2"
        server:
            - name: "server11"
              cluster: "cluster1"
              port: "8080"
            - name: "server12"
              cluster: "cluster1"
              port: "8090"
            - name: "server21"
              cluster: "cluster2"
              port: "9080"
            - name: "server22"
              cluster: "cluster2"
              port: "9090"
        library:
            - name: "lib1"
              target: "cluster1"
            - name: "lib2"
              target: "cluster2"

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

В этом примере мы получаем хеш-карту со всеми портами и именами кластера. :

 - name: "Display all server ports and names from cluster1"
   debug:
     var: item   loop: "{{ domain_definition | json_query(server_name_cluster1_query) }}"
   vars:
     server_name_cluster1_query: "domain.server[?cluster=='cluster2'].{name: name, port: port}"

Обратите внимание, что они используют только vars: для определения запроса, якобы для удобства чтения, но здесь есть важный бит:

domain.server[?cluster=='cluster2'].{name: name, port: port}

Таким образом, они запрашивают domain.server (который представляет собой список словарей, каждый с одинаковыми атрибутами), выбирая только те, у которых значение cluster равно cluster2, а затем для каждого из возвращаемыхname как name и port как port.

В вашем случае вы хотите вернуть несколько атрибутов, но не хотите выбирать элементы с конкретными значениями. Таким образом, вы можете использовать что-то более похожее на:

msg: "{{ my_var | json_query('domain.server[*].{name: name, cluster: cluster}') }}"

Вывод, который я получаю:

    "msg": [
        {
            "cluster": "cluster1",
            "name": "server11"
        },
        {
            "cluster": "cluster1",
            "name": "server12"
        },
        {
            "cluster": "cluster2",
            "name": "server21"
        },
        {
            "cluster": "cluster2",
            "name": "server22"
        }
    ]

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

      msg: "{{ output.ansible_facts.openstack_servers | json_query('[*].{status: status, flavor: flavor, az: az}') }}"

Спасибо, надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...