Получаем разницу из двух массивов Ansible - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть этот массив имен и главный объект, который я хочу пересечь, все общие будут удалены, а остальные будут сохранены.

Имена 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 голосов
/ 30 сентября 2018

Это код, который вы ищете?

- set_fact:
    vpc_to_be_created: "{{ vpc_to_be_created | combine(item) }}"
  loop: "{{ ecs_objects }}"
  when: item.vpc_name not in vpc_names
0 голосов
/ 30 сентября 2018

Самым чистым и быстрым способом, вероятно, будет использование 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)]"

Или построение дифференциального списка с нуля, как предложено в в другом ответе , но с фиксированнымcode:

- 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запрос непосредственно в других модулях).

...