如何使用 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,则找到匹配项。

希望对您有所帮助。