Konfigurationsmanagement mit SaltStack

Abstract

Aufgabe des Configuration Managements ist es, den Administrator bei der Konfiguration der IT-Infrastruktur zu unterstützen und Abläufe zu vereinheitlichen. Beim imperativen Ansatz werden Befehle auf den Zielsystemen direkt ausgeführt. Dagegen definiert der Admin beim deklarativen Ansatz gewünschte Zustände, für deren Umsetzung das System zuständig ist.

Was ist SaltStack?

SaltStack ist ein junger Vertreter der Softwaregattung Configuration Management System. Prominente Vertreter dieser Sparte sind Puppet, Chef oder CFengine. Aufgabe eines Configuration Managements Systems (CMS) ist es, den Administrator bei der Konfiguration der IT-Infrastruktur zu unterstützen und Abläufe zu vereinheitlichen.

Die Verwendung eines CMS bringt zwei große Vorteile:

  • Einmal definierte Aufgaben können beliebig oft und auf beliebig vielen Systemen ausgeführt werden.
  • Alle betreuten Systeme garantieren einen definierten Zustand, letztlich lassen sich damit Standards in der IT umsetzen.

Dabei sind zwei grundsätzliche Ansätze denkbar:

Imperativer Ansatz
Auf den Zielsystemen werden Befehle direkt ausgeführt.
Deklarativer Ansatz
Für das Zielsystem wird ein gewünschter Zustand definiert.

Der erste Ansatz ist schnell und einfach umgesetzt. Er setzt jedoch voraus, dass der Administrator die Zielplattform gut kennt. Unterscheiden sich die zu betreuenden Systeme voneinander, müssen die Befehle für jedes System angepasst werden. In größeren Umgebungen ist dieser Ansatz daher wenig effizient und erfordert vom Administrator weitgehende Kenntnisse der Zielplattformen.

Der zweite Ansatz ist deutlich effizienter. Für die zu betreuenden Systeme werden die gewünschten Zustände in einer Metasprache definiert. Die betreuten Systeme kümmern sich dann selbst um die Umsetzung. Das entbindet den Administrator davon, jedes Zielsystem im Detail kennen zu müssen, erfordert jedoch das Erlernen einer Metasprache, um die gewünschten Zustände beschreiben zu können.

Erklärtes Ziel von SaltStack ist es, einfach in der Anwendung zu sein. SaltStack verwendet YAML für die Zustandsbeschreibung der Zielsysteme. Weitere Formate sind aber möglich. YAML hat eine sehr einfache Syntax. SaltStack erfordert keine besonderen Vorkenntnisse, erste Erfahrungen mit Python sind jedoch von Vorteil. Alle Beispiele habe ich auf Ubuntu 12.4 LTS getestet.

Die Installation

Für die Installation von SaltStack reicht ein einfaches:

wget -O - http://bootstrap.saltstack.org | sudo sh

Damit werden der SaltStack-Server (also der Master) und der SaltStack-Client (im Jargon "Minion" genannt) installiert. Möglich ist es auch, die Installation auf einem entfernten Rechner mit Fabric durchzuführen:

fab --user=sys4inst -H salt.sys4.de -- "wget -O - http://bootstrap.saltstack.org | sudo sh"

Ich habe das auf einer frischen Ubuntu-12.04-Installation direkt von meinem Administrationsrechner angestoßen. fab stammt aus dem Python Tool Fabric, mit dem sich Kommandos remote ausführen lassen. Somit lässt sich SaltStack installieren, ohne das Zielsystem auch nur einmal angefasst zu haben.

Der Minion (Client) sucht jetzt seinen Master (Server), den er im DNS unter dem Namen salt.sys4.de sucht. Ist der Master gefunden, schickt der Minion dem Master seinen Public Key, der vom Master in seinen Schlüsselbund aufgenommen werden muss.

Eine Übersicht über die Schlüssel, die der Master gerade kennt, gibt der Befehl:

salt-key -L

Accepted Keys:
host1.sys4.de
host2.sys4.de
Unaccepted Keys:
host3.sys4.de
Rejected Keys:

host3 hat zwar seinen Schlüssel geschickt, der Administrator hat diesen aber noch nicht bestätigt. Er kann das für alle Schlüssel mit dem Befehl

salt -A

nachholen. Für einen speziellen Schlüssel gilt der Befehl:

salt -a host3.sys4.de

Arbeitsweise

Um auf einzelnen Minions Aktionen durchzuführen, können diese Clients auf vielfältige Weise adressiert werden. Aufzählungen und Listen beherrschen GLOBs und RegEx.

salt '*.sys4.de' test.ping

Der Befehl zeigt zu allen Systemen des Netzes sys4.de an, ob diese erreichbar sind. SaltStack verfügt über ein System, mit dem verzweigte Informationen auf dem zugrunde liegenden System gesammelt werden können.

Daher können Systeme auch über ihre Eigenschaften, die sogenannten Grains, angesprochen werden:

salt -G 'os:debian' cmd.run 'uname -r'

Hier wird auf allen Systemen, auf denen Debian installiert ist, der Befehl uname ausgeführt. Die einzelnen Eigenschaften der Minions lassen sich mit

salt '*' grains.ls

ermitteln. Möchte man auch deren Werte sehen, reicht ein

salt '*' grains.items

Auf den Minions lassen sich Aktionen über direkte Befehle oder über Funktionsaufrufen von Modulen auslösen. Module existieren, um spezielle Aufgaben durchzuführen. So gibt es zum Beispiel ein Modul, um PostgreSQL-Datenbanken zu administrieren. Damit lassen sich dann Datenbanken und Benutzer anlegen. Mittlerweile gibt es über 150 Module für die unterschiedlichsten Zwecke.

Ein paar technische Details

SaltStack verwendet für die Kommunikation mit ZeroMQ eine aktuelle Netzwerkbibliothek mit erweiterten Fähigkeiten. Die Kommunikation läuft nach dem Publish-Subscribe-Verfahren ab. Dabei werden vom Publisher Daten veröffentlicht, die von den Subscribern eingesammelt werden. Aufgaben lassen sich auf den unterschiedlichen Minions parallel oder sequentiell bearbeiten. Der Master verteilt an die Minions Dateien, in denen ein gewünschter Zustand beschrieben wird. Die Minions versuchen anschließend, diesen Zustand zu erreichen.

Dafür benötigen die Minions keine permanente Verbindung zum Master. Jeder Minion kann seine eigenen States lokal speichern und damit auch ohne Verbindung zum Master laufen. Große Umgebungen lassen sich über eine Hierarchie beherrschen. Dabei gibt ein Master untergeordneten Mastern Anweisungen weiter. Diese reichen sie dann weiter. Die einzelnen Anweisungen werden in Dateien verpackt und verschlüsselt an die nachgeordneten Systeme übergeben. Die gesamte Kommunikation läuft verschlüsselt ab.

Der nächste Teil widmet sich der praktischen Arbeit mit SaltStack. Darin zeige ich, wie sich in SaltStack Zustände definieren lassen und wie eine YAML-Datei funktioniert.

Jörg Zimmermann, 05. October 2013