37

リソースを定義(?)するとき、たとえばdir構造を確保するために、使用可能なループはありますか?

そのように:

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

私は数十のディレクトリを持っていて、それをpuppetで宣言するのに本当にうんざりしています。15LOCのbashが必要になります。

何か案は?

4

4 に答える 4

41

puppet 言語の古いバージョンでは、ループがサポートされていません。

ただし、タイトルに単純な文字列の代わりに配列を使用して、同じパラメータで同時に複数のリソースを宣言できます。

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

また、各リソースを で終了することにより、異なるパラメーターを持つ同じタイプの多くのリソースを宣言することもできます。これは、と とを;繰り返すよりも少しコンパクトです。file{}

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;
}

(パペットがソースとして使用するには、そのディレクトリ構造のソースが必要です)

新しいリソース タイプを定義して、param の一部を複数回再利用できます。

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"]: } 

Puppet 2.6 から、必要なすべてのループ機能を備えた Ruby DSL が利用可能になりました: http://www.puppetlabs.com/blog/ruby-dsl/ (しかし、私はそれを使用したことはありません)。Puppet 3.2 では、いくつかの実験的なループが導入されましたが、これらの機能は後のリリースで変更または廃止される可能性があります。

于 2011-06-19T15:55:03.117 に答える
27

バージョン 3.2以降、ラムダがあります

puppet.confparser = futureで設定する必要があります。

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

複数の定義済みタイプを宣言するための別のオプションは、 create_resourcesです。ハッシュのハッシュを渡します。

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',
    },  
})
于 2013-10-31T05:07:18.110 に答える
4

Puppet 4 (および Puppet 3 の最新バージョンの「将来のパーサー」) の時点で、Puppet DSL には、Ruby の配列とハッシュのいくつかのメソッドと形式と機能が似ている反復関数があります。

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

forC や Java の行に沿ったインデックス付きループはありませんが、配列のセクション化を上記の関数のいずれかと組み合わせて、データ構造のサブセットに対する反復を実現できます。whileC または Java のループに沿った無限の反復はありません。

もちろん、他の回答で説明されているリソース中心のアプローチを使用することもできます。実際、それらの 1 つが実際に利用可能な最良のアプローチである場合もあります。ただし、Ruby DSL は使用できなくなりました。それは Puppet 4 から完全に削除されます。反復関数、カスタム関数を定義する機能、データ中心のアプローチの支持の高まり、およびすべての Puppet の歴史的な標準機能の中で、Ruby DSL はそれほど見逃されていないようです。

于 2015-12-08T18:55:28.033 に答える
2

はい。「Ruby DSL」が役立ちます。マニフェストで「.pp」の代わりにファイル拡張子「.rb」を使用するだけで、パペットの「タイプ」を次のように定義できます。

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

クラスとノードも同様の方法で定義できます。ただし、この機能はリリース 3 以降では推奨されていないことに注意してください。

于 2013-07-03T12:29:39.627 に答える