Я разрабатываю собственный модуль марионеток для управления серверами приложений JBoss. Я считаю каждое приложение, развернутое на сервере приложений, автономным ресурсом. Но для некоторых приложений требуются специальные изменения конфигурации в файле конфигурации JBoss.
Каждое приложение также является марионеточным ресурсом, но большинство приложений не знают друг друга.
На данный момент я вношу изменения в конфигурационный файл JBoss с помощью augeas. Это работает, даже если многие ресурсы требуют изменений в этом файле конфигурации, но это очень сложно, подвержено ошибкам и медленно.
На самом деле я хочу использовать шаблоны для файла конфигурации, но вопрос в том, как я могу агрегировать все необходимые артефакты, поступающие из разных (под) модулей, перед запуском механизма шаблонов, не зная, каковы артефакты конфигурации человека?
Пример:
define jboss_config($config) {
# do something with the config
}
jboss_config {
config => 'some configuration for app 1'
}
jboss_config {
config => 'some configuration for app 2'
}
jboss_config {
config => 'some configuration for app 3'
}
jboss_config {
config => 'some configuration for app 4'
}
jboss_config {
config => 'some configuration for app 5'
}
#now, as all calls to "jboss_config" are done,
#perform templating of the configuration file.
Как я могу определить зависимость, которая запускает шаблон один раз после того, как все вызовы "jboss_config" выполнены? Уведомление, похоже, не работает, потому что оно запускает создание шаблонов после каждого шага настройки.
Мой подход к подобным вещам - использовать concat модуль, который будет обрабатывать все уведомления для создания самого файла конфигурации и заключать его в определения ресурсов для конкретного приложения. Под последней частью я подразумеваю примерно следующее:
class jboss {
concat { '/path/to/jboss/config/file':
owner => 'whoever',
group => 'whoever',
mode => 'whatever',
}
concat::fragment { 'jboss header':
target => '/path/to/jboss/config/file',
content => template('jboss/config.header.erb'),
order => 00,
}
concat::fragment { 'jboss footer':
target => '/path/to/jboss/config/file',
content => template('jboss/config.footer.erb'),
order => 99,
}
}
define jboss_config ($config) {
concat::fragment { "jboss config ${title}":
target => '/path/to/jboss/config/file',
content => template('jboss/config.item.erb'),
# Alternately, if your needs are simple enough:
#content => "${config}\n",
}
}
Поскольку вы обертываете конкатенацию файлов, клиентские модули не должны знать о точном механизме, который вы используете для конфигурации, и вы можете добавлять параметры к ресурсу по мере необходимости для его описания естественным образом (т.е. не необходимо писать строки, соответствующие синтаксису файла конфигурации, но с указанием только необходимых данных конфигурации.)