Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ansible 从两个数组求差_Ansible_Jinja2 - Fatal编程技术网

Ansible 从两个数组求差

Ansible 从两个数组求差,ansible,jinja2,Ansible,Jinja2,我有一个名称数组和一个主要对象,我想将两者相交,公共部分将被删除,其余部分将保留 专有网络名称 ["A_VPC", "B_VPC"] ECS_对象 [{ "vpc_name": "A_VPC", "client_name": "A" }, { "vpc_name": "B_VPC", "client_name": "B" }, { "vpc_name": "C_VPC", "client_name": "C" }] 我想要的最终结果是,除了C之外,所有公共项都将被删除,因为它们与这两个对象不

我有一个名称数组和一个主要对象,我想将两者相交,公共部分将被删除,其余部分将保留

专有网络名称

["A_VPC", "B_VPC"]
ECS_对象

[{
"vpc_name": "A_VPC",
"client_name": "A"
},
{
"vpc_name": "B_VPC",
"client_name": "B"
},
{
"vpc_name": "C_VPC",
"client_name": "C"
}]
我想要的最终结果是,除了C之外,所有公共项都将被删除,因为它们与这两个对象不相同

[{
"vpc_name":"C_VPC",
"client_name": "C"
}]
到目前为止,我的代码是这样的

- name: Intersect ecs_instances objects to the existing VPC created
  set_fact:
    vpc_to_be_created: "{{ ecs_instances | difference(vpc_names) }}"

最干净、最快的方法可能是使用JMESPath:

- name: Intersect ecs_instances objects to the existing VPC created
  set_fact:
    vpc_to_be_created: "{{ ecs_instances | json_query(query) }}"
  vars:
    query: "@[?!contains(`{{ vpc_names|to_json }}`, vpc_name)]"

或者按照中的建议从头开始构建差异列表,但代码固定:

- set_fact:
    vpc_to_be_created: "{{ vpc_to_be_created | default([]) + [item] }}"
  loop: "{{ ecs_instances }}"
  when: item.vpc_name not in vpc_names

这有一个缺点,即效率较低(循环),因此输出有点混乱,并且需要执行
set\u fact
任务(您可以在其他模块中直接使用上面的JMESPath查询)。

这就是您要找的代码吗

- set_fact:
    vpc_to_be_created: "{{ vpc_to_be_created | combine(item) }}"
  loop: "{{ ecs_objects }}"
  when: item.vpc_name not in vpc_names