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