Puppet 4 - Installation und Inbetriebnahme

Diesen Beitrag schrieb ich 7 Jahre und 2 Monate zuvor; die nachfolgenden Ausführungen müssen heute weder genau so nach wie vor funktionieren, noch meiner heutigen Meinung entsprechen. Behalte das beim Lesen (und vor allem: beim Nachmachen!) bitte stets im Hinterkopf.

Geschätzte Lesezeit: 3 Minuten

Ihr habt es sicher schon mitbekommen: ich befasse mich mehr und mehr mit dem Thema Konfigurationsmanagement, und Puppet 4 ist das System, zu dessen Einsatz ich mich entschlossen habe. Ich beiße mich also tapfer durch, und ich hoffe sehr, in absehbarer Zeit einen Lehrgang zum Thema machen zu dürfen – die Lernkurve wäre denn doch eine andere ;) Es ist ein großes Thema, aber dann auch doch wieder nicht so riesig, wie ich immer gedacht hatte. Es geht hier also nicht um „Puppet ja oder Puppet nein?“, auch nicht um das Für und Wider von deklarativem Konfigurationsmanagement, sondern einfach um Puppet 4: Einrichtung, Betrieb, Stolpersteine. Das Übliche, soweit es mein Blog betrifft ;) Verwendetes System: Debian 8

puppetserver installieren

Nachdem das System auf den aktuellen Stand gebracht wurde, können wir die Installation von puppetserver angehen; hierzu muss von apt.puppetlabs.com das zum System passende Archiv heruntergeladen und installiert werden. Für unser Debian 8 nehmen wir puppetlabs-release-pc1-jessie.deb.

puppetserver$ cd /tmp
puppetserver$ wget http://apt.puppetlabs.com/puppetlabs-release-pc1-jessie.deb
puppetserver$ dpkg -i puppetlabs-release-pc1-jessie.deb
Selecting previously unselected package puppetlabs-release-pc1.
(Reading database ... 31780 files and directories currently installed.)
Preparing to unpack puppetlabs-release-pc1-jessie.deb ...
Unpacking puppetlabs-release-pc1 (1.1.0-2jessie) ...
Setting up puppetlabs-release-pc1 (1.1.0-2jessie) ...
puppetserver$ apt-get update
puppetserver$ apt-get upgrade
puppetserver$ apt-get install puppetserver

Das bringt puppetserver nebst seiner Abhängigkeiten ins System, und das kann durchaus eine Weile dauern ;) Überhaupt empfiehlt es sich, nicht allzu ungeduldig zu sein…

Etwas weniger RAM-Verbrauch, bitte…

In der Standardkonfiguration möchte die Software 2GB RAM beanspruchen; wem das wie mir für eine Teststellung zu viel ist, kann es in /etc/default/puppetserver ändern:

## file: "/etc/default/puppetserver"
# Modify this if you'd like to change the memory allocation, enable JMX, etc
JAVA_ARGS="-Xms1g -Xmx1g -XX:MaxPermSize=256m"

Per service puppetserver restart muss der Dienst nun mit der geänderten Konfiguration durchgestartet werden. Es lohnt sich, sich direkt mit den Logfiles unterhalb von /var/log/puppetlabs/ vertraut zu machen – die werden wir noch öfter benötigen…

puppetserver$ tail -f /var/log/puppetlabs/puppetserver/puppetserver.log
...
[p.s.m.master-service] Puppet Server has successfully started and is now ready to handle requests

puppetdb installieren

puppetserver$ apt-get install puppetdb postgresql postgresql-contrib
...
puppetserver$ sudo -u postgres sh
$ createuser -DRSP puppetdb
Enter password for new role:
Enter it again:
$ createdb -E UTF8 -O puppetdb puppetdb
$ psql puppetdb -c 'create extension pg_trgm'
CREATE EXTENSION
$ exit

puppetserver$ /opt/puppetlabs/bin/puppet resource package puppetdb-termini ensure=latest
Notice: /Package[puppetdb-termini]/ensure: created
package { 'puppetdb-termini':
  ensure => '4.3.0-1puppetlabs1',
}

In /etc/puppetlabs/puppetdb/conf.d/ findet sich die Datei database.ini, welche die Zugangsdaten zur Datenbank enthalten muss. So lange sie nicht (oder nur mit fehlerhaftem Inhalt) existiert, wird ein Start von puppetdb mit der Meldung: „PuppetDB requires PostgreSQL. The [database] section must contain an appropriate “//host:port/database” subname setting.“ fehlschlagen. Füllen wir nun also unsere Angaben ein:

[database]
subname = //localhost:5432/puppetdb
username = puppetdb
password = VeryGeheimesPasswort

