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

Обратные вызовы или хуки, а также многоразовые серии задач в ролях Ansible

Я изо всех сил пытаюсь сделать свои роли в Ansible в некоторой степени компонуемыми и пригодными для повторного использования.

У меня есть роль, которая выполняет несколько этапов. В зависимости от других ролей, применяемых к узлу, другие роли должны запускать задачи на каждом этапе.

Я работаю с PostgreSQL и управлением расширениями PostgreSQL, но для простоты воспользуемся примером веб-сервера и некоторых приложений, которые на нем работают.

В webserver роль:

В myapp роль должна иметь возможность добавлять некоторые настройки в конфигурацию веб-сервера, которые должен применяться до создания базы данных веб-сервера. Он также должен выполнить некоторые действия до того, как будет впервые указан веб-сервер.

В myotherapp роль также необходимо добавить некоторые настройки в конфигурацию веб-сервера перед первым запуском, не сбивая настройки из myapp. Он также должен выполнить некоторые действия после первого запуска веб-сервера, перезапустить его, выполнить дополнительную работу и снова перезапустить.

(Это надумано, но выражает все потребности моего реального варианта использования, не вдаваясь в подробности о внутренностях PostgreSQL, которые вы когда-либо хотели знать).

Я думал, что смогу использовать для этого обработчики. Есть webserver просто огонь notifys на каждом соответствующем шаге, чтобы другие роли могли подключать эти уведомления для добавления в списки или добавления ключей к хэшам, используемым для создания шаблонов конфигурации, запускать свои собственные задачи и т. д. restart_webserver обработчик, который myotherapp может уведомлять каждый раз, когда он хочет выполнить перезапуск, без необходимости знать, как этот перезапуск фактически выполняется. и т.п.

Тем не мение:

Так что обработчики и уведомления, похоже, не умеют это делать.

Как написать составные задачи и роли?

Я пытаюсь использовать велосипедное колесо в качестве молотка? Вы просто не должны таким образом использовать роли? Кажется, это согласуется с концепцией роль.

Должно ли быть написано что-то неопределенно повторно используемое или менее чем полностью линейное, отбросив систему Ansible задач / ролей / переменных / и т. Д. И сделав это на Python в качестве модуля Ansible? Если да, то есть ли какой-либо практический способ реализовать большую часть мозгов такого модуля, как списки задач Ansible, файлы переменных yml и т. Д., И просто иметь логику управления в модуле, чтобы модуль не нужно было повторно реализовать тонны вещей?


Версия "PostgreSQL кишки":

Итак, узел BDR - это сервер PostgreSQL, у которого есть расширение BDR и расширение pg_stat_statements, а также другие.

я ожидается чтобы иметь возможность выставлять обработчики в postgres_server роль и вызывать их из других ролей по мере необходимости, чтобы активировать соответствующие действия в postgres_server роль, как перезапуск сервера БД, но, похоже, она совсем не так спроектирована.

Понимаю ли я все это полностью задом наперед, думая о ролях Ansible как о моделировании? роли?

Я не знаком с PostgreSQL, поэтому я не уверен в содержимом различных файлов конфигурации, которые вы упомянули, но если вам нужно разрешить нескольким ролям участвовать в одном файле конфигурации, я сделал это одним из двух способов в зависимости от от того, что поддерживает файл конфигурации:

  1. Используйте файл конфигурации с большим количеством операторов include, чтобы включить дополнительные файлы конфигурации, расположенные в подкаталогах. Это хорошо работает с чем-то вроде Apache для правил перезаписи, директив конфигурации для конкретных приложений и виртуальных хостов.

  2. Соберите файл конфигурации из нескольких файлов частичной конфигурации, хранящихся в каталоге, используя собрать модуль. Я использовал этот метод для создания файла master.cf для Postfix, поскольку у меня был postfix роль и другая роль, которую необходимо добавить в файл Postfix master.cf. Поэтому я изменил postfix роль для создания каталога /etc/postfix/master.d и обработчика, который собирает файлы в этом каталоге в файл master.cf. К сожалению, как вы отметили, поскольку я не могу вызвать обработчик в postfix роль из другой роли, мне пришлось дублировать этот обработчик в моей дополнительной роли. Это немного меньше, чем идея, но это работает и идемпотентно.