我正在尝试为我的所有服务器创建一个"template"。我有 2 个配置。 NTP 客户端(在基类中处理。我想通过在节点声明中声明特定的内容来创建特定于 NTP 服务器的覆盖。类似于“baseclass::ntp:restrict => true”。或者或者,我如何更改 baseclass::ntp 中已声明的变量之一?
主持人有没有人有任何想法可以做到这一点?
这是我目前所拥有的:
模板.pp
class baseclass {
include defaultusers
include sudoers
include issue
class { ntp:
ensure => running,
servers => ['ntpserver1.host.com',
'ntpserver2.host.com',],
autoupdate => false,
}
}
节点.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 中事物初始化顺序的各种问题,您不能覆盖类的参数。一旦你设置了它们,你就完成了。这与定义不同,在定义中覆盖参数按您预期的方式工作。有一个 open bug关于这一点,我们中的很多人都投了赞成票并正在关注,但似乎进展甚微。
鉴于此,我的建议是将您的参数化 ntp 类改写为定义,因为定义将完全按照您的需要工作。将类更改为:
define ntp($servers, $autoupdate = false, $ensure = 'running') {
# ... put code from class here ...
}
然后将基类更改为:
ntp { $fqdn:
servers => [ 'ntpserver1.host.com',
'ntpserver2.host.com',],
}
您将不得不更改类结构以添加新类,因为您不能从节点中的类继承,因此将您的节点更改为:
node "ntpserver1.host.com" inherits default {
include hosts::ntpserver1
}
或者您想要命名每个主机的配置类。然后,在该类(class)中,您可以完全按照自己的期望去做:
class hosts::ntpserver1 inherits baseclass {
Ntp["$fqdn"] { ensure => 'stopped' }
}
我知道这似乎是一个巨大的转折点,特别是如果您习惯于在节点(不参与类继承树)内做一堆事情的话。但是如果不能覆盖类的参数,似乎没有好的选择。 (我们管理 500 多个节点和大约 100 个完全独立的服务定义,有数百个模块和主机之间的巨大多样性,包括每个主机覆盖,使用这种方法并且效果非常好。)
TL,DR 摘要:您不能覆盖类参数。将参数传递给 Puppet 中的类后,您就完成了。您可以覆盖定义参数。因此,任何你想覆盖的东西最好写成定义而不是类。但是,请记住覆盖层次结构意味着您必须将节点定义的核心放在一个类中,因为只有类可以继承和覆盖另一个类。因此,如果您大量使用重写,请养成使节点定义简单的习惯(仅包括一个完成所有工作的类),以便您的类可以从基类继承并重写定义的参数。
关于linux - 在 Puppet 中更改节点声明中的类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15627779/