Ansible json_查询使用contains在另一个列表中搜索项目失败

Ansible json_查询使用contains在另一个列表中搜索项目失败,ansible,jmespath,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: &

我有样本列表,我想选择类型在通缉列表中的项目

- 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个。看起来样本-1与列表项样本-11的一部分匹配

但根据JMESPath文档:

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

如果$subject是数组,则如果数组中的某个元素 等于提供的$search值

因此示例1不等于示例11,因此不应选择它。

您将希望这样使用,因为

-name:根据其他列表获取项目
变量:
样品:
-{项目:10,类型:sample-1}
-{项目:20,类型:sample-11}
-{项目:30,类型:sample-2}
通缉名单:[样本11,样本2]
查询:“[?包含(`{wanted_list}to_json}}`,type)]”
调试:
msg:“{samples | json_query(query)}”
您将希望这样使用,因为

-name:根据其他列表获取项目
变量:
样品:
-{项目:10,类型:sample-1}
-{项目:20,类型:sample-11}
-{项目:30,类型:sample-2}
通缉名单:[样本11,样本2]
查询:“[?包含(`{wanted_list}to_json}}`,type)]”
调试:
msg:“{samples | json_query(query)}”

过滤器
选择attr
map
执行该操作

-调试:
msg:“{{样本|
selectattr('输入','输入',通缉名单)|
映射(attribute='item')|
列表}”
给予


注释

  • 修正列表
    示例的语法,并删除行尾的逗号

过滤器
selectattr
map
执行该操作

-调试:
msg:“{{样本|
selectattr('输入','输入',通缉名单)|
映射(attribute='item')|
列表}”
给予


注释

  • 修正列表
    示例的语法,并删除行尾的逗号
    "msg": [
        20,
        30
    ]
  vars: 
    samples:
      - {item: 10, type: sample-1}
      - {item: 20, type: sample-11}
      - {item: 30, type: sample-2}