根据hiera上的Puppet documentation,以下示例应该有效,但由于某种原因,它没有将参数传递给模块。
我有一个名为hello
的简单模块,它使用hello::talk
接收参数,并在/home/user/hello.txt
输出文件。
这是班级:
class hello {
// other stuff
}
define hello::talk (
$say_hello = true,
$message = '',
$say_goodbye = false,
) {
file { '/home/user/hello.txt':
owner => root, group => root, mode => 0755,
ensure => file,
content => template('hello/template.erb')
}
}
如果在节点内,我会这样使用它:
node foo {
include hello
hello::talk {'config':
say_hello = true,
message = 'howdy!',
say_goodbye = false,
}
}
它按预期工作(创建文件等)
但是如果我尝试使用hiera,我只能将它包含在类中,但不能执行hello::talk
位。
这是我的common.yaml:
classes:
- hello
hello::talk -
say_hello = true
message = "Oh dear ..."
say_goodbye = false
并且site.pp:
hiera_include('classes')
node foo {
}
没有文件:(
更新
好吧,所以我误解了文档有点大声笑......而且我仍然误解了class
和define
之间的区别......但是我想我的大脑会在以后找到它/ p>
我设法通过将define hello::talk
更改为class hello::talk
并将common.yaml文件更改为:
classes:
- hello
- hello::talk
hello::talk::say_hello = true
hello::talk::message = 'Yay! ... Kinda'
hello::talk::say_goodbye = true
这引出了一个新问题......是否有一种方法可以重构类,因此,与其他模块一样,我只需要包含hello
,然后可以设置参数。另外,如果我不必继续使用hello::talk::
来设置参数......那就太好了。
答案 0 :(得分:1)
类和定义之间的主要区别在于,如果提供不同的名称,则只能调用一次类,并且可以多次调用定义。
关于你的上一个问题。
您需要在hello类中移动参数并在其中调用hello :: talk class / define(我将假设hello :: talk是一个定义):
class hello (
say_hello = true,
message = 'howdy!',
say_goodbye = false
) {
hello::talk {'config':
say_hello => $say_hello,
message => $message ,
say_goodbye => $say_goodbye,
}
}
使用上述结构,您可以在hiera中设置:
classes:
- hello
hello::say_hello: true
hello::message: 'Yay! ... Kinda'
hello::say_goodbye: true