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

Несколько ресурсов марионетки, которые используют один файл конфигурации

Я разрабатываю собственный модуль марионеток для управления серверами приложений 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",
  }
}

Поскольку вы обертываете конкатенацию файлов, клиентские модули не должны знать о точном механизме, который вы используете для конфигурации, и вы можете добавлять параметры к ресурсу по мере необходимости для его описания естественным образом (т.е. не необходимо писать строки, соответствующие синтаксису файла конфигурации, но с указанием только необходимых данных конфигурации.)