Serververwaltung mit Python und Fabric

© Rusty-Elliott, 123RF

Patchwork

Fabric macht es einfach, auf einer Vielzahl von Servern sich wiederholende Tasks auszuführen. Voraussetzung dafür sind nur Python und eine funktionierende SSH-Konfiguration.
Obwohl Linux als freie Software kostenlos verfügbar ist, setzen viele beim Unternehmenseinsatz auf Enterprise-Distributionen mit Support. Wo die Stärken der ... (mehr)

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.

Setzt auf SSH

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

Hosts in der Datei

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.

Abbildung 1: Deployment einer Webanwendung mithilfe von Fabric.

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Loadtests ohne Server

Für Loadtests der eigenen Server bietet sich die Cloud an, denn kurz getaktet lassen sich dort viele Rechnerinstanzen starten, die das eigene Budget nur wenig belasten. Noch flexibler, günstiger und besser skalierbar sind Tests mit einer Serverless-Infrastruktur wie AWS Lambda. Wir führen vor, wie Sie dort mit Serverless Artillery eigene Loadtests starten. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Container

Wie setzen Sie Container ein?

  • Gar nicht
  • Docker standalone
  • Docker mit Kubernetes
  • Docker mit Swarm
  • Docker mit anderem Management
  • LXC/LXD
  • Rocket
  • CRI-O auf Kubernetes
  • Container auf vSphere
  • Andere (siehe Kommentare auf der Ergebnisseite)

Google+

Ausgabe /2018