我正在尝试为我的所有服务器创build一个“模板”。 我有2个configuration。 一个NTP客户端(这是在基类类中处理的,我想通过在节点声明中声明特定的东西来创build一个特定于NTP服务器的覆盖,比如“baseclass :: ntp:restrict => true”。或者,我将如何改变一个已经声明的variables从baseclass :: ntp?
有没有人有任何想法主办这样做?
这是我迄今为止:
templates.pp
class baseclass { include defaultusers include sudoers include issue class { ntp: ensure => running, servers => ['ntpserver1.host.com', 'ntpserver2.host.com',], autoupdate => false, } }
nodes.pp
node default { include baseclass } node "ntpserver1.host.com" inherits default { <some code here to declare new variable in baseclass::ntp> <some code here to change existing variable, such as "ensure"> }
你用参数化的类运行了这个问题:它们不支持覆盖。 他们应该,但是由于Puppet中事物初始化顺序的各种问题,你不能覆盖参数到类。 一旦你设定了,你就完成了。 这与定义不同,其中覆盖参数按预期工作。 这个问题有一个公开的错误 ,那就是我们中的一些人已经投票了,正在观看,但似乎没有什么进展。
鉴于此,我的建议是将您的参数化的ntp类重新定义为一个定义,因为一个定义将按照您的想法工作。 改变类如下所示:
define ntp($servers, $autoupdate = false, $ensure = 'running') { # ... put code from class here ... }
然后将baseclass更改为:
ntp { $fqdn: servers => [ 'ntpserver1.host.com', 'ntpserver2.host.com',], }
您将不得不更改类结构来添加新类,因为您不能从节点中的类继承,请将节点更改为:
node "ntpserver1.host.com" inherits default { include hosts::ntpserver1 }
或者你想要命名你的per-host配置类。 然后,在那个班上,你可以做你想做的事情:
class hosts::ntpserver1 inherits baseclass { Ntp["$fqdn"] { ensure => 'stopped' } }
我知道这似乎是一个巨大的周折,特别是如果你习惯在节点内部做一堆东西(不参与类继承树)。 但是,如果不能覆盖类的参数,似乎没有一个好的选择。 (我们管理超过500个节点和大约100个完全独立的服务定义,包含数百个模块和主机之间的大量种类,包括每台主机覆盖,使用这种方法非常好。
TL,DR摘要 :您不能覆盖类参数。 一旦你将一个参数传递给Puppet中的一个类,就完成了。 您可以覆盖定义参数。 因此,任何你想重写的东西都比一个类更好地被定义为一个定义。 但是,请记住,覆盖层次意味着您必须将节点定义的核心放在一个类中,因为只有类可以继承并覆盖另一个类。 因此,如果大量使用覆盖,就要养成让节点定义变得微不足道的习惯(只包括一个完成所有工作的类),这样你的类就可以继承基类并覆盖要定义的参数。
我接受了rra的回答,但是我找到了一个更好的解决方案。 这是一个轻微的黑客,我想:
template.pp
class baseclass ($ntprestrict = 'false') { include defaultusers include sudoers include issue class { ntp: ensure => running, servers => ['ntpserver1.host.com', 'ntpserver2.host.com',], autoupdate => false, restrict => $ntprestrict, } }
nodes.pp
node "ntpserver1.host.com" { class { baseclass: ntprestrict => 'true' } } node "client.host.com" { class { baseclass: ntprestrict => 'false' } }