【问题标题】:How to write a wrapper class / Override configuration in pre existing Puppet Class如何在现有的 Puppet 类中编写包装类/覆盖配置
【发布时间】:2016-02-04 13:28:42
【问题描述】:

我想覆盖另一个 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
    }
}

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

【问题讨论】:

    标签: mysql puppet puppet-enterprise librarian-puppet


    【解决方案1】:

    首先,您的示例代码不完整。您提供了类mysql::serverprofiles::mysql定义,后者包含类mysql::server 的资源样式声明,但你对那个只字未提或多个 othermysql::server 的声明与给定的冲突。您实际呈现的内容不足以产生您描述的错误。

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

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

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

    【讨论】:

    • 如果我错了,请纠正我。然后如何使用现有模块编写扩展/包装器。因为,如果我们进行类似包含的声明。我们不能用我们的新定制覆盖/我们将被限制在某个级别。我对吗 ?如果我错了,你能用任何样本解释一下吗?
    • @ArunRaj,我重申:所有公共类的类参数定制都应该通过自动数据绑定来执行,这意味着 Hiera。在 Hiera 中,您可以提供具有任何您喜欢的特定程度的定制数据,甚至可以逐台提供。但是,我无法真正解决您关于如何编写“扩展”或“包装器”的问题,因为尚不清楚这对您意味着什么,而且无论如何它似乎对 SO 来说过于宽泛和开放。
    • forge.puppetlabs.com/puppetlabs/mysql 我正在尝试为上述代码编写我们的自定义配置文件类。而且我想通过我的配置文件类而不是预先存在的 Mysql::server 类来配置值,我也不想影响现有的模块。换句话说,我想在新类中使用我的新配置值重用现有功能。我真的很确定这是一个范围广泛的问题还是范围很短的问题。非常感谢任何帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多