在Puppet中,如何在定义的类型中访问变量/属性?

时间:2013-09-25 19:01:56

标签: puppet

我想在已定义类型的实例中引用变量。例如,如何在$x栏中引用foo $y的{​​{1}}和a

b

我希望这个工作的原因是foo实例可能包含许多值,我不想对每个可能需要它们的资源重复这些值。我不是一次又一次地传递这些值,而是重复自己,而是将参考传递给他们的容器。

我一直在寻找并尝试了很多东西,但似乎无法在任何地方找到这个问题的答案。我知道可以修改属性,引用资源和读取类属性,但是可以读取资源/定义类型的属性吗?如果不是那么最好的工作呢?

2 个答案:

答案 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是将清单逻辑与填充它的数据分开的好方法,但设置并不困难。

Installing

在我的第一次尝试中,我试图通过类引用访问hiera变量;例如foo::a,但这对定义的类型不起作用。

使用http://drewblessing.com/blog/-/blogs/puppet-hiera-implement-defined-resource-types-in-hiera作为指导,您可以使用简单的配置在hiera中声明所有这些属性:

Configuring

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])