我在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
我的问题是,为什么在第二个调试任务中是列表中的输出([])?
答案 0 :(得分:2)
这是因为在JMESPath中,implementation behind json_query
,索引表达式被定义为始终返回单个值,可能是null
(see [1])。
对于过滤器表达式,它是一个投影,假定在评估查询的LHS后返回一个数组,如果没有匹配的值(see: [2]),则该数组可能为空。
答案 1 :(得分:0)
您可以添加ansible过滤器first
,如下所示:
tasks:
- debug: msg="{{ data | json_query(\"[?name=='thing2'].desc\") | first }}"
它将返回标量值。