web-dev-qa-db-ja.com

パペットにイテレータとループはありますか?

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

そのように:

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

私には数十のディレクトリがあり、それをパペットで宣言することに本当に疲れています。

何か案は?

35
user425720

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

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

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

各リソースを;で終了することにより、異なるタイプの同じタイプの多くのリソースを宣言することもできます。これは、file{sおよび}s:

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

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

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

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が利用可能です。DSLには、求めることができるすべてのループ機能があります。 http://www.puppetlabs.com/blog/Ruby-dsl/ (ただし、使用したことはありません。)Puppet 3.2では、いくつかの 実験ループ を導入しましたが、これらの機能は今後のリリースで変更または廃止される可能性があります。

40
freiheit

バージョン3.2の時点で lambdas があります

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',
    },  
})
25
quickshiftin

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

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

CまたはJavaの行に沿ったインデックス付きforループはありませんが、 array sectioning を上記の関数のいずれかと組み合わせて、データ構造のサブセットの反復を実現できます。 CまたはJava whileループの行に沿った不明確な反復はありません。

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

4
John Bollinger

はい。 「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

クラスとノードも同様の方法で定義できます。ただし、この機能は deprecated リリース3以降です。

2
Aleksandr K.