如何在继承节点默认值时包含带参数的模块。这可能吗?
目前,我已删除“继承默认值”并将其更改为node server123 { //include that //include this }
。但每当我对默认值进行更改时,我都必须对节点进行相同的更改server123
。
我想知道我是否应该更改 ntp 模块来解决这个问题?
文件:manifest/nodes.pp
node default {
include ssh
include ntp
ruby::install { "1.2.3-456": }
nagios { "1.2.3-456": }
}
node 'server123' inherits default {
class { 'ntp': ntpserver => 'true' } -> duplicate class defined error.
## I want to define "$ntpserver = 'true'" here, so it doesn't inherit ntp client config.
## I've tried other methods too, but none of them work.
}
文件:modules/ntp/init.pp
class ntp ($ntpserver = "false") {
//erb parameters
}
if $ntpserver == 'true' {
//case $OS
//code for ntpserver template
} else {
//case $OS
//code for ntp.conf template
}
答案1
Puppet 4 不支持节点继承,但是您可以使用“特征”类(或直接使用)重写代码class{'something':}
。您的示例可以重写为:
class base_node {
include ssh
include ntp
ruby::install { "1.2.3-456": }
nagios { "1.2.3-456": }
}
node /^server\d+/ {
require base_node
}
更奇特的解决方案可能会使用您的自定义模块,没有什么复杂的modules/base/manifests/linux.pp
:
class base::linux {
...
}
甚至可以使用 Hiera 创建更复杂的规则,其中节点定义非常简单:
node /^server\d+/ {
hiera_include('classes')
}
其余逻辑位于 YAML 层次结构中:
# common.yaml
---
classes:
- ntp
# Debian.yaml
---
classes:
- base::linux
- localrepos::apt
假设存在一些层次结构hiera.yaml
:
:hierarchy:
- "%{::fqdn}"
- "%{::osfamily}"
- common