在Puppet中,如何访问定义类型内的变量/属性?
我想引用已定义类型的实例中的变量。例如,我如何在条形码b中引用foo在Puppet中,如何访问定义类型内的变量/属性?,puppet,Puppet,我想引用已定义类型的实例中的变量。例如,我如何在条形码b中引用fooa的$x和$y define foo($x, $y) { } define bar($foo) { notify { "${::$foo::x}": } # <- how to make this reference work? } foo { 'a': x => 'oh bar may you reference me', y =&g
a
的$x
和$y
define foo($x, $y) {
}
define bar($foo) {
notify { "${::$foo::x}": } # <- how to make this reference work?
}
foo { 'a':
x => 'oh bar may you reference me',
y => 'please'
}
bar { 'b':
foo => Foo['a'],
require => Foo['a']
}
定义foo($x,$y){
}
定义栏($foo){
通知{${::$foo::x}:}#'哦,你可以推荐我吗',
y=>“请”
}
酒吧{'b':
foo=>foo['a'],
require=>Foo['a']
}
我之所以希望这样做,是因为一个foo实例可能包含许多值,我不想对可能需要它们的每个资源重复这些值。与其一次又一次地传递这些值,从而重复我自己,我宁愿传递对它们的容器的引用
我已经找遍了所有地方,尝试了很多方法,但似乎在任何地方都找不到这个问题的答案。我知道可以修改属性、引用资源和读取类属性,但是可以读取资源/定义类型的属性吗?如果不是,那么最好的解决方法是什么 您似乎无法访问已定义类型的属性。但是,您可以通过hiera将其外部化 Hiera是将清单逻辑与填充它的数据分离的一种很好的方法,但设置起来并不困难 在我的第一次尝试中,我试图通过类引用访问hiera变量<例如,code>foo::a,但这不适用于已定义的类型 作为指南,您可以通过一个简单的配置在hiera中声明所有这些属性: : 希拉·亚马尔
: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,所以您不能执行
hiera('foo'['a']['x])
我实际上刚刚发现,其中包含一个可用于解决此问题的
这是我自己问题的最终解决方案:
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']
的定义中似乎不需要require=>Foo['a']
。当然不是我希望的答案,但谢谢!我试过你的解决方法,它确实有效。我会慷慨地接受你的回答,除非其他人能想出一种访问foo.x的方法,而不需要在未来几天内通过hiera访问foo.x。我也很好奇为什么单用傀儡语言是不可能的。我也很感兴趣为什么,所以我做了更多的挖掘,发现了一些有趣的东西——我更新了我的答案,把它包括进去。我以前确实读过这篇文章,但这篇文章似乎没有解释为什么。我猜这与Puppet在我称之为编译时的过程中运行其所有函数并解释其所有变量有关。我找到了一种方法!看看我的答案。