2013-09-25 95 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

相關問題