Puppet Roles / Profiles和init.pp类仅参数化

时间:2016-12-18 00:52:08

标签: puppet roles profiles

我会将Craig Dunn和URL https://docs.puppet.com/pe/2016.4/r_n_p_full_example.html所解释的角色/个人资料模式应用于我使用https://docs.puppet.com/guides/module_guides/bgtm.html指定的规则构建的模块。

遵循这些规则,每个组件模块(如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.
    #
}

好吧,我通常使用Roles / Profiles类(比如profile :: apache,profile :: openldap),使用类似于类似或类似资源的组件类声明。

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

#
# 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'
    }
}

过去我使用参数化组件类,在子配置文件类中,我可以直接调用组件类,而不会覆盖组件类的init.pp的参数。

这是我的老习惯:

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'
    }
}

所以,使用我的新编码方式,如果我只使用init.pp组件类参数化,如何应用角色/配置文件模式?

1 个答案:

答案 0 :(得分:4)

Puppet DSL不是一种面向对象的语言,就像你认为的那样。特别是,类继承不符合您的想法。 The language specification remarks

  

类继承应该非常谨慎地使用,一般只在   以下情况:

     
      
  • 当您需要覆盖基类中的资源属性时。
  •   
  • 让“params类”为另一个类的参数提供默认值:
  •   
     

[...]在几乎所有其他情况下,继承是不必要的复杂性。

实际上,只有后者使用继承才是常见的。

您正在尝试修改父类本身的类参数,

  1. 未通过从该类继承而启用(它与覆盖该类声明的资源的属性完全不同),并且
  2. 一般不会也不能在Puppet中工作。
  3. 确实,语言指南也说(重点补充):

      

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

    当你说...

      

    过去我使用参数化组件类,在子配置文件中,我可以直接调用组件类,而不会覆盖组件类的init.pp的参数。

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

      

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

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