3

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

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

4

2 回答 2

4

您可以添加 ansible filter first,如下所示:

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

它将返回标量值。

于 2019-12-27T04:37:45.467 回答
2

这是因为在 JMESPath 中,它是背后的实现json_query,一个索引表达式被定义为总是返回一个值,可能null参见 [1])。

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

于 2017-09-24T17:54:29.840 回答