使用过滤器表达式时 Ansible json_query 输出列表

Ansible json_query outputs list when using a filter expression

我在 OSX 上 运行 ansible 2.4.0。 以下剧本...

---
- 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

我的问题是,为什么在第二个调试任务中输出的是列表 ([])?

那是因为在 JMESPath 中,它是 implementation behind json_query, an index expression is defined to always return a single value, possibly null (see [1]).

虽然对于作为投影的过滤器表达式,假定在评估查询的 LHS 后返回一个数组,如果没有匹配的值,则该数组可能为空 (see: [2])。

您可以添加 ansible 过滤器 first,像这样:

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

它将return标量值。