2013-09-25 10 views
5

定義された型のインスタンス内の変数を参照したいと思います。たとえば、foo a$x$yをバーbで参照するにはどうすればよいですか?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'] 
    } 

私は仕事にこれを希望する理由は、fooのインスタンスが、私はそれらを必要とするかもしれません一人ひとりのリソースに繰り返したくない多くの値が含まれていてもよいということです。これらの値を何度も渡す代わりに、自分自身を繰り返して、私はむしろそれらのコンテナへの参照を渡すでしょう。

私は何度も探していて、たくさんのことを試しましたが、どこでもこの質問に対する答えを見つけることはできません。属性、参照リソース、および読み込みクラス属性を修正することは可能ですが、リソース/定義型の属性を読み取ることは可能ですか?それは最高の可能性のある回避策は何ですか?

答えて

7

私は実際にこの問題を解決するために使用できるgetparam functionを含むPuppetlab's stdlib moduleを見つけました。だからここ

は最終的に自分の質問を解決する:

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変数にアクセスしようとしていた私の最初の試みで

Installing

。たとえばfoo::aですが、定義されたタイプでは機能しません。

Configuring

hiera.yaml

:backends: 
    - yaml 
:yaml: 
    :datadir: $hiera_dir 
:hierarchy: 
    - common 

$ hiera_dir/common.yamlガイドとしてhttp://drewblessing.com/blog/-/blogs/puppet-hiera-implement-defined-resource-types-in-hieraを使用して

、簡単な設定でhiera内のすべてのこれらの属性を宣言置くことができます

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

今、あなたはfooの属性の配列を取得するためにhiera('foo')関数を呼び出すことによって、fooの変数にアクセスし、あなたが必要な正確なパラメータを取得するために、配列検索を行うことができます。

ヒエラonly looks up top-level keysですので、hiera('foo'['a']['x])はできません。

+1

確かに私が望んでいた答えではありませんでしたが、ありがとう!私はあなたの回避策を試して、それは動作します。foo.xが次の数日以内にhieraを介してアクセスできるという要件なしに誰かがfoo.xにアクセスする方法を考え出すことができない限り、私はあなたの答えを受け入れます。 –

+0

私はまた、これがなぜPuppet言語だけでは不可能なのか不思議です。 –

+0

私はまた、なぜか興味を持っているので、もう少し掘り下げて興味のあるものを見つけました。http://docs.puppetlabs.com/guides/scope_and_puppet.html私は答えを更新しました。 – xiankai

関連する問題