6

我想在已定义类型的实例中引用变量。例如,我可以做什么来引用bar中的 foo$x和of ?$yab

 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 实例可能包含许多我不想重复给每个可能需要它们的资源的值。而不是一次又一次地传递这些值,从而重复自己,我宁愿传递对它们的容器的引用。

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

4

2 回答 2

10

我实际上刚刚发现Puppetlab 的 stdlib 模块包含一个可用于解决此问题的getparam 函数。

所以这里终于解决了我自己的问题:

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

于 2014-03-15T13:27:50.320 回答
2

您似乎无法访问已定义类型的属性。可能的解释在这里。但是,您可以做的是通过 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仅查找顶级键,因此您不能这样做hiera('foo'['a']['x])

于 2013-10-02T08:46:04.993 回答