Puppet Master und Client installieren und konfigurieren

Ab einer gewissen Menge an Maschinen die man zu verwalten hat, stellt sich vermutlich jedem Systemadministrator die Frage – Geht das noch einfacher? Die Antwort ist Puppet, ein Configuration-Managment-Tool mit dem man das Setup eines Servers automatisieren kann.

Dieses Tutorial beschreibt die Grundlegende Installation eines Puppet Master Servers sowie eines Clients, welcher durch den Puppet Master verwaltet wird, unter Ubuntu 14.04 Server. Das Setup auf einem Debian System unterscheidet sich lediglich in der Wahl des Pakets.

Grundvoraussetzungen

  • beide Maschinen müssen im Netzwerk erreichbar sein
  • beide Maschinen müssen einen Hostnamen besitzen (z.B. master.puppetlab.local und client1.puppetlab.local), der sich im Netzwerk auflösen lässt. Alternativ kann auch ein Eintrag in der jeweiligen /etc/hosts erfolgen
  • beide Maschinen brauchen die selbe Systemzeit. Hier (und eigentlich immer) bietet sich die Installation eines ntp Clients an

Installation des Puppet Master Servers

Sind die entsprechenden Vorkehrungen getroffen, kann es mit der Installation los gehen.

Schritt 1: Download und Installation des Puppet Pakets

wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb

Alle Pakete kann man sich unter folgendem Link ansehen: https://apt.puppetlabs.com. Es folgt die Installation des Pakets.

dpkg -i ~/puppetlabs-release-trusty.deb && apt-get update

Im Anschluss wird der Puppet Master inkl. Passenger (Apache) installiert. Da Apache nach der Installation direkt startet wird dieser vorerst gestoppt.

apt-get install puppetmaster-passenger && service apache2 stop

Schritt 2: Version locken

Änderungen von Version zu Version können dazu führen, dass die Puppet-Umgebung nicht mehr richtig funktioniert. Deshalb wird die Version in APT gelocked, damit alle Maschinen die selbe Version verwenden. Zuerst wird lässt man sich dazu die Version anzeigen:

puppet help | tail -n 1

Damit bekommt man die installierte Puppet Version angezeigt. (z.B. Puppet v3.8.4). Danach erstellt man eine APT preferences Datei um die Version zu locken.

nano /etc/apt/preferences.d/00-puppet.pref

Hier trägt man, je nach Version, Folgendes ein:

Package: puppet puppet-common puppetmaster-passenger
Pin: version 3.8*
Pin-Priority: 501

Schritt 3: Zertifikat erstellen

Zuerst wird das bei der Installation erstellte Zertifikat gelöscht, damit im Anschluss ein neues erstellt werden kann.

rm -rf /var/lib/puppet/ssl

Zertifikat konfigurieren

nano /etc/puppet/puppet.conf

Hier entfernt man die Option von templatedir und fügt die Optionen certname und dns_alt_names hinzu.

