Я использую подход ролей и профилей для моего текущего марионеточного проекта.
Лучшие практики марионеток говорят мне:
Теперь я сталкиваюсь с следующая проблема (с использованием puppet 5.5):
У меня есть один базовый профиль, который включается всеми узлами (настройка apt, установка часового пояса, серверов времени и т. д.). Затем у меня есть несколько профилей для конкретных приложений (например, один для настройки IIS, один для настройки haproxy и т. Д.). Теперь я хотел бы добавить сервер журналов в свои профили приложений. Конечно, я рассчитываю указать сервер журналов только один раз в иерархии (быть СУХИМ), но использовать его во всех профилях.
Мой первый подход - добавить параметр сервера журнала в список параметров моего базового профиля, а затем получить к нему доступ из профили приложений с использованием ограниченного доступа к переменным. Но это противоречит лучшим практикам, поскольку добавляет скрытый интерфейс / зависимость между модулями.
Другой подход, который я могу придумать, - это ввести общую переменную 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')}"
Это сохраняет профили независимыми и поддерживает DRY.