我正在开发一个用于管理 JBoss 应用服务器的自定义 puppet 模块。我将部署在应用服务器上的每个应用程序视为一个独立的资源。但有些应用程序需要在 JBoss 的配置文件中进行专门的配置更改。
每个应用程序也是一个傀儡资源,但大多数应用程序彼此并不认识。
目前我使用 augeas 对 JBoss 的配置文件进行更改。即使许多资源都需要更改该配置文件,这种方法也能奏效,但它非常复杂、容易出错且速度很慢。
实际上,我想对配置文件使用模板,但问题是,在触发模板机制之前,如何聚合来自不同(子)模块的所有必需工件,而不必知道有多少个配置工件?
例子:
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”的所有调用完成后触发一次模板?通知似乎不起作用,因为它会在每个配置步骤后触发模板。
答案1
对于这样的事情,我常用的方法是使用连接模块,它将处理构建配置文件本身的所有通知,并将其包装在特定于应用程序的资源定义中。最后一部分的意思如下:
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",
}
}
因为您正在包装文件连接,所以客户端模块不必知道您用于配置的确切机制,并且您可以根据需要向资源添加参数以自然的方式描述它(即不必编写与配置文件语法匹配的字符串,而只指定必要的配置数据。)