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

在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

我想引用已定义类型的实例中的变量。例如,我如何在条形码b中引用foo
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在我称之为编译时的过程中运行其所有函数并解释其所有变量有关。我找到了一种方法!看看我的答案。