web-dev-qa-db-ja.com

Puppetで配列を反復処理する方法

Facterファクトとして保存されている配列を繰り返し処理し、配列の各要素に対して新しいシステムユーザーとディレクトリを作成し、最後にAWSにAPI呼び出しを行います。

事実の例:my_env => [shared1,shared2,shared3]

Puppetでアレイを反復処理するにはどうすればよいですか?

25
PapelPincel

これは、あなたが何をしているのかによって機能するかもしれません

# Assuming fact my_env => [ shared1, shared2, shared3 ]

define my_resource {
  file { "/var/tmp/$name":
    ensure => directory,
    mode   => '0600',
  }
  user { $name:
    ensure => present,
  }
}
my_resource { $my_env: }

要件が単純な場合は機能しますが、そうでない場合、Puppetはこれを非常に困難にします。 Puppet開発者は、宣言型言語がどのように機能するかについての誤解に基づいて、反復に対して不合理な偏見を抱いています。

この種のリソースが機能しない場合、おそらく、どのリソースプロパティをアレイから設定しようとしているのかをよりよく理解できますか?

編集:

Puppet 4では、この嘆かわしい欠陥がついに修正されました。文書化された現状 ここ 。ドキュメントにあるように、多くの古いコードには上記のソリューションの例があります。

71
itsbruce

Puppet 3.2の時点では、これは次のような「将来の」パーサーを使用して可能です。

$my_env = [ 'shared1', 'shared2', 'shared3', ]
each($my_env) |$value| {
  file { "/var/tmp/$value":
    ensure => directory,
    mode => 0600,
  }
  user { $value:
    ensure -> present,
  }
}

参照: http://docs.puppetlabs.com/puppet/3/reference/lang_experimental_3_2.html#background-the-puppet-future-parser

21
ChrisRut

今月初めにリリースされたPuppet 3.7には新しいDSLがあり、その1つの機能は反復です。次のURLを確認してください https://docs.puppetlabs.com/puppet/latest/reference/experiments_lambdas.html#enabling-lambdas- and-iteration

これらの新機能は、次の方法で有効にできます。

Puppet.confファイルでparser = futureを設定するか、コマンドラインスイッチ--parser = futureを追加します

それが役立つことを願って

3
Walid

itsbruceの答えはおそらく今のところ最高でしょうが、 イテレーションの提案 があります。

1
Philip Potter

パペットには「create_resources()」関数があります。 itmeのリストを繰り返し処理する際に非常に役立ちます

最新のPuppet(6.4.2)およびPuppet 4以降、配列の繰り返しはいくつかの方法でサポートされています。

$my_arr = ['foo', 'bar', 'baz']

各機能:

$my_arr.each |$v| {
  notice($v)
}

各関数の代替構文:

each($my_arr) |$v| {
  notice($v)
}

インデックスを取得するには:

eachに2番目の引数を渡します。

$my_arr.each |$i, $v| {
  notice("Index: $i, value: $v")
}

Rubyとの比較:

この文法はRubyに触発されていますが、わずかに異なるため、混乱を避けるために2つを並べて表示すると便利です。Ruby

my_arr.each do |v|
  notice(v)
end

または:

my_arr.each { |v|
  notice(v)
}

その他の反復関数:

Puppetには他にも多くの反復関数が用意されていることに注意してください。

  • each -値のコレクションを使用して毎回異なるパラメーターを提供し、コードのブロックを複数回繰り返します。

  • slice -コレクションからの値のグループをパラメーターとして使用して、コードのブロックを複数回繰り返します。

  • filter -コードのブロックを使用して、一致しない要素を削除してデータ構造を変換します。

  • map -コードのブロックを使用して、データ構造内のすべての値を変換します。

  • reduce -コードブロックを使用して、提供されたデータ構造の値を組み合わせて、新しい値またはデータ構造を作成します。

  • with -コードブロックを1回評価し、独自のローカルスコープで分離します。反復はしませんが、反復関数に類似したファミリがあります。

Puppet 3以前:

まだPuppet 3を使用して古いコードを継承している場合、受け入れられる答えは依然として正しいです。

define my_type {
  notice($name)
}

my_type { $my_arr: }

ただし、これは通常、現代のPuppetでは不適切なスタイルと見なされます。

0
Alex Harvey