[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
templatedir=$confdir/templates
certname=puppet
dns_alt_names=master,master.puppetlab.local

[master]
# These are needed when the puppetmaster is run by passenger
# and can safely be removed if webrick is used.
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY

Zertifikat erstellen

Ist alles konfiguriert, erstellt man das Zertifikat mit folgendem Befehl:

puppet master --verbose --no-daemonize

Die Erstellung des Zertifikats ist fertig sobald „Notice: Starting Puppet master version x.x.x“ angezeigt wird. Mit CTRL-C kommt man dann wieder zurück zur Eingabe.

Mit folgendem Befehl kann man sich das Zertifikat nochmals anzeigen lassen. Hier findet man später auch die Zertifikate die der Master „unterschrieben“ hat (gekennzeichnet mit einem +) und die, die noch unterschrieben werden müssen.

puppet cert list -all

Die Ausgabe schaut in etwa so aus:

+ "master" (SHA256) 1E:15:DC:F2:8A:1F:64:1E:9A:8B:19:77:FB:04:2F:55:32:80:F6:FC:63:30:30:A8:65:C5:42:32:B3:30:98:C1 (alt names: "DNS:master", "DNS:master.puppetlab.local")

Ist das Zertifikat erstellt, kann der Puppet Master nun alle signing-requests der Clients unterschreiben.

Schritt 4: Den Puppet Master konfigurieren

Die Konfigurationsdatei von Puppet (/etc/puppet/puppet.conf) besteht aus drei Teilen. Dem Bereich [main], dem Bereich [master] und dem Bereich [agent]. Unter Main werden die Grundeinstellungen getroffen. Unter [master] die Einstellungen des Puppet Masters und unter [agent] die Konfiguration der Puppet Clients bzw. Agents. In der Puppet Dokumentation zur puppet.conf finden sich noch einige Einstellungsmöglichkeiten die in der Grundinstallation aber nicht erforderlich sind.

Schritt 5: Den Puppet Master starten

service apache2 start

Installation des Puppet Clients

Ist der Master fertig installiert, folgt nun die Installation des Puppet Agents bzw. Clients.

Schritt 1: Download und Installation des Puppet Pakets

wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb

Es folgt, wie bereits bei der Installation des Masters durchgeführt, die Installation des Pakets:

dpkg -i ~/puppetlabs-release-trusty.deb && apt-get update

Im Anschluss wird der Puppet Client installiert.

apt-get install puppet

Nachdem der Start des Puppet Clients per default deaktiviert ist, muss dieser zuerst per Konfigurationsfile aktiviert werden.

nano /etc/default/puppet

Hier Trägt man Folgendes ein:

START=yes

Schritt 2: Version locken

Auch die Version des Clients muss zuerst gelocked werden um Probleme zu vermeiden. Zuerst wird lässt man sich dazu wieder die Version anzeigen:

puppet help | tail -n 1

Danach erstellt man eine APT preferences Datei um die Version zu locken.

nano /etc/apt/preferences.d/00-puppet.pref

Hier trägt man, je nach Version, Folgendes ein:

Package: puppet puppet-common puppetmaster-passenger
Pin: version 3.8*
Pin-Priority: 501

Schritt 3: Den Puppet Client konfigurieren

nano /etc/puppet/puppet.conf

Die Konfiguration wird initial genau so aussehen wie die des Masters. Hier entfernt man zuerst den [master] Bereich und ebenfalls wieder die templatedir Option und fügt den Bereich [agent] hinzu. Die Datei sollte dann in etwa so aussehen.

[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter

[agent]
server=master.puppetlab.local

Nun kann der Puppet Client (Agent) gestartet werden.

service puppet start

Wenn alles richtig konfiguriert ist, sollte keine Fehlermeldung angezeigt werden. Der Client generiert ein SSL Zertifikat und schickt dieses zur „Unterschrift“ an den Master.

Schritt 4: Zertifikat des Clients unterschreiben

Erst nachdem der Master Server das vom Client erstellte Zertifikat unterschrieben hat können beide Maschinen miteinander kommunizieren. Zur Unterschrift des Clients Zertifikats loggt man sich nun wieder auf dem Puppet Master ein und listet alle nicht unterschriebenen Zertifikate mit folgendem Befehl auf:

puppet cert list

Die Ausgabe schaut dann in etwa so aus:

"client1.puppetlab.local" (SHA256) E0:E6:4E:3F:33:04:6A:12:F1:D3:7A:AC:A5:05:E0:F8:D7:7C:9E:A1:26:B8:24:0C:76:10:5E:8B:F2:60:28:E7

Nun kann das Zertifikat unterschrieben werden.

puppet cert sign client1.puppetlab.local

Oder man signiert direkt alle Anfragen mit folgendem Befehl:

puppet cert sign --all

Nun können Client und Master miteinander kommunizieren.

Unterschrift wiederrufen

Sollte es nötig sein einmal die Unterschrift zu widerrufen, geht das mit folgendem Befehl:

puppet cert clean client1.puppetlab.local

Ein erstes Manifest erstellen

Wenn alles läuft kann nun ein erstes Manifest auf dem Master Server eingerichtet werden. Mit dem Manifest wird festgelegt welchen „state“ eine Maschine haben soll, also welche Pakete installiert, welche User angelegt, oder welche SSH Schlüssel autorisiert sein sollen.

Hinweis: Es handelt sich hierbei nur um einfache Beispiele. Bei komplexeren Setups wird üblicherweise mit Modulen und Klassen gearbeitet.

Beispiel 1: Sicherstellen, dass eine Datei angelegt ist

nano /etc/puppet/manifests/site.pp

Hiermit legt man fest, dass auf jedem Client die Date hello in /tmp angelegt und die Rechte 644 besitzt.

file { '/tmp/hello':
 ensure => 'present',
 content => 'Hello World!',
 mode => '644',
}

Um die Konfiguration direkt zu übernehmen reicht folgender Befehl auf dem Client.

puppet agent --test

Beispiel 2: Sicherstellen, dass ein Paket installiert ist

nano /etc/puppet/manifests/site.pp

Hiermit legt man fest, dass auf jedem Client das Paket „tcpdump“ installiert ist.

package { 'tcpdump':
 ensure => 'present',
}

Um die Konfiguration direkt zu übernehmen reicht folgender Befehl auf dem Client.

puppet agent --test

Beispiel 3: Sicherstellen, dass ein Benutzer angelegt ist

nano /etc/puppet/manifests/site.pp

Hiermit legt man fest, dass auf jedem Client der Benutzer „administrator“ angelegt ist und die folgenden Attribute besitzt.

user { 'administrator':
 ensure => 'present',
 comment => 'Administrator Account',
 gid => '1000',
 groups => ['adm', 'cdrom', 'sudo', 'dip', 'plugdev', 'lpadmin', 'sambashare'],
 home => '/home/administrator',
 password => '$6$IIgb5TIp$JJmqVFhEKqdB80DYPoxxojy7tybiAJsDjrzvFb.D9UQJlr.9Y9qX4FY7e5G3bMnbZCsRWyAgC1wrQGlR7JPpP.',
 password_max_age => '99999',
 password_min_age => '0',
 shell => '/bin/bash',
 uid => '1000',
}

Um die Konfiguration direkt zu übernehmen reicht folgender Befehl auf dem Client.

puppet agent --test

Beispiel 4: Konfiguration für bestimmte Clients

Soll eine Konfiguration nicht pauschal auf alle Clients ausgerollt werden, lässt ich eine Konfiguration mit node definitions auf bestimmte Clients eingrenzen:

node 'client1' {
 file {'/tmp/client1':
 ensure => 'present',
 mode => 0644,
 content => "Die Datei ist nur auf Client1 zu finden!",
 }
}

Wichtige Befehle im Umgang mit Puppet

System Facts anzeigen

facter

Mit facter lassen sich Facts (Variablen) über das System anzeigen. Zum Beispiel die IP Adresse:

facter ipaddress_eth0

Diese kann beispielsweise auch in Puppet Manifesten verwendet werden:

 file {'/tmp/ip':
  ensure => 'present',
  mode => 0644,
  content => "Die IP lautet: ${ipaddress_eth0}",
 }

Ein Manifest oder eine Bedingung lokal anwenden

puppet apply /etc/puppet/modules/test/init.pp

Alternativ kann man Bedingungen auch direkt mit puppet apply anwenden.

puppet apply -e 'package { "tcpdump": ensure => installed }'

Will man nur sehen was passieren würde (ideal für Testzwecke), kann man die Option –noop verwenden. Will man noch mehr Infos, empfiehlt sich zusätzlich die Option –debug.

puppet apply -e 'package { "tcpdump": ensure => installed }' --noop --debug

Das Manifest von einem Master anwenden

puppet agent --test

Will man nur sehen was passieren würde, kann man auch hier die Option –noop verwenden.

puppet agent --test --noop

Ressourcentypen anzeigen

Mit folgendem Befehl lassen sich alle auf dem System verfügbaren Ressourcentypen anzeigen.

puppet describe --list

Dokumentation für Ressourcentypen anzeigen

puppet describe cron

Ressourcen von Puppet definieren lassen

puppet resource user root

Dieser Befehl Beschreibt eine Ressource auf dem System. Der Output kann beispielsweise direkt in ein Manifest kopiert werden.

user { 'root':
 ensure => 'present',
 comment => 'root',
 gid => '0',
 home => '/root',
 password => '$6$sJwbgodZ$.z6Fj3uKoJp7yFPsqvcBBBeL.XiQTiStME9jtKTkQFcP3TSPBt4Mt5G7S8yVILHAOQcv8xZuOXZqpEcyiJTJh1',
 password_max_age => '99999',
 password_min_age => '0',
 shell => '/bin/bash',
 uid => '0',
}

Module installieren

Für Puppet gibt es zahlreiche vorgefertigte Module. Diese lassen sich meist einfach über folgenden Befehl installieren.

puppet module install modulname

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.