Warm tip: This article is reproduced from serverfault.com, please click

其他-ansible从角色获取结果并追加到列表

(其他 - ansible get result from role and append to a list)

发布于 2020-12-01 00:55:27

我有这样的戏

---
- 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的字典列表。如何将所有事实(每次迭代)附加到列表中?

还是有其他方法可以做到这一点?

谢谢

Questioner
D. Seah
Viewed
0
Vladimir Botka 2020-12-01 09:53:58

在每次迭代中,将列表放入字典中。例如,给定角色

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"
    ]