настройте ansible роли с зависимыми ролями

<p>проблема лучше всего описана на примере:</p><p>есть две роли:</p><ul> <li><code>mailserver</code>: базовая конфигурация почтового сервера</li> <li><code>mailinglist</code>: приложение списка рассылки</li> </ul><p>программному обеспечению списка рассылки необходим почтовый сервер для транспортировки входящих сообщений в «виртуальную папку входящих» программного обеспечения списка рассылки. это требует некоторой настройки почтового сервера. но почтовый сервер не знает ни о роли списка рассылки, ни о других ролях с аналогичными требованиями к конфигурации.</p><p>что я хотел бы сделать, это:</p><ul> <li><code>mailinglist</code> (и другие подобные роли) хранит конфигурацию транспорта в переменной <code>transport\_config</code>. это может быть «транспортная карта», такая как $ email => $ spool.</li> <li><code>mailinglist</code> зависит от роли <code>mailserver</code>.</li> <li><code>mailserver</code> настраивает его "транспорт", используя переменную <code>transport\_config</code>.</li> </ul><p>есть ли способ сделать что-то подобное в ansible? или другое решение этой проблемы?<em> нет </em>возможно использовать переменные роли, такие как <code>{role: mailserver, transport\_config: ...}</code>, поскольку в зависимости от почтового сервера может быть несколько ролей.</p><p>я могу подумать об обходном пути: почтовый сервер читает/анализирует каталог конфигурации, в котором определены транспортные карты. <code>mailinglist</code> и другие роли добавляют файлы в этот каталог. проблема здесь в том, что для этого часто требуется «построитель конфигурации», который читает такие каталоги конфигурации и генерирует основной файл конфигурации.</p>

<p>в ответ на ваш комментарий о «компоновщике конфигурации» см. <a href="http://docs.ansible.com/assemble\_module.html">сборка модуля ansible</a> . сложная часть может заключаться в том, чтобы собрать все файлы в одном месте, прежде чем запускать модуль сборки.</p><p>в противном случае предложение тимы о host\_ и group\_vars имеет смысл.</p>

<p>вы можете сделать это, используя <a href="https://docs.ansible.com/ansible/latest/user\_guide/playbooks\_reuse\_roles.html#role-dependencies">роль зависимости</a> .</p><p>в роли <code>mailinglist</code> под <code>roles/mailinglist/meta/main.yml</code> добавьте что-то вроде этого:</p><pre><code>--- dependencies: - { role: mailserver, transport\_config: ... } </code></pre><p>сделайте то же самое для любых других подобных ролей.</p>

<p>я знаю, что на это давно дан ответ, но я только нашел подходящее решение, и оно немного подло.</p><p>я использую третью роль <code>settings</code>, в которой нет задач, только переменные в <code>defaults/main.yml</code>. документы по этому вопросу немного расплывчаты, но значения здесь отражаются на всех<em> зависимых </em>ролях, поэтому, если обе роли зависят от <code>settings</code> через свои файлы <code>meta/main.yml</code>, обе получают общий набор значений. они могут быть переопределены обычными способами через файл <code>group\_vars</code>.</p><p>меня удивило то, что, поскольку да, роль <code>settings</code> используется более одного раза, это не имеет значения, поскольку в ней нет задач, и эти данные могут передаваться оттуда вверх по цепочке зависимостей.</p><p>это совершенно новая форма потока данных в ansible, которую я не знал, что это возможно. </p>

<p>рассмотрите возможность управления файлом конфигурации <code>mailserver</code> с помощью чего-то вроде <code>dotdee</code>:</p><ul> <li> <a href="http://blog.dustinkirkland.com/2011/04/dotdee-modern-proposal-for-improving.html">оригинальный пост дастина киркланда с описанием концепции</a> </li> <li> <a href="https://launchpad.net/dotdee">хранилище дастина <code>dotdee</code></a> </li> <li> <a href="https://pypi.python.org/pypi/update-dotdee">более простая реализация с меньшим количеством функций в python</a> </li> </ul><p>с <code>dotdee</code> вы собираете ваш окончательный файл конфигурации из серии файлов, помещенных в каталог <code>.d</code>.</p><p>в вашем случае роль <code>mailinglist</code> и другие, зависящие от <code>mailserver</code>, отбросят фрагменты конфигурации в каталоге <code>.d</code> (созданный ролью <code>mailserver</code>) и запустят команду для обновления файла конфигурации <code>mailserver</code>, например <code>dotdee --update /path/to/mailserver/conf</code>.</p>

<p>я не достаточно знаком с вашими приложениями здесь, чтобы быть уверенным, но я думаю, что вам лучше использовать переменные хоста или группы для передачи вашей конфигурации вашим ролям. роли могут содержать ваши значения по умолчанию и т.д. и ожидать получения значений переменных хоста/группы, которые вы устанавливаете индивидуально. это может означать, что каждый экземпляр приложения рассматривается как хост, а не как психический хост. то, как вы смоделируете это, зависит от многих тонкостей вашего рабочего процесса, конфигурации и приложения. </p><p>этот недавний поток затрагивает некоторые вещи такого рода: <a href="https://groups.google.com/forum/#!topic/ansible-project/yrnsx2mw6rc">https://groups.google.com/forum/#!topic/ansible-project/yrnsx2mw6rc</a> </p>