ansible json_query несколько значений - PullRequest
1 голос
/ 05 августа 2020

Из предыдущего вызова GET api в ansible Я получаю результат json.

Вызов api будет выглядеть примерно так:

- name: Refresh Datadog monitors list
  uri:
    url: http://my.api.com
    return_content: yes
    method: GET
    status_code: 200
    headers:
      Content-Type: "application/json"
  register: results

Результат выглядит примерно так (фиктивные данные):

[{
    "name": "bob",
    "id": 13590804,
    "colour": "blue",
    "created": "2019-11-21T07:41:33.148976+00:00",
    "modified": "2019-11-21T07:41:33.148976+00:00",
    "overall_state_modified": "2019-11-25T06:45:08+00:00",
    "overall_state": "OK"
},
{
    "name": "john",
    "id": 123124515,
    "colour": "green",
    "created": "2019-11-21T07:41:33.148976+00:00",
    "modified": "2019-11-21T07:41:33.148976+00:00",
    "overall_state_modified": "2019-11-25T06:45:08+00:00",
    "overall_state": "OK"
},
{
    "name": "carl",
    "id": 3252532,
    "colour": "orange",
    "created": "2019-11-21T07:41:33.148976+00:00",
    "modified": "2019-11-21T07:41:33.148976+00:00",
    "overall_state_modified": "2019-11-25T06:45:08+00:00",
    "overall_state": "OK"
},
{
    "name": "louis",
    "id": 5675467,
    "colour": "purple",
    "created": "2019-11-21T07:41:33.148976+00:00",
    "modified": "2019-11-21T07:41:33.148976+00:00",
    "overall_state_modified": "2019-11-25T06:45:08+00:00",
    "overall_state": "OK"
}]

На следующем шаге я хочу извлечь только два значения из json, чтобы они выглядели примерно так:

[{
        "name": "bob",
        "id": 13590804
    },
    {
        "name": "john",
        "id": 123124515
    },
    {
        "name": "carl",
        "id": 3252532
    },
    {
        "name": "louis",
        "id": 5675467
    }
]

Я пробовал несколько итераций из разных источников, чтобы попытаться получить такой результат, например:

- name: "Display all id's with names"
  debug: msg = "{{ results | json_query '[id, names]')}}"

и

- name: "Display all id's with names"
  debug: msg = "{{ results | json_query '[*][id, names]')}}"

Я понимаю, что есть пробел в я знаю jmespath, но документация немного сложна, и я не могу найти точное решение.

1 Ответ

2 голосов
/ 05 августа 2020

Вы ищете раздел, обозначенный как фильтры и хэши множественного выбора в документации JMESPath.

Итак, ваша задача должна быть:

- name: "Display all id's with names"
  debug: 
    msg: "{{ results | json_query('[*].{id: id, name: name}') }}"

Учитывая сценарий:

- hosts: all
  gather_facts: no  
        
  tasks:
    - debug:
        msg: "{{ results | json_query('[*].{id: id, name: name}') }}"
      vars:
        results: 
          - name: bob
            id: 13590804
            colour: blue
            created: 2019-11-21T07:41:33.148976+00:00
            modified: 2019-11-21T07:41:33.148976+00:00
            overall_state_modified: 2019-11-25T06:45:08+00:00
            overall_state: OK
          - name: john
            id: 123124515
            colour: green
            created: 2019-11-21T07:41:33.148976+00:00
            modified: 2019-11-21T07:41:33.148976+00:00
            overall_state_modified: 2019-11-25T06:45:08+00:00
            overall_state: OK
          - name: carl
            id: 3252532
            colour: orange
            created: 2019-11-21T07:41:33.148976+00:00
            modified: 2019-11-21T07:41:33.148976+00:00
            overall_state_modified: 2019-11-25T06:45:08+00:00
            overall_state: OK
          - name: louis
            id: 5675467
            colour: purple
            created: 2019-11-21T07:41:33.148976+00:00
            modified: 2019-11-21T07:41:33.148976+00:00
            overall_state_modified: 2019-11-25T06:45:08+00:00
            overall_state: OK

Этот вывод:

PLAY [all] ********************************************************************************************************

TASK [debug] ******************************************************************************************************
ok: [localhost] => {
    "msg": [
        {
            "id": 13590804,
            "name": "bob"
        },
        {
            "id": 123124515,
            "name": "john"
        },
        {
            "id": 3252532,
            "name": "carl"
        },
        {
            "id": 5675467,
            "name": "louis"
        }
    ]
}

PLAY RECAP ********************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
...