リソースを定義(?)するときdir構造を確保するために、利用可能なループはありますか?
そのように:
for X in [app1,app2] do:
file { '/opt/app/' + X:
ensure => directory,
owner => 'root',
group => 'root',
mode => '0644',
}
私には数十のディレクトリがあり、それをパペットで宣言することに本当に疲れています。
何か案は?
古いバージョンのパペット言語では、ループがサポートされていません。
ただし、タイトルに単純な文字列ではなく配列を使用し、同じパラメータで複数のリソースを同時に宣言できます。
$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では、いくつかの 実験ループ を導入しましたが、これらの機能は今後のリリースで変更または廃止される可能性があります。
バージョン3.2の時点で lambdas があります
puppet.confでparser = 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',
},
})
Puppet 4(およびPuppet 3の最新バージョンの「将来のパーサー」)の時点で、Puppet DSLには、Ruby配列およびハッシュのメソッドのいくつかと形式および機能が類似した反復関数があります。
CまたはJavaの行に沿ったインデックス付きfor
ループはありませんが、 array sectioning を上記の関数のいずれかと組み合わせて、データ構造のサブセットの反復を実現できます。 CまたはJava while
ループの行に沿った不明確な反復はありません。
もちろん、他の回答で説明されているリソース中心のアプローチを使用することはできますが、そのうちの1つが実際に利用可能な最良のアプローチである場合もあります。もはやRuby DSLを使用することはできません。Puppet4からは完全に削除されます。反復関数の中で、カスタム関数を定義する機能、データ中心のアプローチの優先度、すべてのPuppetの歴史的な標準機能、Ruby DSLはそれほど見逃されていないようです。
はい。 「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以降です。