我正在开发一个用于pipe理JBoss应用程序服务器的自定义puppet模块。 我认为应用程序服务器上部署的每个应用程序都是一个独立的资源。 但是有些应用程序需要在JBoss的configuration文件中进行专门的configuration更改。
每个应用程序也是一个puppet资源,但大多数应用程序并不知道对方。
目前,我使用augeas在JBoss的configuration文件上执行更改。 即使许多资源需要在configuration文件上进行更改,也是如此,但它非常复杂,容易出错,速度也很慢。
其实我想为configuration文件使用模板,但问题是我怎么可以聚集所有来自不同(子)模块的所需的工件,然后触发模板机制,而不必知道如何configuration人工配件呢?
例:
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”的所有调用之后,如何定义一次触发模板的依赖项? Notify似乎不起作用,因为它会在每个configuration步骤之后触发模板。
我这样做的方法是使用concat模块,它将处理所有的通知来构buildconfiguration文件本身,并将其包装在特定于应用程序的资源定义中。 我最后的意思是这样的:
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", } }
因为你正在包装文件连接,所以客户端模块不必知道你正在使用的configuration的确切机制,并且可以根据需要添加参数来以自然的方式描述它(即不是必须编写与configuration文件语法相匹配的string,但只指定必要的configuration数据。)