我想在已定义类型的实例中引用变量。例如,如何在$x
栏中引用foo $y
的{{1}}和a
?
b
我希望这个工作的原因是foo实例可能包含许多值,我不想对每个可能需要它们的资源重复这些值。我不是一次又一次地传递这些值,而是重复自己,而是将参考传递给他们的容器。
我一直在寻找并尝试了很多东西,但似乎无法在任何地方找到这个问题的答案。我知道可以修改属性,引用资源和读取类属性,但是可以读取资源/定义类型的属性吗?如果不是那么最好的工作呢?
答案 0 :(得分:8)
我实际上发现Puppetlab's stdlib module包含可用于解决此问题的getparam function。
所以这里终于解决了我自己的问题:
define foo($x, $y) {
}
define bar($foo) {
notify { getparam(Foo[$foo], 'x'): }
notify { getparam(Foo[$foo], 'y'): }
}
foo { 'a':
x => 'oh bar may you reference me',
y => 'please'
}
bar { 'b':
foo => 'a'
}
请注意,似乎不需要require => Foo['a']
定义中的Bar['b']
。
答案 1 :(得分:1)
您似乎无法访问已定义类型的属性。 Possible explanation here。但是你可以做的是通过hiera将其外化。
Hiera是将清单逻辑与填充它的数据分开的好方法,但设置并不困难。
在我的第一次尝试中,我试图通过类引用访问hiera变量;例如foo::a
,但这对定义的类型不起作用。
使用http://drewblessing.com/blog/-/blogs/puppet-hiera-implement-defined-resource-types-in-hiera作为指导,您可以使用简单的配置在hiera中声明所有这些属性:
hiera.yaml
:backends:
- yaml
:yaml:
:datadir: $hiera_dir
:hierarchy:
- common
$ hiera_dir / common.yaml
foo:
a:
x: 'oh bar may you reference me'
y: 'please'
然后在你的木偶清单中:
define foo ($x, $y) {
}
define bar($foo) {
require create_my_foos
$all_foos = hiera('foo')
# This is just for proof of concept, to show that the variable can be passed.
file { '/tmp/output.txt':
content => $all_foos[$foo]['x']
}
}
class create_my_foos {
$foo_instances = hiera('foo', [])
create_resources('foo', $foo_instances)
}
bar { 'b':
foo => 'a'
}
现在,您可以通过调用hiera('foo')
函数来获取foo
的属性数组来访问foo的变量,并进行数组查找以获得所需的确切参数。
请注意hiera only looks up top-level keys,因此您无法执行hiera('foo'['a']['x])
。