我正在尝试 Puppet,它看起来不错。
我的问题很简单,但我无法回答。
我有一个文件“node.pp”:
node basenode {
include "dns"
# include "ntp"
}
node 'myserver.domain.com' inherits basenode {
$type_server = "client"
include "ntp"
}
我想声明我的变量“$type_server”,而不必在每个服务器上声明“include ntp”。我想“basenode”包含“ntp”,并在我的服务器节点中使用“$type_server”的值。
该变量用于 NTP 的清单中。
提前致谢。
答案1
不要使用变量 —— 正如 Shane 所说,Puppet 中的变量作用域是 FUBAR,尝试使用它只会导致疼痛、折磨、恶心、头痛,甚至心脏病。
相反,使用已定义类型。这就是它们的设计目的。因此,不要到处使用类和包含,而是使用已定义类型并向其传递所需的数据:
define ntp_server($type_server) {
# Do all the things you'd normally do, using $type_server as needed
}
node 'myserver.domain.com' {
ntp_server { ntp:
type_server => "client"
}
}
答案2
这Puppet 中的作用域有点……不直观。这是一种线性求值行为——由于继承发生在变量定义之前,并且继承类中包含的类会立即被求值,因此变量被设置后你需要它。
不要继承,尝试在每个节点的底部包含“基”,这样在设置必要的变量后就会对其进行评估。这不是一种非常面向对象的方法,但这种范围行为并没有留下太多选择。
node 'myserver.domain.com' {
$type_server = "client"
include basenode
}
答案3
我知道这已经很老了,但是当我遇到一些麻烦并发现这个线程时,它可能对其他人有用。
不要使用定义的类型或在节点中包含节点(这听起来不太好),我建议使用参数化类通过使用它,作者可以继续正常使用他的类,并且这些类只需要稍加修改就可以接收(它们已经在使用的)变量作为参数。
因此,例如,而不是:
class foo {
file { 'abc':
path => "some/path"
content => $content
}
}
它可能有:
class foo($content) {
file { 'abc':
path => "some/path"
content => $content
}
}
像这样使用它:
node 'myserver.domain.com' {
class { 'foo':
$content => "something pretty smart"
}
}