我有这个名称数组和一个我想将两者相交的主要对象,共同点将被删除,其余的将被保留。
VPC名称
["A_VPC", "B_VPC"]
ECS_OBJECTS
[{
"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) }}"
答案 0 :(得分:1)
这是您要查找的代码吗?
- set_fact:
vpc_to_be_created: "{{ vpc_to_be_created | combine(item) }}"
loop: "{{ ecs_objects }}"
when: item.vpc_name not in vpc_names
答案 1 :(得分:0)
最干净,最快的方法可能是使用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)]"
或者按照the other answer的建议从头开始构建差异列表,但使用固定代码:
- set_fact:
vpc_to_be_created: "{{ vpc_to_be_created | default([]) + [item] }}"
loop: "{{ ecs_instances }}"
when: item.vpc_name not in vpc_names
这具有效率低下(循环)的缺点,因此,输出有些混乱,并且需要set_fact
任务(您可以在其他模块中直接使用上述JMESPath查询)