YAML Пересечение нескольких списков - PullRequest
1 голос
/ 06 марта 2020
    "tag_info": {
        "changed": false,
        "msg": "All items completed",
        "results": [
            {"vm_list": ["NSY6TFSANSBL01"]},
            {"vm_list": ["NSY6TFSANSBL01", "NSY6TFSANSBL02"]},
            {"vm_list": ["NSY6TFSANSBL01", "NSY6TFSANSBL02", "NSY6TFSANSBL03"]}
        ]
    }

Мне нужно найти пересечение нескольких списков.

Я знаю, что пересечение 2 списков выглядит так

- set_fact:
    final_list: "{{ tag_info.results[0].vm_list | intersect(tag_info.results[1].vm_list) }}"

Мне нужно то же самое для N количества списков , Может ли кто-нибудь помочь, пожалуйста.

1 Ответ

1 голос
/ 06 марта 2020

Задачи, приведенные ниже, выполняют работу

   - set_fact:
        final_list: "{{ final_list|default([]) + [
                        tag_info.results[item].vm_list|
                        intersect(tag_info.results[item + 1].vm_list)] }}"
      loop: "{{ range(0, tag_info.results|length - 1, 1)|list }}"
    - debug:
        var: final_list

дают

    "final_list": [
        [
            "NSY6TFSANSBL01"
        ], 
        [
            "NSY6TFSANSBL01", 
            "NSY6TFSANSBL02"
        ]
    ]


Фиксированные данные
    tag_info:
      changed: false
      msg: "All items completed"
      results:
        - {"vm_list": ["NSY6TFSANSBL01"]}
        - {"vm_list": ["NSY6TFSANSBL01", "NSY6TFSANSBL02"]}
        - {"vm_list": ["NSY6TFSANSBL01", "NSY6TFSANSBL02", "NSY6TFSANSBL03"]}

Q: "Пересечение всех списков в tag_info.results может быть N Количество объектов vm_list."

A: Начать с первого vm_list объекта и вместо добавления пересекаются следующие vm_list объекты. Например

    - set_fact:
        final_list: "{{ final_list|
                        default(tag_info.results.0.vm_list)|
                        intersect(tag_info.results[item].vm_list) }}"
      loop: "{{ range(1, tag_info.results|length, 1)|list }}"
    - debug:
        var: final_list

Да

    "final_list": [
        "NSY6TFSANSBL01"
    ]
...