3

我正在尝试为我的所有服务器创建一个“模板”。我有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">
}
4

2 回答 2

5

您遇到了参数化类的问题:它们不支持覆盖。他们应该这样做,但是由于在 Puppet 中初始化事物的顺序存在各种问题,您不能将参数覆盖到类中。一旦你设置它们,你就完成了。这与定义不同,其中覆盖参数按您的预期工作。有一个公开的错误,我们中的一些人已经投票支持并正在关注,但似乎进展甚微。

鉴于此,我的建议是将您的参数化 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 hosts::ntpserver1 inherits baseclass {
  Ntp["$fqdn"] { ensure => 'stopped' }
}

我知道这似乎是一个巨大的变通,特别是如果你习惯在节点内做一堆东西(不参与类继承树)。但是如果不能覆盖类的参数,似乎没有一个好的选择。(我们使用这种方法管理 500 多个节点和大约 100 个完全独立的服务定义,具有数百个模块和主机之间的大量变化,包括每个主机的覆盖,并且效果非常好。)

TL,DR 摘要:您不能覆盖类参数。一旦你将参数传递给 Puppet 中的类,你就完成了。您可以覆盖定义参数。因此,您想要覆盖的任何内容都最好写成定义而不是类。但是,请记住覆盖层次结构意味着您必须将节点定义的核心放在一个类中,因为只有类可以继承并覆盖另一个类。因此,如果您大量使用覆盖,请养成让您的节点定义变得微不足道的习惯(只包括一个完成所有工作的类),以便您的类可以从基类继承并覆盖定义的参数。

于 2013-03-26T03:25:53.797 回答
1

我接受了 rra 的回答,但我找到了一个更适合我的解决方案。我想这是一个轻微的黑客攻击:

模板.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,
    }
}

节点.pp

node "ntpserver1.host.com" {
    class { baseclass: ntprestrict => 'true' }
}
node "client.host.com" {
    class { baseclass: ntprestrict => 'false' }
}
于 2013-03-26T21:38:54.333 回答