Bisherige Beiträge in der Reihe:

In diesem Beitrag geht es um das Aufsetzen eines Puppet Server, mit dessen Hilfe die Konfiguration der folgenden VMs und Container kontrolliert werden kann. Dabei wird die Puppet Collection 1 verwendet, also ein Puppet Agent, der auf dem Server-System selbst einige Konfiguration umsetzt, ein Puppet Server, der Anfragen von Puppet Agents entgegen nimmt und ihnen erzählt, wie sie zu konfigurieren sind und eine Puppet DB, in der verschiedene Daten über die Nodes gespeichert werden können. Diese benötigt außerdem eine funktionierende PostgreSQL-Datenbank.

Server anlegen

Neben der Möglichkeit, virtuelle Maschinen anzulegen, können mit Proxmox auch Container angelegt werden, die etwas leichter auf die Resourcen zugreifen. Dabei wird nicht ein kompletter Computer simuliert sondern mit Hilfe von LXC ein Linux-System innerhalb des bestehenden Systems gestartet. Die technischen Details sind an dieser Stelle nicht so wichtig - relevante Einrichtungsdetails werden im Laufe der Anleitung dargelegt.

Zuerst brauchen wir ein Template, also ein Basis-Image des geplanten Betriebssystems. Proxmox bietet dazu Im Speicher local der Node unter Content den Knopf Templates. Dort stehen einige Vorlagen bereits zur Verfügung, ich wähle Ubuntu Xenial Standard. Mit dem Klick auf Download wird das Template bezogen und im Datenspeicher hinterlegt.

Wir als nächstes einen Container ein. Der Knopf dafür ist mit Create CT beschriftet. Folgende Daten habe ich gewählt:

  • Hostname: puppet - wenn man funktionierendes DNS inklusive Domain für FQDNs hat, erspart das extra Konfiguration der Nodes, da diese standardmäßig puppet.domain.tld anrufen.
  • Password: geheim - hier wird das Root-Passwort gewählt.
  • Template: Ubuntu 16.04 - das eben heruntergeladene Template sollte hier auftauchen.
  • Root Disk: 5 GB reichen vollkommen aus. Eine vollständige Installation von Puppet, Puppet Server, PuppetDB und PostgreSQL benötigt bei mir etwa 1,5 GB.
  • CPUs: Eine reicht
  • Memory: 1536 MB, nachdem da einiges mit Datenbanken läuft.
  • Network:
    • Bridge: vmbr1, damit die VM im internen Netzwerk auftaucht
    • IPv4: DHCP und IPv6: DHCP
  • DNS:
    • DNS Domain: domain.tld - durch eine Domain ersetzt, die ich besitze
    • DNS Server 1 10.0.0.2 - die Firewall-VM. Normalerweise kommt das über DHCP aber Proxmox greift hier ein und setzt die Nameserver, die es selbst verwendet, wenn in dieser Zeile nichts angegeben ist. Dann klappt das Auflösen interner Hostnames nicht mehr.

Fertig!

Container einrichten

Der Container verhält sich größtenteils wie eine VM. Man startet die VM, loggt sich über Spice auf dem Container ein und legt am besten als erstes gleich einen normalen Nutzer an, über den man sich per SSH verbinden kann:

adduser florian
usermod -a -G sudo florian

Wer nicht Florian heißt, kann das hier natürlich anpassen. Die zweite Zeile erlaubt, mit sudo auch Systemverwaltung vorzunehmen.

Wer auf seinem Desktop deutsche Locales verwendet, sei es auch nur für Zahlen, Währungen und Uhrzeiten, bekommt an dieser Stelle ggf. Warnungen, diese wären auf dem Container nicht verfügbar. Das lässt sich leicht beheben:

locale-gen de_DE.UTF-8

Puppet installieren

Ubuntu 16.04 kommt zwar mit Puppet in den Paketquellen, die offiziellen von Puppetlabs zu verwenden ist aber sinnvoller. Wir verwenden hier die Puppet Collection 1, damit die Versionen der eingesetzten Komponenten aufeinander abgestimmt sind:

wget http://apt.puppetlabs.com/puppetlabs-release-pc1-xenial.deb
dpkg -i puppetlabs-release-pc1-xenial.deb
apt-get update && apt-get dist-upgrade -u # Alle Pakete aktualisieren
apt-get install puppet-agent puppetserver

Nachdem ich nicht plane, mein Netzwerk riesig zu machen, kommt mein Puppetserver mit einem viertel der standardmäßig zugewiesenen 2 GB RAM aus. Dazu muss die Datei /etc/default/puppetserver bearbeitet und nach JAVA_ARGS gesucht werden. Die neue Zeile sieht bei mir dann so aus:

# Datei /etc/default/puppetserver
JAVA_ARGS="-Xms512m -Xmx512m"

Um mit der Installation fortfahren zu können, müssen wir erst SSL-Zertifikate generieren lassen, mit denen sich Puppet Agent und Puppet Server gegenseitig autentifizieren. Dazu starten wir erst den Puppet Server neu, wegen der RAM-Änderung, und lassen dann den Puppet Agent seine erste Anfrage an den Puppet Server schicken. Dabei wird automatisch ein Zertifikat generiert:

systemctl restart puppetserver
/opt/puppetlabs/bin/puppet agent -t

Als nächstes installieren wir PostgreSQL, PuppetDB und einige notwendige Pakete. Glücklicherweise brauchen wir das alles nicht selbst konfigurieren sondern können es einfach auch Puppet machen lassen. Dazu müssen Voraussetzungen gegeben sein, die wir zuerst installieren:

puppet module install puppetlabs-puppetdb
puppet module install puppetlabs-inifile
puppet module install puppetlabs-postgresql
puppet module install puppetlabs-firewall
puppet module install puppetlabs-stdlib

Damit wird noch nichts installiert; es handelt sich dabei erst mal nur um die Puppet-Module, die gleich die eigentliche Installation starten werden. Dazu erstellen wir ein temporäres Manifest für Puppet, das die Installation mit Standardeinstellungen anstößt:

# Datei /root/puppetdb.pp
class {'puppetdb': }
class {'puppetdb::config::master': }

Es werden zwei Klassen definiert. Die erste installiert die PuppetDB und alle Voraussetzungen, die zweite konfiguriert den Puppet Server, die PuppetDB auch zu verwenden.

Wir lassen Puppet dieses Manifest anwenden:

/opt/puppetlabs/bin/puppet apply /root/puppetdb.pp

Die Installation kann eine Weile dauern, da eine Menge Pakete heruntergeladen und installiert werden müssen. Ist sie fertig, kann das Setup nochmal getestet werden, indem nochmal eine Anfrage des Puppet Agent gestartet wird:

/opt/puppetlabs/bin/puppet agent -t

Dabei sollte nach wie vor nichts passieren - wir haben ja auch noch gar keine Manifeste und Daten hinterlegt, die anzuwenden sind. Läuft es aber ohne Fehlermeldung durch, hat die Einrichtung des Puppet Server und der Puppet DB geklappt.