ansible получает результат от роли и добавляет в список

#ansible

#ansible

Вопрос:

У меня есть такая игра

 ---
- name: List images in ACRs
  any_errors_fatal: true
  hosts:
    - localhost
  gather_facts: false

  vars:
    acrs: ["registry1", "registry2"]

  tasks:
    - name: list repos
      with_items: "{{ acrs }}"
      include_role:
        name: list_docker_image_repos
      vars:
        registry_name: "{{ item }}"

 

list_docker_image_repos будет выполнять set_fact, который определяет список.
Как я могу добавить все факты (из каждой итерации) в список?

Или есть другой способ сделать это?

Спасибо

Ответ №1:

На каждой итерации помещайте список в словарь. Например, учитывая роль

 shell> cat roles/list_docker_image_repos/tasks/main.yml
- set_fact:
    docker_image_repos: "{{ ['repo1', 'repo2', 'repo3']|
                            product([registry_name])|
                            map('join', '-')|
                            list }}"
- set_fact:
    my_lists: "{{ my_lists|
                  combine({registry_name: docker_image_repos}) }}"
 

сборник пьес

 - hosts: localhost
  vars:
    acrs: ["reg1", "reg2"]
    my_lists: {}
  tasks:
    - name: list repos
      include_role:
        name: list_docker_image_repos
      loop: "{{ acrs }}"
      vars:
        registry_name: "{{ item }}"
    - debug:
        var: my_lists
 

дает

     "my_lists": {
        "reg1": [
            "repo1-reg1",
            "repo2-reg1",
            "repo3-reg1"
        ],
        "reg2": [
            "repo1-reg2",
            "repo2-reg2",
            "repo3-reg2"
        ]
    }
 

Извлеките список списков. Например

     - debug:
        msg: "{{ acrs|map('extract', my_lists)|list }}"
 

дает

     "msg": [
        [
            "repo1-reg1",
            "repo2-reg1",
            "repo3-reg1"
        ],
        [
            "repo1-reg2",
            "repo2-reg2",
            "repo3-reg2"
        ]
    ]
 

Используйте сглаживание фильтра, чтобы поместить все элементы в один список. Например

     - debug:
        msg: "{{ acrs|map('extract', my_lists)|flatten }}"
 

дает

     "msg": [
        "repo1-reg1",
        "repo2-reg1",
        "repo3-reg1",
        "repo1-reg2",
        "repo2-reg2",
        "repo3-reg2"
    ]