Die beiden Tools Chef und Puppet [1] sind hervorragend dazu geeignet, große Serverlandschaften zu verwalten, erfordern aber einen ziemlichen Konfigurationsaufwand. Wer regelmäßig auf mehreren Servern bestimmte Befehle ausführen möchte, sollte alternativ einen Blick auf Fabric [2] werfen, ein beeindruckendes Python-Modul, das solche Aufgaben als flexible Kochrezepte verwaltet.
Tägliche Aufgaben in Fabric-Tasks zu verwandeln, ist eine Hilfe für jeden, der mit unterschiedlichen Systemen arbeitet. Diese Tasks lassen sich mit dem Befehl »fab
«
ausführen. Ursprünglich verfügte Fabric nur über ein paar einfache Features, aber im Lauf der Jahre hat es so viele dazugewonnen, dass es in manchen Fällen Chef und Puppet bereits ersetzen kann.
Wenn schon eine SSH-Konfiguration existiert, um sich auf einem anderen Rechner einzuloggen, kann Fabric davon Gebrauch machen. Lokal funktioniert Fabric aber natürlich auch. Fabric kann einzelne Hosts in bestimmte Tasks ein- oder ausschließen, entweder direkt über ihre Namen oder über zugewiesene Rollen. Tasks kann Fabric dabei parallel oder hintereinander ausführen. Zur besseren Kontrolle zeigt Fabric auf Wunsch immer an, was es gerade macht – das hilft zum Beispiel bei der Fehlersuche. Einfache Fähigkeiten für das Management von Dateien bringt Fabric im Modul »fabric.contrib.files
«
mit. Mithilfe von »pip
«
ist Fabric einfach zu installieren:
pip install fabric
Wer Pip nicht installiert hat, kann es stattdessen mit Easy-Install versuchen:
easy_install fabric
Alternativ funktioniert normalerweise auch die Installation aus dem Quellcode ohne große Probleme.
Ruft man »fabric
«
auf, sucht das Tool im aktuellen Verzeichnis nach der Datei »fabfile.py
«
oder wandert die Verzeichnishierarchie nach oben, bis es eine solche Datei findet. Auf diese Art ist es einfach, in verschiedenen Verzeichnissen unterschiedliche Tasks zu verwalten. Mit dem Schalter »-f
«
lässt sich das Taskfile auch direkt angeben.
Ein erster einfacher Fabric-Task sieht in etwa so aus:
from fabric import * def uptime(): run(uptime)
Er führt das Uptime-Kommando auf jedem Rechner aus, der beim Aufruf auf der Kommandozeile aufgeführt wird, zum Beispiel:
fab -H localhost uptime
Eine Liste aller verfügbaren Fabric-Tasks zeigt »fab -l
«
, allerdings sind dies die sogenannten "old style" Tasks, die alle definierten Funktionen einschließen. Besser ist es, die new style Tasks zu verwenden, bei denen nur Tasks angezeigt werden, die sich auch verwenden lassen und nicht solche, die nur für interne Zwecke eingesetzt werden. Definiert man den obigen Task wie folgt neu:
def uptime(): run(uptime) @task def get_uptime(): uptime()
zeigt »fab -l
«
nur noch »get_uptime
«
an und übergeht die »uptime
«
-Funktion. Wie das Ergebnis aussieht, wenn man den Task mit zwei Hosts aufruft, zeigt das Listing 1.
Listing 1
Uptime von zwei Rechnern
01 [web1.example.com] Executing task 'get_uptime' 02 [web1.example.com] run: uptime 03 11:22 up 17 days, 12:13, 5 users, load averages: 1.03 1.88 1.32 04 [web2.example.com] Executing task 'get_uptime' 05 [web2.example.com] run: uptime 06 11:22 up 12 days, 22:11, 3 users, load averages: 1.43 1.38 1.34
Die Hosts immer wieder auf der Kommandozeile anzugeben, ist auf Dauer mühsam. Wie das nächste Beispiel zeigt, kann man sie auch direkt in einem Task definieren. Es verwendet Fabric, um eine Website basierend Git zu deployen. Weil die Hosts in der Datei definiert sind, genügt es, auf der Kommandozeile »fab deploy
«
auszuführen.
Zuerst verwendet das Skript das Python-Datetime-Modul, um einen Git-Tag-String zusammenzusetzen, welcher den Deployment-Zeitpunkt widerspiegelt.
Dieser Task soll nur einmal ausgeführt werden, dafür sorgt der Dekorator »@runs_once
«
. Der »deploy
«
-Task führt den »tag_deployment
«
-Task aus und wechselt ins Verzeichnis »/home/web
«
, um dort das Git-Kommando zu starten. Am Ende des With-Blocks wechselt das Skript automatisch wieder zurück ins vorherige Verzeichnis und startet mit »sudo
«
den Apache-Webserver neu. Abbildung 1 zeigt den Ablauf.