ファクトファクトとして保存されている配列を繰り返し処理し、配列の要素ごとに新しいシステムユーザーとディレクトリを作成し、最後にAWSへのAPI呼び出しを行います。
事実の例:my_env => [shared1,shared2,shared3]
Puppetの配列を反復処理するにはどうすればよいですか?
ファクトファクトとして保存されている配列を繰り返し処理し、配列の要素ごとに新しいシステムユーザーとディレクトリを作成し、最後にAWSへのAPI呼び出しを行います。
事実の例:my_env => [shared1,shared2,shared3]
Puppetの配列を反復処理するにはどうすればよいですか?
あなたがしていることに応じて、これはうまくいくかもしれません
# 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で、この嘆かわしい欠陥がついに修正されました。ここに記載されている状況。ドキュメントに記載されているように、上記のソリューションの例は多くの古いコードに含まれています。
puppet 3.2以降、これは次のような「将来の」パーサーを使用して可能です。
$my_env = [ 'shared1', 'shared2', 'shared3', ]
each($my_env) |$value| {
file { "/var/tmp/$value":
ensure => directory,
mode => 0600,
}
user { $value:
ensure -> present,
}
}
今月初めにリリースされたPuppet3.7には新しいDSLがあり、その1つの機能はイテレーションです。次のURLを確認して くださいhttps://docs.puppetlabs.com/puppet/latest/reference/experiments_lambdas.html#enabling-lambdas-and-iteration
これらの新機能は、次のコマンドで有効にできます。
puppet.confファイルでparser=futureを設定するか、コマンドラインスイッチを追加します--parser = future
それが役立つことを願っています
最新の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以前:
まだPuppet3を使用している古いコードを継承している場合でも、受け入れられた答えは正しいです。
define my_type {
notice($name)
}
my_type { $my_arr: }
ただし、これは通常、現代のパペットでは悪いスタイルと見なされていることに注意してください。
itsbruceの答えはおそらく今のところ最良ですが、将来の実装の可能性のためにpuppetlabsのアーマチュアプロセスを通過する反復提案があります。
puppetには「create_resources()」関数があります。itmesのリストを反復処理するときに非常に役立ちます