Benötigt wird außerdem eine routes.yaml – wo genau sie liegen muss lässt sich mit dem Aufruf /opt/puppetlabs/bin/puppet master --configprint route_file ermitteln – mit dem folgenden Inhalt:

---
master:
  facts:
    terminus: puppetdb
    cache: yaml

Falls noch nicht vorhanden, muss abschließend unterhalb von /etc/puppetlabs/puppet/ eine puppetdb.conf erstellt werden, sie enthält die Verbindungsinformation zur Datenbank:

[main]
server_urls = https://puppetserver.bafi.lan:8081/

Sorgen wir nun dafür, dass die Dateiberechtigungen korrekt sind, und schon kann puppetdb an den Start gehen – das Logfile /var/log/puppetlabs/puppetdb/puppetdb.log zeigt auf, was gerade passiert. Beachtet insbesondere diesen Link für weiterführende Informationen.

puppetserver$ /opt/puppetlabs/bin/puppetdb ssl-setup
puppetserver$ chown -R puppet:puppet `sudo /opt/puppetlabs/bin/puppet config print confdir`
puppetserver$ service puppetdb restart

puppetserver konfigurieren

Erweitern wir nun die puppet.conf, die sich unterhalb von /etc/puppetlabs/puppet befindet. Natürlich können die einzelnen Settings hier nur angerissen werden – die vollständige Liste findet ihr unter diesem Link.

