我需要从不同的Puppet模块扩展一个类。是否有可能做到这一点?如果是,那么语法是什么?
答案 0 :(得分:3)
在Puppet中,类a :: b可以通过inherits
关键字继承类a。这允许类a :: b到"扩展" a。
请注意,Puppet建议您很少需要这样做。特别是,通过使用include函数来包含基类,也可以实现继承可以实现的大部分功能。有关详细信息,请参阅文档here。
如果您确实选择使用继承,则首先自动声明类a; class a成为类a :: b的父作用域,因此它接收所有变量和资源默认值的副本;并且类a :: b中的代码有权覆盖在类a。
中设置的资源属性使用此模式,类a :: b也可以使用类a中的变量作为其类参数之一的默认值。这导致了" params模式"其中params.pp文件用于设置类默认值。
以下简单的代码示例说明了所有这些功能:
class a {
File {
mode => '0755',
}
file { '/tmp/foo':
ensure => absent,
}
$x = 'I, Foo'
}
class a::b (
$y = $a::x # default from class a.
) inherits a {
# Override /tmp/foo's ensure
# and content attributes.
File['/tmp/foo'] {
ensure => file,
content => $y,
}
# Both /tmp/foo and /tmp/bar
# will receive the default file
# mode of 0755.
file { '/tmp/bar':
ensure => file,
}
}
使用Rspec表达目录的预期最终状态:
describe 'a::b' do
it 'overrides ensure attribute' do
is_expected.to contain_file('/tmp/foo').with({
'ensure' => 'file',
})
end
it 'inherits content from $x' do
is_expected.to contain_file('/tmp/foo').with({
'content' => "I, Foo",
})
end
it 'file defaults inherited' do
is_expected.to contain_file('/tmp/foo').with({
'mode' => '0755',
})
is_expected.to contain_file('/tmp/bar').with({
'mode' => '0755',
})
end
end
测试通过:
a::b
overrides ensure attribute
inherits content from $x
file defaults inherited
Finished in 0.15328 seconds (files took 1.2 seconds to load)
3 examples, 0 failures
关于" plusignment"。
的说明正如文档中所述,当覆盖作为数组的资源属性时,可以添加到该数组而不是使用+>
" plusignment"运营商。这是一个很少使用的功能,但应在此上下文中提及。请参阅上面的链接以获取代码示例。