如何在现有的Puppet类中编写包装器类/覆盖配置

时间:2016-02-04 13:28:42

标签: mysql puppet puppet-enterprise librarian-puppet

我想覆盖另一个Puppet Modules中另一个类的值。请通过建议的方式帮助我。

现有类:(模块名称:MySQL)

class mysql::server (
  $config_file             = $mysql::params::config_file,
  $includedir              = $mysql::params::includedir)
{
  My Code Logics
}

我当前的课程:(模块名称:个人资料)

Class profiles::mysql () {
    class { '::mysql::server':
        config_file => '/opt/arunraj',
        includedir  => true
    }
}

当我这样做时,我收到重复的类声明错误。这是覆盖两个类之间的值的最佳方法

1 个答案:

答案 0 :(得分:1)

首先,您的示例代码不完整。您提供了类mysql::serverprofiles::mysql定义,后者包含类mysql::server的资源样式声明,但是您对给定的一个碰撞的类mysql::server的一个或多个其他声明没有任何说明。您实际呈现的内容不足以产生您描述的错误。

另请注意,使用resource-style class declarations通常是不好的形式,特别是对于声明任何模块的公共类,尤其是声明属于与声明出现的模块不同的模块的类。原因有点技术性,但在很大程度上,它们归结为引发您遇到的那种错误的风险。每当Puppet评估已经为其声明了声明(任何样式)的类的资源样式声明时,就会发生这种情况,因为类参数值被绑定为评估第一次遇到的声明的一部分。

自定义类参数值的最佳方法是依靠自动数据绑定(Hiera)将值绑定到这些参数。如果你有一台需要不同参数值的奇怪机器,那么你将它们设置在数据层次结构的优先级别高于普通值的优先级,并且其范围足够窄以避免影响应该具有普通值的机器参数。

此外,为了避免您描述的那种错误,您还应该确保在任何地方只对类似于包含类似的声明使用可能被多次声明的任何类(即任何公共类和一些私有类)。这与自动绑定密切相关,因为如果您不使用类似资源的声明,那么自动数据绑定是您自定义类参数值的最佳方法。经典的包含式声明是通过include函数本身,但requirecontainhiera_include函数也提供了包含样式的声明(在语义上有各种不同) )。如果您正在使用ENC来声明类,那么它可能会生成任何一种样式。