2

我创建了一个 ansible 剧本。而且我希望仅当 json_query 返回元素时才执行任务。

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"
}
]
4

1 回答 1

1

这是一种方法:

---
- 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,那么你将整个“项目”添加到results_array

intersectfilter 获取“两者中所有项目的唯一列表”,因此如果长度大于 0,则找到匹配项。

希望能帮助到你。

于 2019-08-29T17:46:22.593 回答