1

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

现有类:(模块名称: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
    }
}

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

4

1 回答 1

1

首先,您的示例代码不完整。您提供了classes和的定义,后者包含class的资源样式声明,但您没有提及给定的一个或多个其他class 声明冲突。您实际呈现的内容不足以产生您描述的错误。mysql::serverprofiles::mysqlmysql::servermysql::server

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

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

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

于 2016-02-04T15:44:03.597 回答