Wollen wir die Facts, Konfigurationen etc. eines Clients dauerhaft hinterlegen? Dann setzen wir storeconfigs auf true und storeconfigs_backend auf puppetdb. Außerdem möchten wir trusted_server_facts nutzen – das sind Facts, die vom Server verifiziert wurden und als korrekt angesehen werden können. Werte innerhalb dieses Hashs können vom Client fortan nicht mehr überschrieben werden. Ein Beispiel hierfür wäre $trusted[‘certname’]. Mit certname geben wir den Namen des Zertifikats an, wenn es vom FQDN des Hosts abweicht. Und mit dem Abschnitt [agent] greifen wir schonmal ein wenig vor und treffen Einstellungen, die wir für eine erfolgreiche Verbindung von puppet agent benötigen. Hernach ein service puppetserver restart` nicht vergessen!

## file: "/etc/puppetlabs/puppet/puppet.conf"
...
[main]
reports                = store,puppetdb
...
[master]
ssldir                 = /etc/puppetlabs/puppet/ssl
certname               = puppetserver.bafi.lan
parser		       = current
strict_variables       = false
trusted_server_facts   = true
storeconfigs            = true
storeconfigs_backend    = puppetdb
...
[agent]
server                 = puppetserver.bafi.lan
certname               = puppetserver.bafi.lan
## masterport          = 8140
## environment         = production
## runinterval         = 2d
...

puppet agent

Nun ist es an der Zeit, puppet agent auf dem Host in Betrieb zu nehmen – der lokale puppet agent wird sich also mit dem lokalen puppetserver verbinden. Installiert ist er ja schon, deshalb kann er unmittelbar in Betrieb genommen werden:

puppetserver$ /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true
Notice: /Service[puppet]/ensure: ensure changed 'stopped' to 'running'
service { 'puppet':
  ensure => 'running',
  enable => 'true',
}

Sobald das passiert ist, wird der Client den Server kontaktieren – per Default alle 30 Minuten – oder aber man forciert einen Lauf:

puppetserver$ /opt/puppetlabs/bin/puppet agent --test
Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppetserver.bafi.lan
Info: Applying configuration version '1486216969'
Notice: Applied catalog in 0.05 seconds

Ein fehlerfreier Lauf :) Da wir noch keine Konfiguration hinterlegt haben, die auf dem Host Anwendung finden soll, werden auch keinerlei Änderungen an der Konfiguration vorgenommen. Allerdings übermittelt der Client fortan seine Facts, die wiederum in PuppetDB abgelegt werden, wie sich den Logs entnehmen lässt:

[puppetserver] Puppet 'store_report' command for puppetserver.bafi.lan submitted to PuppetDB with UUID 0ff4f784-dce1-4fc9-aa40-18236ec8e06a

Ein weiterer Client

Ein weiterer Client, ebenfalls unter Debian 8, soll nun an puppetserver angebunden werden; hierzu muss der Client zuerst mit puppet agent ausgestattet werden. Die Vorgehensweise ist analog zu der der Einrichtung des Servers:

agent$ cd /tmp
agent$ wget http://apt.puppetlabs.com/puppetlabs-release-pc1-jessie.deb
agent$ dpkg -i puppetlabs-release-pc1-jessie.deb
Selecting previously unselected package puppetlabs-release-pc1.
(Reading database ... 31780 files and directories currently installed.)
Preparing to unpack puppetlabs-release-pc1-jessie.deb ...
Unpacking puppetlabs-release-pc1 (1.1.0-2jessie) ...
Setting up puppetlabs-release-pc1 (1.1.0-2jessie) ...
agent$ apt-get update
agent$ apt-get upgrade
agent$ apt-get install puppet-agent

Ohne weitere Konfiguration wird der Client versuchen, sich zu einem Puppetserver namens puppet zu verbinden – möchte man das ändern, macht man die benötigten Angaben (wie gehabt) in /etc/puppetlabs/puppet/puppet.conf im Abschnitt [agent]. Hernach forciert man einen ersten Lauf:

agent$ /opt/puppetlabs/bin/puppet agent --test
Info: Creating a new SSL key for agent.bafi.lan
Info: Caching certificate for ca
Info: csr_attributes file loading from /etc/puppetlabs/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for agent.bafi.lan
Info: Certificate Request fingerprint (SHA256): 1D:82:78:62:14:14:6B:36:BC:B6:BD:FC:14:7A:B2:00:89:9B:03:46:92:2D:50:11:31:AB:3B:29:D5:D1:23:E1
Info: Caching certificate for ca
Exiting; no certificate found and waitforcert is disabled

Nun ist es an puppetserver, dieses Client-Zertifikat anzunehmen und zu signieren.

puppetserver$ /opt/puppetlabs/bin/puppet cert list
  "agent.bafi.lan" (SHA256) 1D:82:78:62:14:14:6B:36:BC:B6:BD:FC:14:7A:B2:00:89:9B:03:46:92:2D:50:11:31:AB:3B:29:D5:D1:23:E1
puppetserver$ /opt/puppetlabs/bin/puppet cert sign agent.bafi.lan
Signing Certificate Request for:
  "agent.bafi.lan" (SHA256) 1D:82:78:62:14:14:6B:36:BC:B6:BD:FC:14:7A:B2:00:89:9B:03:46:92:2D:50:11:31:AB:3B:29:D5:D1:23:E1
Notice: Signed certificate request for agent.bafi.lan
Notice: Removing file Puppet::SSL::CertificateRequest agent.bafi.lan at '/etc/puppetlabs/puppet/ssl/ca/requests/agent.bafi.lan.pem'

Erst nach Akzeptieren dieses Zertifikats ist der reguläre Betrieb möglich; ein erneuter Testlauf zeigt es:

agent$ /opt/puppetlabs/bin/puppet agent --test
Info: Caching certificate for agent.bafi.lan
Info: Caching certificate_revocation_list for ca
Info: Caching certificate for agent.bafi.lan
Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for agent.bafi.lan
Info: Applying configuration version '1486220911'
Info: Creating state file /opt/puppetlabs/puppet/cache/state/state.yaml
Notice: Applied catalog in 0.01 seconds

Unser Setup steht nun bereit, es befindet sich im Leerlauf; beide Instanzen von puppet agent wenden sich fortan alle 30 Minuten an puppetserver, erhalten ihren Katalog, der jedoch leer ist, und übermitteln ihre Facts, auf die im weiteren Verlauf das Regelwerk aufbauen wird. Wenn ihr nun auch Lust auf Puppet bekommen habt: schnappt euch ein paar VMs, nehmt euch etwas Zeit und legt los. Ich kann euch das Buch „Learning Puppet 4“ von Jo Rhett übrigens empfehlen – es vermittelt einen ersten Überblick und dient immer wieder als Referenz. Einen gewissen „roten Faden“ musste ich mir allerdings selbst reinbringen. Im nächsten Artikel holen wir dann puppetserver aus dem Leerlauf und beginnen damit, unseren agent zu verwalten…

Alle Bilder dieser Seite: © Marianne Spiller – Alle Rechte vorbehalten
Hintergrundbild: 1440x 530px, Bild genauer anschauen – © Marianne Spiller – Alle Rechte vorbehalten

Eure Gedanken zu „Puppet 4 - Installation und Inbetriebnahme“

Ich freue mich über jeden Kommentar, es sei denn, er ist blöd. Deshalb behalte ich mir auch vor, die richtig blöden kurzerhand wieder zu löschen. Die Kommentarfunktion ist über GitHub realisiert, weshalb ihr euch zunächst dort einloggen und „utterances“ bestätigen müsst. Die Kommentare selbst werden im Issue-Tracker und mit dem Label „✨💬✨ comment“ erfasst – jeder Blogartikel ist ein eigenes Issue. Über GitHub könnt ihr eure Kommentare somit jederzeit bearbeiten oder löschen.