从两个数组中获得差异Ansible

时间:2018-09-30 01:57:00

标签: ansible jinja2

我有这个名称数组和一个我想将两者相交的主要对象,共同点将被删除,其余的将被保留。

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) }}"

2 个答案:

答案 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查询)