我会将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组件类参数化,如何应用角色/配置文件模式?
答案 0 :(得分:4)
Puppet DSL不是一种面向对象的语言,就像你认为的那样。特别是,类继承不符合您的想法。 The language specification remarks:
类继承应该非常谨慎地使用,一般只在 以下情况:
- 当您需要覆盖基类中的资源属性时。
- 让“params类”为另一个类的参数提供默认值:
[...]在几乎所有其他情况下,继承是不必要的复杂性。
实际上,只有后者使用继承才是常见的。
您正在尝试修改父类本身的类参数,
确实,语言指南也说(重点补充):
如果基类具有参数,那么这些参数必须具有默认值或通过自动外部数据查找提供其值。您不能使用Puppet语言为继承类中的参数指定值。
当你说...
过去我使用参数化组件类,在子配置文件中,我可以直接调用组件类,而不会覆盖组件类的init.pp的参数。
...我想你的意思是你使用了类似资源的类声明,以便在清单中指定参数值。在大多数情况下,这种风格很差,除了是一个声明同一模块的私有类的类。
那么,如果我只使用init.pp组件类参数化,如何应用角色/配置文件模式?
正如语言指南所说,依靠外部数据查找(即Hiera)来定制模块参数。另请注意,这也适用于组件模块。鉴于存在从类apache::log
继承的公共类apache
,您不应该通过类似资源的语法声明后者。