2013-09-25 102 views
5

我想引用定义类型的实例内的变量。例如,我可以做些什么来参考$x$y foo ab在Puppet中,如何访问定义类型中的变量/属性?

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

我为什么会喜欢这个工作的原因是,一个富实例可以包含,我不会喜欢重复每一位可能需要这些资源多值。与其一次又一次地传递这些值,因此重复我自己,我宁愿传递一个对它们容器的引用。

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

回答

7

我刚刚发现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' 
} 

请注意,在Bar['b']定义的require => Foo['a']似乎并不需要。

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

+1

当然不是我希望的答案,但谢谢!我试过你的解决方法,它确实有效。我会接受你的回答,除非有人能够在未来几天内不需要通过hiera访问foo.x来访问foo.x。 –

+0

我也很好奇,为什么这不可能单独使用Puppet语言。 –

+0

我对于为什么也很感兴趣,所以我做了更多的挖掘并找到了一些有趣的东西 - http://docs.puppetlabs.com/guides/scope_and_puppet.html我已经更新了我的答案以包含它。 – xiankai

相关问题