Я использую подход ролей и профилей для моего текущего марионеточного проекта.
Лучшие практики марионеток говорят мне:
Теперь я столкнулся со следующей проблемой (с использованием марионетки 5.5):
У меня есть один базовый профиль, который включается всеми узлами (настройка apt, установка часового пояса, серверов времени и т. Д.). Затем у меня есть несколько профилей для конкретных приложений (например, один для настройки IIS, один для настройки haproxy и т. Д.). Теперь я хотел бы добавить сервер журналов в свои профили приложений. Конечно, я рассчитываю указать сервер журналов только один раз в hiera (быть СУХИМ), но использовать его во всех профилях.
Мой первый подход - добавить параметр сервера журнала в список параметров моего базового профиля, а затем получить к нему доступ из профилей приложений, используя доступ к переменной с ограниченной областью действия. Но это противоречит лучшим практикам, потому что добавляет скрытый интерфейс / зависимость между модулями.
Другой подход, который я могу придумать, - это ввести общую переменную hiera, которую я ищу с помощью явного поиска. Например.:
class profile::haproxy(
Stdlib::Host $log_server = lookup('common::log_server'),
) {}
Мне это тоже кажется подозрительным.
Итак, мой вопрос: как я могу делиться переменными между модулями / профилями, не нарушая лучших практик?
Я бы использовал функцию интерполяции в самой hiera:
common::log_server: foo
profile::haproxy::log_server: "%{lookup('common::log_server')}"
profile::iis::log_server: "%{lookup('common::log_server')}"
Это сохраняет независимость профилей и поддерживает СУХОЙ.