2011-06-19 2 views
35

リソースを定義すると(?)、ディレクトリ構造を確保するために、ループがありますか?そのようなそこにはイテレータとループが人形の中にありますか?

for X in [app1,app2] do: 
    file { '/opt/app/' + X: 
     ensure => directory, 
     owner => 'root', 
     group => 'root', 
     mode => '0644', 
    } 

私はディレクトリの数十を持っていると私は人形にそれを宣言すると、本当に疲れている...それはbashのの15 LOCを取るだろう。

アイデア?

答えて

40

人形の言語では、ループはありません。

しかし、あなたが代わりにタイトルの単純な文字列の配列を使用し、同じのparamsで同時に複数のリソースを宣言することができます。

$b = '/opt/app' 
file { [ "$b/app1", "$b/app2" ]: 
    ensure => directory, 
    owner => 'root', 
    group => 'root', 
    mode => 0644, 
} 

あなたはまた、別のと同じタイプの多くのリソースを宣言することができますもう少しコンパクトfile{ sおよび} Sを繰り返すよりも;、各リソースを終了してparamsは:特定の場合

file { 
    [ "$b/app1", "$b/app2" ]: 
    ensure => directory, 
    owner => 'root', 
    group => 'root', 
    mode => 0755; 
    [ "$b/app1/secret", "$b/app2/secret" ]: 
    ensure => directory, 
    owner => 'root', 
    group => 'root', 
    mode => 0700; 
} 

file { "/opt/app": 
    source => "puppet:///appsmodule/appsdir", 
    recurse => true; 
} 

(それは人形をソースとして使用するために、そのディレクトリ構造のソースを持つ必要であろう)

をあなたがdefine a new resource typeはの部分を再利用することができます。ファイルは、あなたがソースと使用再帰を設定することができますPARAM複数回:http://www.puppetlabs.com/blog/ruby-dsl/(私はそれを使ったことがない、しかし):

人形2.6以降で
define foo { 
    file { 
    "/tmp/app/${title}": 
     ensure => directory, 
     owner => 'root', 
     mode => 0755; 
    "/tmp/otherapp/${title}": 
     ensure => link, 
     target => "/tmp/app/${title}", 
     require => File["/tmp/app/${title}"] 
    } 
} 

foo { ["app1", "app2", "app3", "app4"]: } 

、あなたが求めることができるすべてのループ機能を持って利用できるRubyのDSLがあります。 Puppet 3.2では、彼らはexperimental loopsをいくつか紹介しましたが、これらの機能は後のリリースで変更されるか廃止される可能性があります。

+1

ありがとうございます!どのようにこの作業を取得する:file {[X、Y]:sure = link、target => [X1 + X、Y1 + Y]}? – user425720

+1

定義を使うことができます。私の答えに – freiheit

+0

ああ完璧な例を追加しました。ありがとう! – user425720

2

はい。

define 'myapps::structure', :applist do 
    @applist.each do |app| 
     file(@name+'/'+app, 
      :ensure => directory, 
      :owner => 'root', 
      :group => 'root', 
      :mode => '0644') 
    end 
end 

クラスとノードも同様に定義することができます:「ルビーDSLは、」マニフェストに代わり「.PP」のファイル拡張子「.RB」を使用し、このように人形 『タイプ』を定義することができるだけで、助けることができます方法。この機能は、バージョン3.2のリリースとして3

25

以来deprecatedであることに注意してくださいしかしlambdas

はあなたがparser = futurepuppet.confを設定する必要がありますがあります。

$a = [1,2,3] 
each($a) |$value| { notice $value } 

が​​ある複数の定義型を宣言するための別のオプション。人形DSLはルビーの方法のいくつかの形態および機能において類似反復機能を有する人形4(及び人形3の後期バージョンの「未来パーサ」)のよう

create_resources(file, { 
'/tmp/test1' => { 
     ensure => directory, 
     owner => 'root', 
     group => 'root', 
     mode => '0644', 
    }, 
'/tmp/test2' => { 
     ensure => directory, 
     owner => 'www-data', 
     group => 'www-data', 
     mode => '0755', 
    }, 
}) 
+5

これまで私が見てきたこの問題に対する唯一の解決策はeach()ソリューションです。 – markus

+0

@markusしかし、公平であることに同意しましたが、この質問がもともと2011年に尋ねられたときに利用可能だったとは私は確信していません。しかし、人々が時間を無駄にしないように、 _lambdas_が利用可能です。 – quickshiftin

+4

もし 'puppet apply'を使っているのなら、将来のパーサー' puppet apply --parser = future'を有効にしてください – quickshiftin

4

:それをハッシュのハッシュを渡します配列とハッシュ:

  • each - (正式ラムダ)をコードブロックを評価する配列やハッシュ
  • filterの各要素のために - 配列やハッシュの各要素にラムダを適用し返しますラムダがtrueと評価されたものの配列またはハッシュ
  • map - 配列またはハッシュの各要素にラムダを適用し、その結果
  • reduce
  • の配列を返す - それは返す単一の結果を構築するために、アレイまたはハッシュの各要素にラムダを適用します

はCさんやJavaののラインに沿ったインデックス付きforループはありませんが、データ構造のサブセット上で反復を達成するために上記の機能のいずれかとarray sectioningを組み合わせることができます。 CまたはJavaのwhileループの行には、無期限の反復はありません。

もちろん、他の回答に記載されているリソース中心のアプローチを使用することはできますが、実際にはそのうちの1つが実際には最も有効なアプローチです。しかし、Ruby DSLをもう使用することはできません。 Puppet 4から完全に削除されています。反復関数の中で、カスタム関数を定義する能力、データ中心のアプローチの恩恵、そしてPuppetの歴史的な標準機能のすべてがRuby DSLに欠けているようです。

関連する問題