Назад | Перейти на главную страницу

Ansible повторяющиеся роли

Я использую 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 }