puppetlabs-postgresql 的文档建议在 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::parameters,而后者又继承自 postgresql::globals。因此,当它显式实例化 postgresql::globals 类时,它会抱怨重复定义。
改变顺序,它确实有效:
class { 'postgresql::globals':
encoding => 'UTF8',
locale => 'en_NG',
}->
class { 'postgresql::server':
}
class { 'postgresql::client: }
然而,在实际使用中,我对 postgresql::client 和 postgresql::server 的实例化位于与我使用的服务器类相关联的不同类中,我真的不想为这些类创建必需的顺序。此外,我希望全局定义即使在未运行 postgresql::server 的服务器上也适用于 postgresql::client。
如果我们使用的是 puppet 3.x,我会在 hiera 中定义所需的全局值,但我们仍然使用 puppet 2.7。
有没有办法在不修改 puppetlabs 发行版的情况下修复此问题?我目前认为这可能需要向 puppetlabs 提交错误报告,但仍然想知道我是否只是缺少一个简单的解决方案。
编辑:阅读@FelixFrank 的意见后,我创建了一个错误报告https://tickets.puppetlabs.com/browse/MODULES-1466。
答案1
是的,Hiera 是最好的解决方案。请注意,您可以(并且应该)2.7.x
以插件形式将 Hiera 添加到 Pupet。
除此之外,你的选择是有限的。require
任何两个类之间的关系将不会会产生影响。相反,请注意,对工作清单进行以下重构也会产生错误:
class { 'postgresql::server': }
<-
class { 'postgresql::globals':
encoding => 'UTF8',
locale => 'en_NG',
}
原因是这个问题是基于解析顺序或者评估顺序- 清单编译器遇到类声明的顺序。require/before
参数(和链接箭头)仅将关系添加到正在构建的目录中,以供使用puppet agent
。
基本上,你必须确保你自己的 PostgreSQL 服务器类总是在客户端类之前被评估,例如
role::posgre_server_with_client {
include profiles::postgre_server
include profiles::postgre_client
}
在复杂的清单中(尤其是来自众多上下文的客户端功能),这种排序并不总是能够得到保证include
。因此,我认为有充分的理由将此声明为模块中的错误。由于导致问题的模式相当普遍(我认为),因此可能有理由质疑当前的模块设计实践。
我将尽力收集社区对此的更多意见。