我有样品清单,我想选择类型在通缉名单中的物品。
- 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,因此不应选择它。
答案 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)
过滤器selectattr
和map
完成任务
- 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}