使用过滤器表达式时 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标量值。
我在 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标量值。