linux - 在 Puppet 中更改节点声明中的类变量

标签 linux puppet

我正在尝试为我的所有服务器创建一个"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/

相关文章:

Puppet - 通知定义资源中的服务

puppet - 调用fail()失败

linux - 为 2.4.0 内核、i586 架构构建二进制文件 (telnet)

Ubuntu 9.04 中 Sed 命令的正则表达式语法错误

java - Eclipse 将不会在 Linux 中生成 R.Java

Puppet::filebucket 和清除

git - 通过 puppet 运行 ssh-agent

java - 从 java 代码运行脚本 shell

Linux bash 检查进程运行

linux - 从 bash 脚本内部调用时找不到命令