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

时间:2020-05-09 01:42:04

标签: ansible jmespath

我有样品清单,我想选择类型在通缉名单中的物品。

- 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文档contains

布尔包含(数组|字符串$ subject,任何$ search)

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

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

2 个答案:

答案 0 :(得分:0)

由于the backtick in order to quote literal JSON

,您将希望像这样使用single quote is just for strings
  - 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) }}'

答案 1 :(得分:0)

过滤器selectattrmap完成任务

- debug:
    msg: "{{ samples|
             selectattr('type', 'in', wanted_list)|
             map(attribute='item')|
             list }}"

给予

    "msg": [
        20,
        30
    ]

注释

  • 修正列表samples的语法,并删除行末的逗号
  vars: 
    samples:
      - {item: 10, type: sample-1}
      - {item: 20, type: sample-11}
      - {item: 30, type: sample-2}
相关问题