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实践。
我会看到关于这个从社区收集更多的意见。