温馨提示:本文翻译自stackoverflow.com,查看原文请点击:ansible - json_query uses contains to search item within another list failed
ansible jmespath

ansible - json_query使用contains在另一个列表中搜索项目失败

发布于 2020-08-27 21:26:30

我有样品清单,我想选择其类型在wanted_list中的项目。

- name: Get item based on anther list
  vars: 
    samples:
      - { item: 10, type: sample-1 },
      - { item: 20, type: sample-11 },
      - { item: 30, type: sample-2 }
    wanted_list: [ sample-11, sample-2 ]
    query: "[?contains('{{wanted_list|to_json}}', type)]"
  debug:
    var: samples | json_query(query)

结果:

TASK: Get item based on anther list
ok: [localhost] => {
    "samples|json_query(query)": [
        {
            "item": 10,
            "type": "sample-1"
        },
        {
            "item": 20,
            "type": "sample-11"
        },
        {
            "item": 30,
            "type": "sample-2"
        }
    ]
}

我所期望的是它将仅返回项目20和30。但是实际上返回了所有3。它看起来像sample-1匹配列表项sample-11的一部分。

但是基于JMESPath的文档包含

boolean contains(array | string $ subject,any $ search)

如果$ subject是一个数组,则如果数组中的元素之一等于提供的$ search值,则此函数返回true。

因此,sample-1不等于sample-11,因此不应选择它。

查看更多

提问者
Wibe Goose
被浏览
2
mdaniel 2020-05-09 12:01

您将需要使用反引号来像这样引用文字JSON,因为单引号仅用于字符串

  - name: Get item based on anther list
    vars: 
      samples:
        - { item: 10, type: sample-1 }
        - { item: 20, type: sample-11 }
        - { item: 30, type: sample-2 }
      wanted_list: [ sample-11, sample-2 ]
      query: "[?contains(`{{ wanted_list | to_json }}`, type)]"
    debug:
      msg: '{{ samples | json_query(query) }}'