Konfigurationsmanagement mit Ansible

© © Pongmanat Tasiri – 123RF

Zentral gesteuert

Beim Thema Konfigurationsmanagement denken die meisten Systemverantwortlichen an komplexe Frameworks wie Puppet, Chef, Saltstack oder CFEngine. Einfacher, aber nicht weniger effektiv, geht es jedoch mit Ansible. Dieser Open-Source-Tipp stellt das leichtgewichtige Tool vor.

Hauptaufgabe eines Konfigurationsmanagement-Systems ist es, eine zuvor definierte Zustandsbeschreibung eines Hosts umzusetzen. Hierbei kann es sich um Konfigurationsdateien mit gewissen Parametern handeln die auf einem System vorhanden sein müssen, um installierte Software Pakete oder Services die aktiv sein sollen. Klassische Tools verwenden hierfür einen Agenten der auf den Systemen läuft und für die Umsetzung der zuvor definerten Zustandsbeschreibung zuständig ist. Pull-basierte Tools, wie beispielsweise Puppet, fragen in regelmässigen Abständen ein zentrales Konfigurations-Repository ab und sorgen dafür, dass lokal vorgenomme Änderungen an dem System durch die im Konfigurations-Repository gespeicherte Zustandsbeschreibung des Hosts ersetzt werden.

Ansible ist anders. Es kommt komplett ohne Agenten aus und benötigt auf den Systemen lediglich einen SSH-Server und eine aktuelle Python-Installation. Den Zustand eines Systems beschreiben Sie einfach mit YAML-Dateien [1] , die Ansible Playbooks nennt. Vorlagen für Konfigurationsdateien basieren auf der Python-Template-Engine Jinja2 [2] . Mit Hilfe der Playbooks können Sie jedes beliebige Shell-Kommando auf einem System ausführen, beispielsweise um eine Konfigurationsdatei zu kopieren. Ansible verfügt jedoch ebenfalls über eine Vielzahl von eingebauten Modulen. Somit müssen Sie nicht zwingend die korrekte Kommandozeilen-Syntax für eine bestimmte Aktion beherrschen, sondern definieren eine Aktion einfach durch den Aufruf eines bestimmten Moduls mit den entsprechenden Parametern. Hier ein kleines Beispiel. Um sicherzustellen, dass auf einem System ein Benutzer »foo« in der Gruppe »admins« vorhanden ist, rufen Sie auf der Linux-Kommandozeile zum Beispiel den folgenden Befehl auf:

useradd -G admins foo

Mittel dem "user-Modul" von Ansible erreichen Sie das gleiche über die folgende Anweisung:

user: name=foo group=admins

Auf der Ansible-Webseite [1] finden Sie eine Übersicht sämtlicher Module. Aktuell sind hiervon über 200 Stück vorhanden. Die Bandbreite geht hier vom einfachen Benutzer-Management, über Software-Verwaltung bis hin zum Management von einzelnen Diensten. An dieser Stelle sei erwähnt, dass Ansible nicht nur Unix-artige Systeme verwaltet, sondern auch Module für Windows-Systeme existieren.

Architektur

Intern erzeugt Ansible aus den Playbooks und allen dazugehörigen Dateien sogenannte Resource Models. Hierbei handelt es sich um kleine Python-Programme, die Ansible mittels SSH auf die jeweiligen Systeme überträgt, ausführt und nach getaner Arbeit auch wieder löscht. Damit das performant auch mit einer großen Anzahl von Systemen funktioniert, greift Ansible auf die Multiplexing-Funktion der OpenSSH-Implementierung zurück. Hiermit können eine Vielzahl von Verbindungen und Anweisungen parallel ablaufen, ohne immer wieder eine neue Verbindung zu einem Host aufbauen zu müssen. Das SSH-Login auf ein entferntes System findet idealerweise mittels SSH-Keys statt. Passwörter funktionieren auch, sind aber natürlich gerade bei mehreren Systemen nicht wirklich praktikabel. Wer in seiner Umgebung auf Kerberos als Authentisierungs-Protokoll setzt, kann es auch zusammen mit Ansible verwenden.

Ansible Tools

Ansible kennt zwei unterschiedliche Tools um entfernte Systeme zu verwalten. Mittels »ansible-playbook« können Sie die zuvor angesprochenen Playbooks an das Tool übergeben und somit eine Vielzahl von Aktionen ausführen lassen. Für einen ersten Einstieg sollten Sie sich jedoch das einfachere »ansible« -Tool ansehen. Die folgenden Beispiele gehen davon aus, dass eine Authentifzierung mittels SSH-Keys bereits möglich ist. Sowohl das Tool »ansible-playbook« als auch »ansible« können eine sogenannte Inventory-Datei einlesen, in der Sie die zu verwaltenden Rechner aufführen. Listing 1 zeigt ein einfaches Beispiel für eine solche Inventory-Datei.

Listing 1

Ansible Inventory-Datei

[atomic]
192.168.100.100
192.168.100.101
[webserver]
192.168.1.110
192.168.1.111

Wollen Sie nun für einen ersten Tests alle Systeme anpingen, so rufen Sie folgendes Kommando auf:

# ansible -i inventory all -m ping

Mittels der Option »-i« geben Sie den Pfad zu Ihrer Inventory-Datei an. Das darauffolgende »all« besagt, dass Sie alle Rechner aus der Datei ansprechen wollen. Alternativ können Sie auch nur die Rechner einer bestimmten Sektion auswählen, indem Sie statt »all« den Namen der Sektion, also beipielsweise »webserver« , angeben. Schließlich legt die Option »-m« fest, dass Sie das Standardmodul »ping« verwenden möchten. Listing 2 zeigt die Ausgabe eines Pings an alle Atomic-Rechner.

Listing 2

Ansible verschickt ein Ping an alle Rechner aus der Sektion "atomic"

# ansible -i inventory atomic -m ping
192.168.100.100 | success >> {
      "changed": false,
          "ping": "pong"
}
192.168.100.101 | success >> {
      "changed": false,
          "ping": "pong"
}

Statt auf vorgertigte Module zurückzugreifen, können Sie natürlich auch beliebige Befehle an Ansible übergeben. Der folgende Aufruf würde nun beispielsweise den Benutzer "foo" anlegen und in die Gruppe "admins" aufnehmen:

# ansible -i inventory all -a "useradd -G admins foo"

Wie am Anfang der Artikels bereits erwähnt, können Sie hierfür jedoch auch das »user« -Modul verwenden. Der Befehl hierfür sieht dann folgendermaßen aus:

# ansible -i inventory all -m user -a "name=foo group=admins"
comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023