パペットのパラメータ化されたクラスを使用する必要があるのはなぜですか?


12

一般に、複雑なパペットモジュールを使用する場合、ノードレベルまたはクラス内で変数を設定します。例えば、

node 'foo.com' {
  $file_owner = "larry" 
  include bar 
}

class bar { 
  $file_name = "larry.txt"
  include do_stuff
}

class do_stuff {
  file { $file_name:
    ensure => file,
    owner  => $file_owner,
  }
}

このような場合、パラメーター化されたクラスはどのように/いつ/なぜ役立つのでしょうか?パラメーター化されたクラスを使用してパペットモジュールをどのように構築していますか?


2
この例を見つけるすべての人に注意してください。このコードは、Puppetバージョン<3.0で許可されたグローバル変数検索を示しています。Puppet> 3.0では、スコープ外の変数にアクセスすることはできず、ネームスペースを使用して変数にアクセスする必要があります。この例では、それぞれの変数を使用$bar::file_name$::file_ownerてアクセスする必要があります。ただし、パラメーター化されたクラスを使用する場合、パラメーターを介してクラスに渡される変数はローカルスコープの変数になります。
ロビット

回答:


12

パラメータ化されたクラスは、コードの構造を改善するのに役立つ言語構造です。グローバル変数を過度に使用することを防ぎます(例のように)。

ノードの説明にさらに20のクラスを含めると、マニフェストのグローバルスコープまたはノードスコープで設定されるいくつかの変数がすべて必要になります。また、パラメータ化されたクラスを使用すると、デフォルトのパラメータを簡単に設定できるため、複数の異なる場所で$file_owner同じ値(例:)を提供する代わりに、デフォルト値を使用できますlarry

サンプルスニペット(2つの追加ノード)は、次のように記述できます。

node 'example.com' { 
  class { bar: }
}

node 'example.net' {
  class { bar: owner = "harry" }
}

node 'example.net' {
  class { bar: file_name = "barry.txt" }
}

class bar($owner = "larry", $file_name = "larry.txt") { 
  class { do_stuff: owner => $owner, file_name => $file_name }
}

class do_stuff($owner, $file_name) {
  file { $file_name:
    ensure => file,
    owner  => $owner,
  }
}

グローバル変数を使用する場合$owner、各ノードで名前が付けられた変数を宣言する必要があり、ノードごとに$file_name変数/パラメーターを上書きすることはできません。代わりにbar、各ノードに別のクラスを宣言する必要があります。

Puppetの言語の進化に関するドキュメントと、もちろん言語ガイドは、パラメーター化されたクラスの使用方法と、この言語構​​成の背後にある理論的根拠に関するいくつかの良い例を提供します。


8

これについて考える最良の方法は、パペットのイディオムを既に知っていることから始めるのではなく、最初からそれに取り組むことです。

最初にやろうとしているのは、クラスにパラメーターを渡すことです。関数に引数を渡すのと同じように、振る舞いを決定するために必要な情報をクラスに渡します。これがperlであり、multiply_squaresという関数があったとします。あなたはそれをのようmultiply_squares(3, 4)に呼び出し、いくつかのグローバル変数を3と4に設定せずに、関数内からそれらを読み取ります!

しかし、歴史的に、Puppetコードは、グローバル変数または動的スコープでそれを行わなければなりませんでした。なぜなら、言語がそれを行うように設計される前に、それを行う必要が生じたからです。個人的には、パラメーター化されたクラスが少し進化し、より広く展開されると、基本的に変数スコープの問題は過去のものになると思います。ジョブに適切なツールを使用できるようにすると、恐ろしいハッキングの層全体がなくなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.