Я использую ANSIBLE PlayBook, чтобы настроить Apache для списка сайтов. Playbook должен скопировать шаблон конфигурации виртуального хоста для каждого сайта на место, а затем включить каждый сайт, используя a2ensite
:
- name: Install apache site conf
template: src=apache-sites-{{item}}-conf.j2 dest=/etc/apache2/sites-available/{{item}}.conf mode=0644
with_items:
- sitea
- siteb
- sitec
- sited
- name: Enable site apache conf
command: a2ensite {{item}}
args:
creates: /etc/apache2/sites-enabled/{{item}}.conf
with_items:
- sitea
- siteb
- sitec
- sited
Мне не нравится повторять один и тот же список для каждой задачи. Как настроить playbook для выполнения обеих задач с одинаковым списком предметов?
loop
наblock
блоке. Похоже, что это было запрошено, но отклонено в выпуске Ansible GH 13262 .:-(
Я нашел решение с помощью файловых глобусов. Поскольку у меня есть файл конфигурации для каждого сайта, я могу просто использовать список этих файлов для перебора всех из них. Таким образом, у меня нет списка сайтов в файле задач ни разу, не говоря уже о двух. Все, что мне нужно сделать, чтобы добавить сайт, это добавить файл.
Чтобы было проще, я создал каталог для шаблонов:
roles/webserver/templates/apache-sites/sitea.conf.j2
roles/webserver/templates/apache-sites/siteb.conf.j2
roles/webserver/templates/apache-sites/sitec.conf.j2
roles/webserver/templates/apache-sites/sited.conf.j2
Затем
roles/webserver/tasks/main.yml
я могу использовать этот список файлов и некоторые регулярные выражения:Эту технику можно использовать даже с пустыми фиктивными файлами для создания списка для других приложений.
источник
Константин дал хороший ответ; вот дополнительный аромат на этом.
Я обычно определяю списки как переменные и просто пишу два отдельных цикла над одной и той же переменной:
Это хорошо работает с переменным приоритетом , например, определяя различные наборы серверов для каждой среды. Это также работает, когда вам нужно выполнить различные другие не зацикленные задачи между двумя циклами.
источник