ADMIN

2022

04

2022-03-31T12:00:00

Automatisierung

SCHWERPUNKT

070

Automatisierung

Puppet

Orchestrierung mit Puppet Bolt

Schnell wie der Blitz

von Dr. Holger Reibold

Veröffentlicht in Ausgabe 04/2022 - SCHWERPUNKT

Mit der steigenden Komplexität von IT-Infrastrukturen geht der Wunsch nach Automatisierung der administrativen Prozesse einher. Doch viele Werkzeuge gehen in ihrer Funktionalität weit über das hinaus, was ein Admin für seine täglichen Aufgaben benötigt. Hier setzt Bolt aus dem Hause Puppet an: Die freie Software automatisiert administrative Aufgaben und beschleunigt so den Admin-Alltag.

Als Mitglied der Puppet-Produktfamilie stellt sich natürlich unmittelbar die Frage, worin sich Bolt [1] von Puppet unterscheidet. Puppet dient dazu, Ressourcen kontinuierlich zu verwalten. Es liefert dabei insbesondere das Monitoring und prüft in kurzen zeitlichen Abständen, ob die relevanten Services weiterhin verfügbar sind oder ob sich Elemente der Infrastruktur verabschiedet haben.
Grundsätzlich fokussiert Bolt Point-in-Time-Änderungen. Statt deklarative Anweisungen zu verwenden, die eine Infrastruktur definieren, geht es bei Bolt mehr darum, wann welche Befehle zur Ausführung kommen. Das Tool vereinfacht insbesondere die Ausführung beziehungsweise Orchestrierung von Aufgaben.
Sie profitieren dabei von der Möglichkeit, ein Skript über beliebige viele Netzwerkknoten wirken zu lassen. Bolt verwendet sogenannte Pläne, die die Ausführungsdetails bündeln. Dabei steht insbesondere die Fehlerbehandlung im Fokus, aber mit vergleichsweise einfachen Skripten lassen sich auch komplexe Aufgaben bewältigen.
Als Mitglied der Puppet-Produktfamilie stellt sich natürlich unmittelbar die Frage, worin sich Bolt [1] von Puppet unterscheidet. Puppet dient dazu, Ressourcen kontinuierlich zu verwalten. Es liefert dabei insbesondere das Monitoring und prüft in kurzen zeitlichen Abständen, ob die relevanten Services weiterhin verfügbar sind oder ob sich Elemente der Infrastruktur verabschiedet haben.
Grundsätzlich fokussiert Bolt Point-in-Time-Änderungen. Statt deklarative Anweisungen zu verwenden, die eine Infrastruktur definieren, geht es bei Bolt mehr darum, wann welche Befehle zur Ausführung kommen. Das Tool vereinfacht insbesondere die Ausführung beziehungsweise Orchestrierung von Aufgaben.
Sie profitieren dabei von der Möglichkeit, ein Skript über beliebige viele Netzwerkknoten wirken zu lassen. Bolt verwendet sogenannte Pläne, die die Ausführungsdetails bündeln. Dabei steht insbesondere die Fehlerbehandlung im Fokus, aber mit vergleichsweise einfachen Skripten lassen sich auch komplexe Aufgaben bewältigen.
Bolt im Überblick
Herzstück von Bolt ist das Task-Runner- und Orchestrierungstool, mit dem Sie Ad-hoc-Befehle und -Skripte in der Infrastruktur ausführen. Bolt erlaubt das Patchen und Aktualisieren von Systemen und Services, die Fehlerbehebung auf Servern, die Bereitstellungen von Anwendungen sowie das Starten und Stoppen von Diensten. Bolt läuft auf einer Standard-Workstation (Linux, Windows oder macOS) und für die Verbindung zum Remote-Knoten kommen SSH, SCP oder WinRM sowie gängige Authentifizierungsmethoden (Passwort, Public Key) zum Einsatz. Laut Angaben der Entwickler ist eine Skalierung auf mehr als 1000 gleichzeitige Verbindungen möglich.
Bolt verwendet YAML-Dateien oder die eigene Orchestrierungssprache "Plans". In den Skripten kommen insbesondere if-Anweisungen für eine konkrete Fehlerbehandlung zum Einsatz. Administratoren, die bereits mit YAML-Dateien vertraut sind, können ihre Aufgaben in diesem bestimmten Format generieren und anschließend das integrierte Tool von Bolt verwenden, um YAML-Dateien in Bolt-Pläne zu konvertieren.
Admins profitieren dabei von verschiedenen Besonderheiten: Bolt verfügt über vorgefertigte Skripts, die Sie nur noch an die spezifischen Aufgabenstellungen anpassen müssen, erlaubt die Verwendung bestehender Automatisierungsskripte und bietet Python-, Ruby- sowie PowerShell-Unterstützung. Während viele Orchestrierungswerkzeuge auf Agenten setzen, erlaubt Bolt auch den agentenlosen Einsatz oder die Kombination beider Konzepte. Außerdem bietet Bolt Bash-Unterstützung und eine Workflow-Orchestrierung.
Installation und Setup von Puppet
Bolt läuft auf allen gängigen Betriebssystemen, neben einem Linux-basierten Rechner können Sie das Orchestrierungswerkzeug auch auf einer macOS- oder einer Windows-Workstation einsetzten. Um Bolt unter Debian zu installieren, sind nur wenige Befehle notwendig:
wget https://apt.puppet.com/puppet-tools-release-bullseye.deb
 
