Alle Puppet Module folgenden einem deklarativen Syntax. Zusätzlich ist eine bestimmte Dateistruktur für Module vorgegeben.
Grundsätzlich befinden sich alle Module im Ordner /etc/puppet/environments/production/modules
. Dabei besitzt jedes Modul eine gewisse Unterstruktur.
modulname/
|
|-- files/ (Für statische Konfigurationsdateien - optional)
|-- templates/ (Für dynamische Konfigurationsdateien - optional)
|-- manifests/ (Moduldefinitionen - notwendig)
|
|-- init.pp (Primäre Klassendefinition)
Das kleinste Modul besteht also aus dem Ordner mit dem Klassennamen, dem Unterverzeichnis manifests/
und der Datei init.pp
, welche für die Klassen- / Moduldefinition vorgesehen ist.
In größeren Modulen können im Verzeichnis files/
zusätzlich statische (= unveränderliche) Konfigurationsdateien abgelegt werden.
Das Verzeichnis templates/
ermöglicht die Ablage von Konfigurationsdatei-Vorlagen (Endung .erb). In diesen können Variablen gesetzt und die gewünschte Konfigurationsdatei somit beliebig angepasst werden.
Um eine Grundstruktur anzulegen kann der nachfolgende Befehl benutzt werden.
puppet module generate mymodule
Klassendefinition / init.pp
Im Folgenden schauen wir uns die initiale Klassenkonfiguration anhand mehrere Beispiele etwas näher an.
Pakete verwalten
class modulname {
package { "apache2":
ensure => "installed"
}
}
Dieses minimale Modul installiert das Paket apache2. Hier erkennt man auch sehr schön die Funktionsweise von Puppet. Es wird der gewünschte Systemstand definiert (installed
). Um die distributionsspezifische Umsetzung wie z.B. die Installation mittels apt-get oder yum kümmert sich Puppet.
apache2
ist dabei der sogenannte Ressourcenname. Da der Parameter name
nicht angegeben ist, nimmt Puppet den Ressourcennamen als Paketnamen des zu installierenden Paketes. Daher wäre auch folgende Möglichkeit funktional.
class modulname {
package { "ApacheWebserver":
name => 'apache2',
ensure => "installed"
}
}
Neben dem Typ package
existieren noch weitere Standardtypen. Die gängigsten sind:
cron
– Management von Cronjobsexec
– Ausführen von Befehlenuser
– Management von Benuterngroup
– Management von Gruppenmount
– Mounten von Geräten / Sharesservice
– Management von Systemdienstenssh_authorized_key
– Verwaltung von SSH Keys
Eine komplette Übersicht findet sich in der offiziellen Dokumentation.
Pakete und Dienste verwalten
Die nachfolgende Definition installiert den Apache Webserver und stellt sicher, dass der Apache Dienst gestartet ist (ensure => running) und beim Systemstart gestartet (enable => true) wird.
class modulname {
package { "apache2":
ensure => "installed"
}
service { "apache2":
ensure => "running",
enable => true
}
}
Pakete / Dienste und Konfigurationsdateien
Nun gehen wir einen Schritt weiter und geben unserem Apache Modul noch eine Konfigurationsdatei mit. Zunächst pflegen wir diese als statische Datei im Verzeichnis files/
ein.
Voraussetzung für die Funktionalität ist, dass die httpd.conf angelegt und mit einem funktionalen Inhalt gefüllt ist.
class modulname {
package { "apache2":
ensure => "installed"
}
service { "apache2":
ensure => "running",
enable => true
}
file { "httpd.conf":
path => "/etc/apache2/httpd.conf",
ensure => file,
require => Package['apache2'],
source => "puppet:///modules/modulname/httpd.conf"
}
}
Über require
haben wir nun eine Abhängigkeit definiert: Die Konfigurationsdatei kann erst angelegt werden, wenn das Paket apache2 installiert wurde. Hierzu aber später mehr.
Die Option path
gibt an unter welchem Pfad die Konfigurationsdatei angelegt bzw. aktualisiert werden soll (auf dem Remotesystem). Der Ordner files/
muss hierbei nicht angegeben werden.
Über source
geben wir die Quelle der statischen Konfigurationsdatei auf unserem Puppet Master an. Die Abfrage läuft dann automatisch über den in Puppet integrierten Fileserver.
Puppet Forge
Auf diese Weise könnte man nun für jede erdenkliche Funktion ein passendes Modul schreiben. Um den Arbeitsaufwand hierfür drastisch zu reduzieren, existiert die Puppet Forge. Dies ist ein freier Marktplatz für alle Arten von Modulen.
Hier finden sich fertige Module für z.B. MySQL, IPTables, Apache, HAProxy, Nginx, NTP, etc. Diese lassen sich später auch ganz bequem in Profile (z.B. profile::ntp) integrieren.
In der Regel existiert zu jedem Forge Modul auch eine ausführliche Dokumentation über die Verwendung + Parameter. Gängige Module werden auch offiziell vom Hersteller Puppet Labs unterstützt und gepflegt.