it-swarm.com.ru

Настройте Ansible роли с зависимыми ролями

Проблема лучше всего описана на примере:

Есть две роли:

  • mailserver: базовая конфигурация почтового сервера
  • mailinglist: приложение списка рассылки

Программному обеспечению списка рассылки необходим почтовый сервер для транспортировки входящих сообщений в «виртуальную папку входящих» программного обеспечения списка рассылки. Это требует некоторой настройки почтового сервера. Но почтовый сервер не знает ни о роли списка рассылки, ни о других ролях с аналогичными требованиями к конфигурации.

Что я хотел бы сделать, это:

  • mailinglist (и другие подобные роли) хранит конфигурацию транспорта в переменной transport_config. Это может быть «транспортная карта», такая как $ email => $ spool.
  • mailinglist зависит от роли mailserver.
  • mailserver настраивает его "транспорт", используя переменную transport_config.

Есть ли способ сделать что-то подобное в Ansible? Или другое решение этой проблемы? нет возможно использовать переменные роли, такие как {role: mailserver, transport_config: ...}, поскольку в зависимости от почтового сервера может быть несколько ролей.

Я могу подумать об обходном пути: почтовый сервер читает/анализирует каталог конфигурации, в котором определены транспортные карты. mailinglist и другие роли добавляют файлы в этот каталог. Проблема здесь в том, что для этого часто требуется «построитель конфигурации», который читает такие каталоги конфигурации и генерирует основной файл конфигурации.

11
Christian

В ответ на ваш комментарий о «компоновщике конфигурации» см. сборка модуля ansible . Сложная часть может заключаться в том, чтобы собрать все файлы в одном месте, прежде чем запускать модуль сборки.

В противном случае предложение Тимы о Host_ и group_vars имеет смысл.

3
encoded

Вы можете сделать это, используя роль зависимости .

В роли mailinglist под roles/mailinglist/meta/main.yml добавьте что-то вроде этого:

---
dependencies:
  - { role: mailserver, transport_config: ... }

Сделайте то же самое для любых других подобных ролей.

19
Ben Whaley

Я знаю, что на это давно дан ответ, но я только нашел подходящее решение, и оно немного подло.

Я использую третью роль settings, в которой нет задач, только переменные в defaults/main.yml. Документы по этому вопросу немного расплывчаты, но значения здесь отражаются на всех зависимых ролях, поэтому, если обе роли зависят от settings через свои файлы meta/main.yml, обе получают общий набор значений. Они могут быть переопределены обычными способами через файл group_vars.

Меня удивило то, что, поскольку да, роль settings используется более одного раза, это не имеет значения, поскольку в ней нет задач, и эти данные могут передаваться оттуда вверх по цепочке зависимостей.

Это совершенно новая форма потока данных в Ansible, которую я не знал, что это возможно. 

2
Stuart Watt

Рассмотрите возможность управления файлом конфигурации mailserver с помощью чего-то вроде dotdee:

С dotdee вы собираете ваш окончательный файл конфигурации из серии файлов, помещенных в каталог .d.

В вашем случае роль mailinglist и другие, зависящие от mailserver, отбросят фрагменты конфигурации в каталоге .d (созданный ролью mailserver) и запустят команду для обновления файла конфигурации mailserver, например dotdee --update /path/to/mailserver/conf.

2
LeoRochael

Я не достаточно знаком с вашими приложениями здесь, чтобы быть уверенным, но я думаю, что вам лучше использовать переменные хоста или группы для передачи вашей конфигурации вашим ролям. Роли могут содержать ваши значения по умолчанию и т.д. И ожидать получения значений переменных хоста/группы, которые вы устанавливаете индивидуально. Это может означать, что каждый экземпляр приложения рассматривается как хост, а не как психический хост. То, как вы смоделируете это, зависит от многих тонкостей вашего рабочего процесса, конфигурации и приложения. 

Этот недавний поток затрагивает некоторые вещи такого рода: https://groups.google.com/forum/#!topic/ansible-project/yrnsx2Mw6rc

0
tima