sudo dpkg -i puppet-tools-release-bullseye.deb
 
sudo apt-get update
 
sudo apt-get install puppet-bolt
Um Bolt auf einem macOS-System auszuführen, benötigen Sie zunächst eine Homebrew-Installation [2]. Dabei handelt es sich um eine quelloffene Paketverwaltung für macOS. Zur Installation von Homebrew führen Sie im macOS-Terminal folgenden Befehl aus:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Mit dem Befehl tap brew weisen Sie Homebrew an, weitere Repositiories zu verwenden. Standardmäßig geht der "tap"-Befehl davon aus, dass Sie auf Quellen der GitHub-Repositories zugreifen. Daher müssen Sie Homebrew für die Verwendung der Puppet-Quellen mit brew tap puppetlabs/puppet vorbereiten. Zur Installation von Bolt führen Sie anschließend folgenden Befehl aus:
brew install --cask puppet-bolt
Alternativ können Sie auch den macOS-Installer verwenden und die DMG-Datei von der Bolt-Projektsite verwenden.
Um Bolt unter Windows einzusetzen, benötigen Sie Chocolatey [3]. Auch hierbei handelt es sich um einen Paketmanager, der typische Funktionen wie das Herunterladen und Installieren von Applikationen übernimmt. Zur Installation der Bolt-Pakete führen Sie folgenden Befehl aus:
choco install puppet-bolt
Als Nächstes steht über refreshenv ein Refresh der Umgebung an. Weiterhin benötigen Sie die Bolt-PowerShell-Module, die Sie einfach via Install-Module PuppetBolt einspielen. Dann führen Sie ein Bolt-Cmdlet aus. Im Idealfall erhalten Sie keine Fehlermeldung. Falls doch, müssen Sie weitere Bolt-Module zur PowerShell hinzufügen oder die Ausführungsbeschränkungen bearbeiten. Damit ist Bolt grundsätzlich unter dem präferierten Betriebssystem einsatzbereit.
Aufgabenspezifische Konfiguration
Bolt bietet Ihnen vielfältige Anpassungsmöglichkeiten für die systemweite und die projektspezifische Konfiguration. Dabei lassen sich vier Kategorien unterscheiden:
- Bolt-Verhalten: Sie können das allgemeine Verhalten von Bolt anpassen. Konkret wählen Sie beispielsweise das Format für die Anzeige der Ausgabe. Sie sind auch in der Lage, die Anzahl der Threads für den Verbindungsaufbau zu den Zielen festzulegen.
- Projekte: Mit den projektspezifischen Einstellungen definieren Sie, wie mit konkreten Orchestrierungsaufgaben umzugehen ist. Dazu gehören beispielsweise die Konfiguration des Pfades zu einer Inventardatei oder zu einer Hiera-Konfigurationsdatei (Hiera ist eine Key-/Value-Datenbank für Konfigurationsdaten).
- Protokolle: Mit den protokollspezifischen Einstellungen bestimmen Sie die verwendeten Transportprotokolle. Hier können Sie beispielsweise den Pfad zum privaten SSH-Schlüssel oder den Port für die WinRM-Verbindung anpassen.
- Inventardaten: Schließlich können Sie die Ziele gruppieren und diesen eigene Konfigurationen zuweisen.
Sie konfigurieren die Bolt-Optionen und -Funktionen auf Projekt-, Benutzer- oder Systemebene. Auf Projektebene legen Sie die Bolt-Konfiguration in den Dateien "bolt-project.yaml" und "inventory.yaml" fest.
Die Anpassungen auf Benutzer- und Systemebene bestimmen Sie in "bolt-defaults.yaml". Verlangt der konkrete Anwendungsfall keine benutzerspezifischen oder systemweiten Konfigurationen, empfiehlt sich die Konfiguration auf Projektebene.
Bolt-Verzeichnis richtig anlegen
Die Arbeit mit Bolt beginnt mit dem Erzeugen eines Bolt-Projekts und der Einrichtung der Ziele. Ein Bolt-Projekt ist ein Verzeichnis, das die projektweiten Konfigurationseinstellungen umfasst. Im ersten Schritt erstellen Sie also das Projektverzeichnis mit mkdir erstes_bolt_projekt. Um das Verzeichnis "erstes_bolt_projekt" in ein Bolt-Projekt umzuwandeln, ist folgender Befehl erforderlich:
bolt project init <erstes_bolt_Project>
Bolt verlangt eine bestimmte Verzeichnisstruktur für die Projekte – nur dann funktionieren die Bolt-Pläne und -Aufgaben. Dabei ist die Verzeichnisstruktur eines Bolt-Projekts eng mit Puppet-Modulen verknüpft. Wenn Sie beispielsweise eine Apache-Installation auf einem Remote-System planen, müssen Sie ein Apache-Modulverzeichnis anlegen.
Bleiben wir bei diesem Beispiel, müssen wir ein Modulverzeichnis samt Apache-Unterverzeichnis generieren. Dazu wechseln Sie in das Projektverzeichnis und legen zwei Verzeichnisse an – jeweils eines für die Projektdateien und eines für die Pläne:
cd <erstes_bolt_project>
 
