puppetlabs-postgresql:如何正确设置全局variables而没有重复的定义

puppetlabs-postgresql的文档build议在postgresql :: globals中设置值如下:

class { 'postgresql::globals': encoding => 'UTF8', locale => 'en_NG', }-> class { 'postgresql::server': } 

但是,这不起作用:

 class { 'postgresql::client: } class { 'postgresql::globals': encoding => 'UTF8', locale => 'en_NG', }-> class { 'postgresql::server': } 

因为postgresql :: client从postgresql :: globalsinheritancepostgresql ::参数。 所以当它到达postgresql :: globals类的显式实例时,它会抱怨重复的定义。

改变顺序,它确实工作:

 class { 'postgresql::globals': encoding => 'UTF8', locale => 'en_NG', }-> class { 'postgresql::server': } class { 'postgresql::client: } 

然而,在实际使用中,我的postgresql :: client和postgresql :: server的实例化在与我使用的服务器类相关的不同的类中,而且我真的不想为这些类创build所需的sorting。 另外,我希望全局定义适用于postgresql :: client,即使在不运行postgresql :: server的服务器上。

如果我们使用puppet 3.x,我会在hiera中定义所需的全局值,但是我们仍然在2.7。

有没有办法解决这个问题,而不修改puppetlabs分布? 我目前认为这可能需要一个puppetlabs的错误报告,但仍然想知道我是否错过了一个简单的解决scheme。

编辑:阅读@ FelixFrank的input,我已经创build了一个错误报告在https://tickets.puppetlabs.com/browse/MODULES-1466 。

是的,Hiera会是最好的解决scheme。 请注意,您可以(也应该)以插件forms将Hiera添加到Pupet 2.7.x

除了这个,你的select是有限的。 任何两个类之间的require关系都不会起作用。 相反,观察到你的工作清单的下列重构也会产生你的错误:

 class { 'postgresql::server': } <- class { 'postgresql::globals': encoding => 'UTF8', locale => 'en_NG', } 

原因是问题是基于parsing顺序评估顺序 – 清单编译器遇到类声明的顺序。 require/before参数(和链接箭头)只添加关系到正在构build的目录,供puppet agent

基本上,你必须确保你自己的PostgreSQL服务器类总是在客户端类之前被评估,例如

 role::posgre_server_with_client { include profiles::postgre_server include profiles::postgre_client } 

在复杂的清单(这可能include来自众多上下文的客户端function)中,并不总能保证这种sorting。 因此,我认为在这个模块中声明这个bug是很有必要的。 由于导致问题的模式相当普遍(我认为),所以总的来说,可能有理由质疑当前的模块devise实践。

我会看到关于这个从社区收集更多的意见。