2017-12-21 25 views
3

ヒエラハッシュの多くのエントリを繰り返し処理しています。マニフェストにデフォルトを設定することで同じ重複する行を削除します。ensuregroupsmanagehomeなど)、重複したキーと値のペアがhieraに存在する場合は、デフォルトがオーバーライドされます。パペット - マニフェストのデフォルトをハッシュの繰り返しに使用する場合、ヒエアにデフォルト値を設定します。

までに、私が試してみましたすべてがデフォルト値の取得に失敗しました。私はリソースを宣言する必要があると考えていますが、不確実です。

私は、ルックアップや他の方法で「default_values_hash」を設定しようとしたが、何もこれは私のマニフェストとhieraデータの(擬似)の例で反復し、--debug出力

にデフォルト値を渡すために表示されません。どんな指導も心から感謝しています。ありがとうございました。 Hieraで

class test (
    Hash $testhash = lookup('test::hash', "merge" => 'hash'}), 
){ 

    $testhash.each |$key, $value| { 
    user { $key : 
     ensure  => $value['ensure'], 
     name  => $value['name'], 
     password => $value['password'], 
     groups  => $value['groups'], 
     managehome => $value['managehome'], 
    } 
    } 
} 
include class test 

:私はマニフェスト(あまりにも多くのデータ内のすべてのデータを保持する場合はそれがないものの、反復に渡しません(Userを大文字で)マニフェストで

test::hash: 

'fred': 
    name:   fred 
    password:  somepassword 
    groups:  wheel 
    managehome: true 

'mary': 
    name:   mary 
    password:  otherpassword 

'john': 
    name:   john 
    password:  anotherpassword 

'harry': 

設定リソースのデフォルトそれを行うために)。

答えて

3

lookup関数を使用すると、ハッシュ自体のデフォルト値を設定できますが、実際にはハッシュ内のキーと値は設定できません。さらに、lookup関数をパペットのクラスパラメータ値として使用すると、自動パラメータバインディングが置き換えられます。言い換えれば、あなたのlookup関数は何もしません。なぜなら、Puppetは自動的なパラメータバインディングを優先しているからです。これらは使用しています(これはHiera 5と組み合わせてlookupに当てはまります)。私は個人的にこの行動を迷惑に感じますが、それはそれです。編集:決してその特定の推論に心配しないでください。パラメータはで、$hashではありません。そのパラメータがモジュールデータから来ている場合は、lookupは無視されます。これは、パペットはモジュールデータの自動パラメータバインディングのみを許可するためです。

私は、リソースのデフォルトがあなたのためにここで働いていないことに驚いています。私はこれが意図されていない、またはあなたがそのルートに行くときに何かが間違って実装されていると信じなければならない。

にかかわらず、ここにあなたのための保証方法があります。まず、我々は当たり表現デフォルト属性を実装:https://puppet.com/docs/puppet/5.3/lang_resources_advanced.html#per-expression-default-attributes

class test (
    Hash $testhash = lookup('test::hash', "merge" => 'hash'}), 
){ 

    $testhash.each |String $key, Hash $value| { 
    user { 
     default: 
     ensure  => present, 
     name  => 'username', 
     password => 'userpassword', 
     groups  => ['usergroups'], 
     managehome => false, 
     ; 
     $key: 
     ensure  => $value['ensure'], 
     name  => $value['name'], 
     password => $value['password'], 
     groups  => $value['groups'], 
     managehome => $value['managehome'], 
     ; 
    } 
    } 
} 

一つの問題は、まだあなたがすべての反復のための第二のブロックに属性の値を確立していることである、しかしここに残ります。これらのキーと値のペアが定義されていないと、Puppetは別の値をデフォルトにする代わりにエラーになります。最初にPuppetに値を定義した場合、Puppetに属性の値を設定するよう指示する必要があります。ありがたいことに、私たちは*属性でこれを行うことができます:ここhttps://puppet.com/docs/puppet/5.3/lang_resources_advanced.html#setting-attributes-from-a-hash

class test (
    Hash $testhash = lookup('test::hash', "merge" => 'hash'}), 
){ 

    $testhash.each |String $key, Hash $value| { 
    user { 
     default: 
     ensure  => present, 
     name  => 'username', 
     password => 'userpassword', 
     groups  => ['usergroups'], 
     managehome => false, 
     ; 
     $key: 
     * => $value, 
     ; 
    } 
    } 
} 

つの推薦はあなたのラムダイテレータ変数を作ることであろう$key, $valueビットがより透過的に命名します。別の注意は、*属性が機能するためには、あなたのハッシュキーがPuppet属性名と一致しなければならないという警告です。

更新された質問:ハッシュにnil値のキーがある状況では、ラムダイテレータパラメータのキー値の既定値として空のハッシュを設定できます。空のハッシュは、その繰り返し中に$valueundef(Puppet nil)を置き換えます。これにより、属性と値が*オペレータに含まれておらず、すべてのデフォルト値が優先されます。

class test (
    Hash $testhash = lookup('test::hash', "merge" => 'hash'}), 
){ 

    $testhash.each |String $key, Hash $value = {}| { 
    user { 
     default: 
     ensure  => present, 
     name  => 'username', 
     password => 'userpassword', 
     groups  => ['usergroups'], 
     managehome => false, 
     ; 
     $key: 
     * => $value, 
     ; 
    } 
    } 
} 
+0

すばやく詳細な返信いただきありがとうございます。私は両方のコードブロックをテストしましたが、残念ながらヒエラハッシュの最初のキーだけを処理しています(間違いはありません)。ヒエラにキー/ペアがなく、マニフェストのデフォルトをオーバーライドするためにヒエラに存在するキーがある(デフォルト値に一致する)ようにするために、私の投稿を少し編集しました。それ以上のガイダンスは誠実に感謝します。 – xit

+0

@xitコードがハッシュ反復を失う可能性があるという疑いがありました。私は、機能を失うことなくハッシュ反復を保持する方法を考える必要があります。残念ながら、これは配列の繰り返しでのみ本質的に機能します。あなたのコメントの後半には、ラムダのデフォルト値でそれを行うことができます。それに対する回答を更新しています。 –

+1

@xit私はちょうどあなたが上記で提供したmaryとjohnのハッシュで私のコードをテストし、それはmaryとjohnの両方を処理します。あなたのサンプルのハッシュが私のコードと組み合わされて、あなたが望む結果を生み出しているからです。 –

関連する問題