Я пытаюсь понять, как создать список Ansible, который является результатом добавления каждой строки из спискаB в каждую строку в списке A, эффективно умножая два списка строк вместе.Как объединить все элементы из спискаB со всеми элементами из списка?
В Python я хотел бы сделать это:
["-".join((x, y)) for x in listA for y in listB]
В других языках я бы вложить один for
цикл внутри другого.
Я не могу найти аналог этого в Ansible.
Моя причина заключается в том, чтобы разрешить роли автоматически определять сайт, на котором находится хост. Все мои хосты расположены по крайней мере в одной группе с именем для физического местоположения и типа сайта (разработка, постановка, производство). Так, например, группа производственного сайта в Нью-Йорке будет «nyc-prod». Мне нужно, чтобы моя учебная тетрадь могла выбрать имя сайта из полного списка групп, в которых находится хост.
Учитывая список всех возможных сайтов, я могу пересечь этот список со списком групп, в которых находится хост. , и полученный одноэлементный список будет содержать сайт текущего хоста.
Я мог бы наложить это вручную, записав список всех возможных комбинаций типа сайта в group_vars/all
или vars/main.yml
в роли, но с большим количеством сайтов это умножится на массивный список, который необходимо поддерживать , Поэтому мой подход состоял в том, чтобы попытаться программно построить список из гораздо более короткого списка физических сайтов и списка типов.
Если бы я мог вставлять произвольный питона в шаблоне джинджа я мог бы сделать что-то подобное в tasks/main.yml
:
# sites contains a list of all physical locations ['nyc', 'sfo', ...]
- name: get groups
debug:
var: group_names
register: groups
- name: find my site group
set_fact:
my_site: "{% site for site in {{groups}} if site in ['-'.join((x, y)) for x in {{sites}} for y in ['dev', 'stage', 'prod']] }%"
- name: print the group
debug:
msg: "My site is {{ my_site }}"
Это, очевидно, не работает, однако.
Кто-нибудь решил эту проблему раньше?
Примечание: Я использую анзибль 2.2.1.0
Спасибо за это! Это немного уродливо, но определенно работает! – mpounsett