mkdir -p module/apache/plans
 
mkdir -p module/apache/files
Die Verzeichnisstruktur des Ordners "erstes_bolt_project" sieht wie folgt aus:
├── bolt-project.yaml
└── module
            └─ apache
                  ├ files
                  └ plans
Ziele definieren
Die nächsten Schritte dienen der Zieldefinition. Im Folgenden gehen wir davon aus, dass Sie einen Apache-Webserver auf einer Docker-Installation und dort typische Aktionen ausführen wollen. Die Verbindungsaufnahme zwischen der Bolt-Installation und den Remote-Systemen erfolgt entweder per SSH oder WinRM. In der Regel ist SSH die bessere Wahl. Zur Ansprache einer Docker-Installation generieren Sie im Wurzelverzeichnis der Bolt-Projekte eine Datei mit der Bezeichnung "Dockerfile" und weisen Sie dieser folgende Kommandos zu:
from rastasheep/ubuntu-sshd
 
run apt-get update && apt-get -y install libssl-dev
 
expose 80
 
cmd ["/usr/sbin/sshd", "-d"]
Die Datei "Dockerfile" definiert einen Ubuntu-Container samt SSH-Dienst, der für die Ansprache notwendig ist. Der nächste Schritt dient dem Erstellen der Datei "docker-compose.yaml", die zwei Container-Instanzen generiert. Dazu legen Sie in Ihrem Projektverzeichnis die Datei "docker-compose.yaml" an und weisen dieser folgende Einstellungen zu:
version: '3'
services:
      target1:
           build: .
           ports:
               - '3000:80'
                - '2000:22'
           container_name: target1
      target2:
           build: .
           ports:
               - '3001:80'
                - '2001:22'
           container_name: target2
Mit der Compose-Datei erzeugen Sie mithilfe von Dockerfile zwei Container, die die Bezeichnungen "target1" und "target2" tragen. Die SSH-Verbindungen werden an Port 2000 beziehungsweise 2001, die HTTP-Verbindungen an die Ports 3000 und 3001 gerichtet. Um die Docker-Container zu erzeugen und auszuführen, verwenden Sie folgenden Befehl:
docker-compose up -d --build
Um sicherzustellen, dass die beiden Container ausgeführt werden, nutzen Sie docker-compose ps. Die folgende Bildschirm-ausgabe sollte Ihnen anzeigen, dass die Docker-Container einsatzbereit sind. Damit können Sie sich der Ausführung von Befehlen an den Containern widmen.
Befehle auf den Zielen ausführen
Bevor Sie mit der Ausführung umfangreicher Pläne beginnen, sollten Sie verschiedene Befehle auf einem Ziel ausführen – auch, um sich mit den Bolt-Spezifika vertraut zu machen. Die allgemeine Syntax für die Befehlsausführung lautet wie folgt:
bolt command run <Befehl> --targets <Zielname> <Optionen>
Also führen Sie den Befehl "whoami" auf Ziel 1 so aus:
bolt command run whoami -t 127.0.0.1:2000 -u root -p root --no-host-key-check
Dieses Kommando zielt auf das System mit der IP-Adresse "127.0.0.1" und dem Port 2000, über den SSH ansprechbar ist. Außerdem übermitteln Sie Benutzername und Passwort, damit der Zugriff auf das System möglich ist. Die Option "--no-host-key-check" deaktiviert die Zertifikatauthentifizierung. Die typische Ausgabe zum obigen Kommando lautet wie folgt:
Started on 127.0.0.1:2000...
Finished on 127.0.0.1:2000:
      STDOUT:
          root
