在Puppet的节点声明中更改类variables

我正在尝试为我的所有服务器创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' } }