web-dev-qa-db-ja.com

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

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

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

この状況が発生したときに、パラメータ化されたクラスがどのように/いつ/なぜ役立つのですか?パラメーター化されたクラスを使用してパペットモジュールをどのように構成していますか?

12
robbyt

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

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

サンプルスニペット(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の言語の進化に関するドキュメントと言語ガイドには、パラメーター化されたクラスの使用方法に関する優れた例と、この言語構​​造の背後にある根拠が記載されています。

12
joschi

これについて考える最良の方法は、人形のイディオムをすでに知っていることから始めるのではなく、最初からやっていくことです。

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

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

8
nfagerlund