24

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

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

Puppetの配列を反復処理するにはどうすればよいですか?

4

6 に答える 6

73

あなたがしていることに応じて、これはうまくいくかもしれません

# 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で、この嘆かわしい欠陥がついに修正されました。ここに記載されている状況。ドキュメントに記載されているように、上記のソリューションの例は多くの古いコードに含まれています。

于 2012-10-22T09:48:12.853 に答える
22

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

于 2013-06-18T18:58:28.167 に答える
3

今月初めにリリースされた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

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

于 2014-09-18T20:27:34.147 に答える
2

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

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

各機能:

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

各関数の代替構文:

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

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

each2番目の引数を:に渡します

$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: }

ただし、これは通常、現代のパペットでは悪いスタイルと見なされていることに注意してください。

于 2019-06-11T16:01:58.630 に答える
1

itsbruceの答えはおそらく今のところ最良ですが、将来の実装の可能性のためにpuppetlabsのアーマチュアプロセスを通過する反復提案があります。

于 2013-03-20T14:48:56.467 に答える
0

puppetには「create_resources()」関数があります。itmesのリストを反復処理するときに非常に役立ちます

于 2017-01-19T04:49:35.047 に答える