puppetlabs-postgresql:如何正确设置全局变量而不进行重复定义

puppetlabs-postgresql:如何正确设置全局变量而不进行重复定义

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。因此,我认为有充分的理由将此声明为模块中的错误。由于导致问题的模式相当普遍(我认为),因此可能有理由质疑当前的模块设计实践。

我将尽力收集社区对此的更多意见。

相关内容