Puppet 傀儡角色/配置文件和init.pp类仅参数化

Puppet 傀儡角色/配置文件和init.pp类仅参数化,puppet,roles,profiles,Puppet,Roles,Profiles,我希望将Craig Dunn和at URL解释的角色/配置文件模式应用于使用在中指定的规则构建的模块 遵循这些规则,每个组件模块(如Apache、OpenLDAP)只对init.pp类进行参数化 # # Component classes. # class apache ($logfile = '.log', $backend = $::apache::params::backend) inherits ::apache::params { # # This is the un

我希望将Craig Dunn和at URL解释的角色/配置文件模式应用于使用在中指定的规则构建的模块

遵循这些规则,每个组件模块(如Apache、OpenLDAP)只对init.pp类进行参数化

#
# Component classes.
#

class apache ($logfile = '.log', $backend = $::apache::params::backend) inherits ::apache::params {
    #
    # This is the unique parametrized class.
    #
}

class apache::log inherits ::apache {
    #
    # This class inherits the params.
    #
}
嗯,我通常使用角色/概要文件类(比如profile::apache、profile::openldap)来使用组件类的include-like或resource-like声明

如果我在父概要文件类(如profile::apache)中使用类似资源的声明,并且使用继承的概要文件(如profile::apache::openssh或profile::apache::openldap)来应用新功能,我需要覆盖组件的父定义,但使用Puppet v4,我无法覆盖父概要文件(类)中声明的组件类[::apache]{backend=>'ldap'})或使用资源收集器(类{backend=>'ldap'})


因此,在我新的编码风格中,如果我只使用init.pp组件类参数化,我如何应用角色/配置文件模式呢?

Puppet DSL并不是您认为的面向对象语言。特别是,类继承并不是您认为的那样

类继承应该非常少地使用,通常只在 以下情况:

  • 当需要重写基类中的资源属性时
  • 要让“params类”为另一个类的参数提供默认值,请执行以下操作:
[…]在几乎所有其他情况下,继承都是不必要的复杂性

在实践中,只有继承的后一种用法是常见的

您正试图修改父类本身的类参数,这

  • 不是通过从该类继承而启用的(这与重写该类声明的资源属性有很大不同),并且
  • 一般来说,木偶不起作用,也不能起作用
  • 事实上,《语言指南》还说(重点补充):

    如果基类具有参数,则这些参数必须具有默认值,或由自动外部数据查找提供其值。。不能用Puppet语言为继承类中的参数指定值


    当你说

    在过去,我使用参数化组件类,在子概要文件中,我可以直接调用组件类,而无需重写组件类的init.pp的参数

    …我想您的意思是,您使用了类似资源的类声明,以便在清单中指定参数值。在大多数情况下,这种风格很差,但声明同一模块的私有类的类除外

    那么,如果我只使用init.pp组件类参数化,如何应用角色/配置文件模式呢


    正如语言指南所说,依靠外部数据查找(即Hiera)自定义模块参数。请注意,这也适用于组件模块。鉴于存在继承自类apache的公共类apache::log,您不应该通过类似资源的语法声明后者。

    Puppet DSL在您看来不是面向对象的语言.特别是,类继承并不像您所想的那样:

    类继承应该非常少地使用,通常只在 以下情况:

    • 当需要重写基类中的资源属性时
    • 要让“params类”为另一个类的参数提供默认值,请执行以下操作:
    […]在几乎所有其他情况下,继承都是不必要的复杂性

    在实践中,只有继承的后一种用法是常见的

    您正试图修改父类本身的类参数,这

  • 不是通过从该类继承而启用的(这与重写该类声明的资源属性有很大不同),并且
  • 一般来说,木偶不起作用,也不能起作用
  • 事实上,《语言指南》还说(重点补充):

    如果基类具有参数,则这些参数必须具有默认值,或由自动外部数据查找提供其值。。不能用Puppet语言为继承类中的参数指定值


    当你说

    在过去,我使用参数化组件类,在子概要文件中,我可以直接调用组件类,而无需重写组件类的init.pp的参数

    …我想您的意思是,您使用了类似资源的类声明,以便在清单中指定参数值。在大多数情况下,这种风格很差,但声明同一模块的私有类的类除外

    那么,如果我只使用init.pp组件类参数化,如何应用角色/配置文件模式呢


    正如语言指南所说,依靠外部数据查找(即Hiera)自定义模块参数。请注意,这也适用于组件模块。鉴于存在继承自类
    apache
    的公共类
    apache::log
    ,您不应该通过类似资源的语法声明后者。

    我已经更新了问题。但我只能使用外部数据查找吗?没有任何其他方法?如果我需要这些类可以根据最终用户包含的组件::apache类的参数“后端”进行编辑,那么我如何定义profile::apache::openldap或profile::apache::mysql?@BnG除了这个答案之外,您的配置文件和模块的设计模式是混乱和复杂的。如果您nt制作一个灯的配置文件,然后制作一个包含必要类的灯的配置文件。不要让这种方式对你自己造成太大的影响。@BnG,我看不到你的编辑所引入的任何东西对我所说的有什么影响
    #
    # Profile classes.
    #
    
    class profile::apache {
        class { ::apache:
            logfile => '.my_log',
        }
    }
    
    class profile::apache::openldap inherits profile::apache {
        include ::openldap
    
        # Doesn't work with Puppet 4.
        Class[::apache] {
            backend => 'ldap'
        }
    
        #
        # OR...
        #
    
        # Also, doesn't work with Puppet 4.
        Class <| name=='::apache'|> {
            backend => 'ldap'
        }
    }
    
    class apache::backend ($backend) inherits ::apache {
        #
        # Do stuff.
        #
    }
    
    class profile::apache::openldap inherits profile::apache {
        include ::openldap
    
        class { ::apache::backend:
            backend => 'ldap'
        }
    }
    
    class profile::apache::mysql inherits profile::apache {
        include ::mysql
    
        class { ::apache::backend:
            backend => 'mysql'
        }
    }