Successful on 1 target: 127.0.0.1:2000
Ran on 1 target in 0.3 sec
Damit haben Sie den ersten Bolt-Befehl erfolgreich an ein Zielsystem gerichtet. Doch üblicherweise wollen Sie nicht nur ein System, sondern eine ganze Gruppe ansprechen. Hierfür verwendet Bolt die Inventardatei, in der Sie beliebige Systeme gruppieren.
Bolt-Pläne einsetzen
Pläne erlauben Ihnen die Verknüpfung von Befehlen, Skripten und Aufgaben, aus deren Kombination sich leistungsfähige Workflows ergeben. Grundsätzlich können Sie für die Pläne die Puppet-eigene Sprache oder YAML verwenden.
Unser nächstes Beispiel installiert einen Apache-Webserver auf den zuvor angelegten Docker-Zielen, sorgt für das Starten der Apache-Services und führt den Upload einer simplen Homepage durch. Dazu ist zunächst eine Installationsanweisung für den Apache-Webserver notwendig. Erzeugen Sie im Apache-Unterverzeichnis das "Plans"-Verzeichnis und das Installationsskript "install.yaml":
parameters:
      targets:
           type: TargetSpec
steps:
      - name: install_apache
        task: package
        targets: $targets
        parameters:
           action: install
           name: apache2
        description: "Installiert Apache"
Mit dem ersten Abschnitt des Bolt-Plans definieren Sie die Parameter, die Ihr Plan akzeptiert. Im Beispiel ist dies lediglich der Typ "TargetSpec", mit dem Sie mehrere Ziele an einen Plan übergeben. Damit die in dem Plan spezifizierten Parameter verwendet werden, müssen Sie bei der Ausführung in der Konsole die Option "--targets" mitgeben.
Mit dem Abschnitt "steps" spezifizieren Sie den Hauptteil eines Plans. Im Beispiel trägt dieser die Bezeichnung "install_apache". Dabei kommt die Bolt-Task "package" zum Einsatz, um Apache auf den Zielsystemen zu installieren. Bolt macht großzügigen Gebrauch von diesen vordefinierten Task-Konfigurationen, darin sind insbesondere wiederverwendete Aufgaben definiert. Weiterhin werden im Plan die durchzuführenden Aktionen (Installation) und die Bezeichnung des Pakets definiert. Wichtig ist außerdem, dass die Datei "install.yaml" im Unterverzeichnis "plans" liegt. Um den Plan in einer Container-Gruppe auszuführen, verwenden Sie:
bolt plan run apache::install -t containers
Hier gibt es eine Besonderheit: Die Planbezeichnung ist durch zwei Segmente gekennzeichnet, die durch einen doppelten Doppelpunkt getrennt sind. Das erste Segment spezifiziert den Modulnamen, in dem sich der Plan befindet, das zweite Segment die Plandatei, allerdings ohne die Dateierweiterung. Im vorliegenden Beispiel liegt der Plan im Apache-Modulverzeichnis und trägt die Bezeichnung "install.yaml". Die Bezeichnung des Plans lautet somit "apache::install".
Auf der Konsolenebene können Sie die Planausführung verfolgen. Eine typische Ausgabe sieht wie folgt aus:
Starting: plan apache::install
 
Starting: task package on target1, target2
 
Finished: task package with 0 failures in 18.00 sec
 
Finished: plan apache::install in 20.00 sec
 
Plan completed successfully with no result
In der Praxis ist es hilfreich, wenn Sie die Apache-Installation auf Ihren Zielsystemen aus Bolt heraus starten können. Auch hierfür bietet die Orchestrierungssoftware die geeignete Lösung. Dazu legen Sie zunächst eine Skriptdatei an, in der Sie die spezifischen Startparameter für den Apache-Startprozess hinterlegen. Dieses Skript, dem Sie beispielsweise die Bezeichnung "start_apache.sh" zuweisen, legen Sie im Unterverzeichnis "files" des Apache-Modulverzeichnisses ab. Als Nächstes erweitern Sie die "install.yaml"-Datei um folgenden Block:
- name: start_apache
    script: apache/start_apache.sh
    targets: $targets
    description: "Start von Apache-Services"
