Von Puppen und Marionetten
Konfigurationsmanagement mit Puppet
Definitionen
In Listing 3 erkennen wir, was eine Definition ausmacht. Das Beispiel erstellt eine Definition namens »newip«, welche als Parameter die entsprechende IP-Adresse erwartet. Das zu konfigurierende Interface wird dem Titel entnommen. Wie Listing 4 zeigt, lassen sich Definitionen auch in Klassen packen.
Variablen lassen sich nach Belieben definieren, und sämtliche »facts«, welche uns Facter zusammengetragen hat, liegen ebenfalls als solche vor. Listing 5 zeigt, wie sich solche Informationen in sogenannten »Conditionals« nutzen lassen. Die folgenden Zeilen wenden die Konfiguration schließlich auf einen bestimmten Knoten (»node«) an:
node 'client1.example.com' { include hosting::webserver }
Listing 3: Definition
define newip ( $ip ) { exec { "/sbin/ip address add $ip dev $title": } } newip { eth0: ip => "10.0.0.30", }
Listing 4: Klasse
class network { define newip ( $ip ) { exec { "/sbin/ip address add $ip dev $title": } } network::newip { eth0: ip => "10.0.0.30", }
Listing 5: Conditionals
class hosting { case $operatingsystem { fedora: { $httpd_packages = ["httpd", "php"] } debian: { $httpd_packages = ["apache2", "libapache2-mod-php5"] } ubuntu: { $httpd_packages = ["apache2", "libapache2-mod-php5"] } default: { $httpd_packages = ["apache", "php"] } } package { $httpd_packages: ensure => installed } service { "webserver": name => $operatingsystem ? { debian => "apache2", ubuntu => "apache2", redhat => "httpd", default => "apache", }, ensure => running, } }
Stored Configurations
Um Daten in einer Datenbank ablegen zu können, nutzt Puppet eine Technologie, die sich Stored Configurations nennt. Hierfür benötigt Puppet Rails, welches man unter Debian mittels apt-get install rails
installiert. Zudem benötigt man je nach gewünschter Datenbank noch libsqlite3-ruby für SQLite (Default), libmysql-ruby für MySQL oder libpgsql-ruby für PostgreSQL. Rails sollte mindestens in Version 2.2.2 vorhanden sein, unter Debian Lenny findet sich eine entsprechende Version wiederum in den offiziellen Backports.
Auch wenn MySQL nach der Installation von rails auch ohne libmysql-ruby bereits funktioniert, ist dringend anzuraten, letzteres zu installieren. Der mitgelieferte in Ruby implementierte Connector ist nicht für den Produktivbetrieb bestimmt. Macht man es dennoch, wird man im rails.log entsprechend gewarnt.
Um jetzt zum Beispiel mit MySQL loszulegen, müssen zuerst eine entsprechende Datenbank und ein passender Benutzer angelegt werden:
# mysql -u root -p mysql> CREATE DATABASE puppet; mysql> GRANT ALL PRIVILEGES ON puppet.* TO puppet@localhost IDENTIFIED BY 'Passwort';
In der Konfiguration muss dann noch der Abschnitt des Puppetmasters entsprechend angepasst werden:
[master] storeconfigs = true dbadapter = mysql dbuser = puppet dbpassword = Passwort dbserver = localhost dbsocket = /var/run/mysqld/mysqld.sock