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

时间:2017-09-24 14:43:53

标签: ansible jmespath

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

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

2 个答案:

答案 0 :(得分:2)

这是因为在JMESPath中,implementation behind json_query,索引表达式被定义为始终返回单个值,可能是nullsee [1])。

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

答案 1 :(得分:0)

您可以添加ansible过滤器first,如下所示:

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

它将返回标量值。