Warum sollte ich eine mit Puppen parametrisierte Klasse verwenden?

12

Im Allgemeinen setze ich bei der Arbeit mit komplexen Puppenmodulen Variablen auf Knotenebene oder innerhalb einer Klasse. z.B,

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

Wie / wann / warum helfen parametrisierte Klassen in dieser Situation? Wie verwenden Sie parametrisierte Klassen, um Ihre Puppenmodule zu strukturieren?

Robbyt
quelle
2
Hinweis für alle, die dieses Beispiel finden, dieser Code zeigt globale Variablensuchen, die in Puppet Version <3.0 zulässig waren. In Puppet> 3.0 können Sie nicht auf Variablen außerhalb des Gültigkeitsbereichs zugreifen und müssen den Namespace verwenden, um auf Variablen zuzugreifen. In diesem Beispiel müssten Sie die entsprechenden Variablen verwenden $bar::file_nameund $::file_ownerdarauf zugreifen. Wenn Sie jedoch parametrisierte Klassen verwenden, werden die über die Parameter an eine Klasse übergebenen Variablen zu Variablen mit lokalem Gültigkeitsbereich.
Robbyt

Antworten:

12

Parametrisierte Klassen sind ein Sprachkonstrukt, mit dessen Hilfe Sie Ihren Code besser strukturieren können. Es verhindert, dass Sie übermäßig globale Variablen verwenden (wie in Ihrem Beispiel).

Stellen Sie sich vor, Sie hätten 20 weitere Klassen in Ihre Knotenbeschreibung aufgenommen, und für alle müssten einige Variablen im globalen Bereich oder im Knotenbereich des Manifests festgelegt werden. Auch parametrisierte Klassen ermöglichen es Ihnen, Standardparameter auf einfache Weise zu verwenden, sodass Sie einen Standardwert für verwenden können, $file_owneranstatt denselben Wert (z. B. larry) an mehreren verschiedenen Stellen angeben zu müssen.

Ihr Beispiel-Snippet (mit zwei zusätzlichen Knoten) könnte wie folgt geschrieben werden:

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

Wenn Sie globale Variablen verwenden, müssen Sie $ownerin jedem Knoten eine Variable mit dem Namen deklarieren, und Sie können die $file_nameVariable / den Parameter nicht pro Knoten überschreiben . Stattdessen müssen Sie barfür jeden Knoten eine andere Klasse deklarieren .

Das Dokument zur Sprachentwicklung von Puppet und natürlich der Sprachführer enthalten einige gute Beispiele für die Verwendung parametrisierter Klassen und die Gründe für dieses Sprachkonstrukt:

joschi
quelle
8

Die beste Möglichkeit, darüber nachzudenken, besteht darin, von Anfang an darauf zu kommen, anstatt bereits mit der Kenntnis der Marionetten-Redewendungen zu beginnen.

Zunächst versuchen Sie, Parameter an eine Klasse zu übergeben - Sie geben ihr die Informationen, die sie benötigt, um zu entscheiden, wie sie sich verhalten sollen, genau wie die Übergabe von Argumenten an eine Funktion. Angenommen, dies war Perl und Sie hatten eine Funktion namens multiply_squares. Sie würden es so nennen, als würden Sie multiply_squares(3, 4)einige globale Variablen nicht auf 3 und 4 setzen und sie dann aus der Funktion heraus lesen!

In der Vergangenheit musste Puppet-Code dies jedoch mit globalen Variablen oder einem dynamischen Bereich tun, da die Notwendigkeit dazu bestand, bevor die Sprache dafür entwickelt wurde. Persönlich denke ich, dass parametrisierte Klassen, sobald sie ein bisschen weiterentwickelt und weiter verbreitet sind, im Grunde genommen Probleme mit variablen Bereichen der Vergangenheit angehören, weil das Vorhandensein des richtigen Werkzeugs für den Job eine ganze Schicht furchterregender Hacks beseitigt.

nfagerlund
quelle