2017-02-22 82 views
1

Я пытаюсь понять, как создать список 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

ответ

1

Может быть достигнуто несколькими способами, вероятно.

Вот исправление для шаблона jinja2 (вы должны использовать Jinja2 syntax не Python внутри):

vars: 
    list1: 
    - list1element1 
    - list1element2 
    list2: 
    - list2element1 
    - list2element2 

tasks: 
    - set_fact: 
     list3: "{% for prefix in list1 %}{% for postfix in list2 %}{{ prefix }}-{{ postfix }} {% endfor %}{% endfor %}" 

    - debug: 
     var: list3.split(' ') 
+0

Спасибо за это! Это немного уродливо, но определенно работает! – mpounsett

 Смежные вопросы

  • Нет связанных вопросов^_^