如何使用 json_query 或其他列表过滤列表元素
How to filter element of list with a list in ansible with a json_query or other
我创建了一个 ansible 剧本。我希望只有 json_query returns 元素时才执行任务。
json 查询必须返回一个数组,以搜索数组数组中的元素是否存在于另一个数组的元素中。
我已经尝试使用 json_query (jmespath) 进行简化查询
我阅读了 jmespath 文档并尝试使用网站教程。
阅读 ansible 文档并尝试查找示例。
我认为好的解决方案是使用包含内置函数和地图函数。但是地图和文档的例子对我来说不是很清楚。
示例:
array_of_array_to_check : [
{
hosts : ["host1", "host2"],
name : "name1"
},
{
hosts : [ "host3", "host1"],
name : "name2"
},
{
hosts : ["host4", "host5"],
name : "name3"
}
]
array_parameters: ["host1", "host18"]
预计:
result: [
{
hosts: ["host1", "host2"],
name: "name1"
},
{
hosts: ["host3", "host1"],
name: "name2"
}
]
这里有一个方法:
---
- hosts: localhost
gather_facts: false
vars:
array_of_array_to_check:
- hosts:
- host1
- host2
name: name1
- hosts:
- host3
- host1
name: name2
- hosts:
- host4
- host5
name: name3
array_parameters:
- host1
- host18
tasks:
- name: parse array and add to results
set_fact:
results_array: "{{ results_array | default([]) + [item] }}"
when: item.hosts | intersect(array_parameters) | length > 0
with_items:
- "{{ array_of_array_to_check }}"
- debug:
var: results_array
基本上你解析 array_of_array_to_check
列表,如果你在其元素的 hosts
列表中找到与 array_parameters
相同的元素,那么你添加整个 "item"到 results_array
intersect
过滤器获取 "unique list of all items in both" ,因此如果长度大于 0,则找到匹配项。
希望对您有所帮助。
我创建了一个 ansible 剧本。我希望只有 json_query returns 元素时才执行任务。
json 查询必须返回一个数组,以搜索数组数组中的元素是否存在于另一个数组的元素中。
我已经尝试使用 json_query (jmespath) 进行简化查询 我阅读了 jmespath 文档并尝试使用网站教程。 阅读 ansible 文档并尝试查找示例。
我认为好的解决方案是使用包含内置函数和地图函数。但是地图和文档的例子对我来说不是很清楚。
示例:
array_of_array_to_check : [
{
hosts : ["host1", "host2"],
name : "name1"
},
{
hosts : [ "host3", "host1"],
name : "name2"
},
{
hosts : ["host4", "host5"],
name : "name3"
}
]
array_parameters: ["host1", "host18"]
预计:
result: [
{
hosts: ["host1", "host2"],
name: "name1"
},
{
hosts: ["host3", "host1"],
name: "name2"
}
]
这里有一个方法:
---
- hosts: localhost
gather_facts: false
vars:
array_of_array_to_check:
- hosts:
- host1
- host2
name: name1
- hosts:
- host3
- host1
name: name2
- hosts:
- host4
- host5
name: name3
array_parameters:
- host1
- host18
tasks:
- name: parse array and add to results
set_fact:
results_array: "{{ results_array | default([]) + [item] }}"
when: item.hosts | intersect(array_parameters) | length > 0
with_items:
- "{{ array_of_array_to_check }}"
- debug:
var: results_array
基本上你解析 array_of_array_to_check
列表,如果你在其元素的 hosts
列表中找到与 array_parameters
相同的元素,那么你添加整个 "item"到 results_array
intersect
过滤器获取 "unique list of all items in both" ,因此如果长度大于 0,则找到匹配项。
希望对您有所帮助。