Ansible json_query выводит список при использовании выражения фильтра

Я использую ansible 2.4.0 на OSX. Следующий сборник игр...

---
- hosts: localhost
  connection: local
  gather_facts: False

  vars:
    data:
    - name: thing1
      desc: I am thing 1
    - name: thing2
      desc: I am thing 2

  tasks:
  - debug: msg="{{ data|json_query(\"[1].desc\") }}"
  - debug: msg="{{ data|json_query(\"[?name=='thing2'].desc\") }}"

Производит следующий вывод:

PLAY [localhost] ***************************************************************

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "I am thing 2"
}

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": [
        "I am thing 2"
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0

Мой вопрос: почему во второй задаче отладки вывод в виде списка ([])?


person Dave McNeill    schedule 24.09.2017    source источник


Ответы (2)


Это связано с тем, что в JMESPath, который является реализацией json_query, выражение индекса всегда возвращает одно значение, возможно null (см. [1 ]).

В то время как для выражения фильтра, которое является проекцией, предполагается, что после оценки LHS вашего запроса возвращается массив, который может быть пустым, если значения не совпадают (см.: [2]).

person guido    schedule 24.09.2017

Вы можете добавить фильтр first, например:

tasks:
  - debug: msg="{{ data | json_query(\"[?name=='thing2'].desc\") | first }}"

Он вернет скалярное значение.

person kiba    schedule 27.12.2019