Bei der nächsten Planausführung starten dann auch die Apache-Installationen. Damit ist grundsätzlich ein Zugriff auf die verschiedenen Apache-Webserver möglich. Beachten müssen Sie dabei, dass Bolt dem ersten Ziel den Port 3000 zuweist, dem zweiten den Port 3001 et cetera. In vorliegendem Beispiel ist die Standard-Homepage somit unter "127.0.0.1: 3000" für das erste Ziel erreichbar.
Um auf den verschiedenen Apache-Installationen eigene HTML-Seiten abzulegen, erzeugen Sie eine einfache HTML-Datei, bezeichnen diese mit "index.html" und legen sie im Verzeichnis "/apache/
files" der Plankonfiguration ab. Bevor Sie den Upload vornehmen können, müssen Sie zunächst in der Parameterkonfiguration einen "scr"-Parameter von Typ "String" anlegen. Die erweiterte Konfiguration sieht dann wie folgt aus:
parameters:
      targets:
                type: TargetSpec
        src:
                type: String
Den "steps"-Abschnitt erweitern Sie um folgenden Code-Block:
- name: upload_homepage
    upload: $src
    destination: /var/www/html/index.html
    targets: $targets
    description: "Upload der Homepage"
Nach der erneuten Planausführung sollte Ihnen beim Zugriff auf die URL "127. 0.0.1:3000" die Apache-Installation die neue Homepage präsentieren.
GUI nur gegen Geld
Die Steuerung von Bolt erfolgt vollständig auf der Konsole, doch das dürfte die wenigsten Administratoren wirklich stören. Falls doch, liefert das kostenpflichtige Puppet Enterprise ein komfortables Webinterface. Diese Lizenz ist auch für große Organisationen, die integrierte Governance, Flexibilität und teamorientierte Workflows benötigen, eine Überlegung wert. Damit ist zudem die Skalierung der Automatisierung samt Monitoring möglich – mit und ohne Agenten.
Bolt für Fortgeschrittene
Ein wesentliches Merkmal von Bolt sind die Module, die Pläne und Aufgaben bündeln, um sie einfach in typische Arbeitsabläufe zu integrieren. Ein weiterer Vorteil: Sie können die Module mit Dritten teilen und so beispielsweise die identischen Aktionen in externen Netzwerken ausführen. Allerdings ist beim Umgang mit diesen Elementen zu beachten, dass die Funktionalität von Modulen häufig von weiteren Modulen abhängt. Bei der Installation eines Moduls über die Bolt-Konsole verwaltet Bolt diese Abhängigkeiten automatisch für Sie. Dazu wird das Modul der Projektkonfigurationsdatei ("bolt-project.yaml") unter einem "module"-Schlüssel hinzugefügt.
Im nächsten Schritt löst Bolt die Module und ihre Abhängigkeiten auf und generiert ein Puppetfile. Diese Datei sollten Sie nicht verändern. Abschließend installiert Bolt die Module und Abhängigkeiten im Modulverzeichnis ("module-dir"), das Sie im Bolt-Projektverzeichnis (".modules") finden.
Die Orchestrierung vereinfacht sich außerdem durch die Verwendung von Plug-ins. Diese erlauben das dynamische Laden und Verändern von Informationen während einer Bolt-Ausführung und damit die gezielte Steuerung von Bolt-Aktionen. Sie können drei verschiedene Plug-in-Typen verwenden:
- Referenz-Plug-ins: Dienen dem Abruf von Daten aus einer externen Quelle, um diese in einem statischen Datenobjekt zu speichern.
- Secret Plug-ins: Diese Erweiterungen liefern Ver- und Entschlüsselung.
- Puppet-Bibliotheks-Plug-ins: Kommen bei der Installation von Puppet-Bibliotheken zum Einsatz, wenn der zugehörige Plan die Funktion "apply_prep" nutzt.
Die konkrete Ausführung der Plug-ins steuern Sie über Einträge in den Bolt-Konfigurationsdateien.
Fazit
Mit Puppet Bolt steht Administratoren ein hervorragendes Werkzeug für die Orchestrierung typischer administrativer Aufgaben zur Verfügung. Seine Stärken liegen in der Einfachheit, der Flexibilität und dem Verzicht auf Agenten. Für Administratoren, die auf ein komfortables Webinterface zu Gunsten einer leistungsfähigen Umgebung verzichten können, ist Bolt ein spannendes Tool. Ist Ersteres doch ein Thema, finden Sie im Kasten "GUI nur gegen Geld" die zentralen Aspekte der lizenzpflichtigen Bolt-Variante.
(jp)
Link-Codes
[2] Homebrew-Paketmanager: https://brew.sh/
[3] Chocolatey-Paketmanager: https://docs.chocolatey.org/en-us/