Я использую Ansible для управления некоторыми веб-серверами и серверами баз данных, которые запускают веб-сайты для нескольких виртуальных хостов. Для каждого веб-сайта мне нужно назначить роль базы данных группе dbservers и роль веб-сайта группе веб-серверов. Итак, мой playbook выглядит примерно так:
- hosts: dbservers
roles:
- { role: database, vhost: 'host1.com', db: 'customdb' }
- { role: database, vhost: 'other.com' }
- hosts: webservers
roles:
- { role: website, vhost: 'host1.com', db: 'customdb' }
- { role: website, vhost: 'other.com' }
Это хорошо работает, но некрасиво, так как мне приходится повторять все дважды. Это особенно подвержено ошибкам при изменении некоторых параметров со значений по умолчанию (например, db на vhost host1.com в этом примере).
Есть ли способ написать это, чтобы я мог иметь единый список vhosts со всеми необходимыми параметрами и автоматически добавлять разные роли в разные группы хостов для каждой записи vhost?
самый очевидный ответ - используйте сложные переменные (словари) для хранения ваших значений, а затем передайте всю переменную:
- layouts:
- layout1:
vhost: host1.com
db: customdb
- layout2:
vhost: other.com
затем используйте их для перехода к ролям:
- hosts: dbservers
roles:
- { role: database, layout: layouts.layout1 }
- { role: database, layout: layouts.layout2 }
- hosts: webservers
roles:
- { role: webserver, layout: layouts.layout1 }
- { role: webserver, layout: layouts.layout2 }
Я успешно делал это в прошлом. Для заполнения макетов вы можете использовать различные методы: комбинирование "group_vars / all" с "vars_files" с "host_vars" и т. Д.
Что я делаю, так это создаю роли apache
, который устанавливает apache и выполняет некоторую настройку для всех хостов, apache-vhost
, который устанавливает vhost, host1-com
, и other-com
. Тогда сценарий будет таким:
- hosts: host1-com-servers
roles:
- apache
- host1-com
- hosts: other-com-servers
roles:
- apache
- other-com
Сейчас, host1-com
будет это:
- meta:
- dependencies:
- role: apache-vhost
server_name: host1.com
server_aliases:
- www.host1.com
extras: |
Alias /static /var/local/myapp/static
<Location /static>
Require all granted
</Location>
# Whatever else you want
whatever_other_variables_apache-vhost_needs: XXX
(Это деталь реализации, но apache-vhost
Роль подготавливает некоторую важную конфигурацию vhost на основе переданных ей переменных, а также добавляет extras
переменная внутри конфигурации vhost.)
Аналогично для баз данных вы можете иметь postgresql
роль, а postgresql-database
роль и так далее.
Вместо того, чтобы группировать хосты по функциям, вы можете сгруппировать их по ролям и заставить Ansible запускать заданную роль на хосте только в том случае, если этот хост находится в группе, назначенной для этой роли.
[role_db_customdb]
other.com
[role_db_otherdb]
host1.com
[role_website]
host1.com
other.com
Вы даже можете передавать параметры роли, как показано на db
параметр в пьесе ниже.
---
- hosts: all
roles:
- { role: database, db: 'customdb', when: inventory_hostname in groups.role_db_customdb }
- { role: database, db: 'otherdb', when: inventory_hostname in groups.role_db_otherdb }
- { role: website, when: inventory_hostname in groups.role_webservers }