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