Fabric

Ernesto Rico Schmidt am 17. Juli 2019

Die einfache Antwort auf die Frage "Wie rollen wir die Python Web-Applikation aus?"

Spätestens dann, wenn eine Python-Applikation (z.B. mit Flask oder Django) fertig entwickelt und getestet ist, stellt sich die Frage: Wie rollen wir sie aus? Und, wie aktualisieren wir sie?

Fabric ist eine Python-Bibliothek, mit der Shell-Kommandos remote über das SSH-Protokoll ausgeführt werden können.

Es baut auf die Pakete Invoke, das Funktionen zur Ausführung von Unterprozessen und in der Kommandozeile, und Paramiko, eine Implementierung des SSH-Protokolls.

Jeff Forcier begann 2008 Fabric und Invoke zu entwickeln, um später auch die Entwicklung von Paramiko zu übernehmen.

Im Grunde erlaubt Fabric die entfernte Ausführung von Befehlen, über Secure-Shell-Verbindungen, sogar auf mehreren Rechnern.

Dafür wird nur die Installation vom Fabric auf dem Rechner notwendig, von wo die Befehle ausgehen, nicht dort, wo sie ausgeführt werden.

Zur Zeit ist die Version 2.4 aus September 2018 aktuell. Die 2.0-er Version brachte nicht nur die Stabile 1.0-er Version von Invoke, sondern auch die Kompatibilität mit Python 3 mit.

Installation

$ python3 -m venv venv
$ source venv/bin/activate
(venv) $ pip install Fabric

Ad-hoc Kommandos

Nachdem Fabric installiert ist, kann ein Ad-Hoc Kommando am entfernten Rechner ausgeführt werden.

So kann z.B. am entfernten Rechner uptime -p ausgeführt werden.

(venv) $ fab -H denklab.org -- uptime -p
up 2 weeks, 3 days, 21 hours, 55 minutes

Im Hintergrund wird eine Secure Shell Verbindung zum Host geöffnet, über Private Key authentifiziert, das Kommando ausgeführt und die Ausgabe umgeleitet.

Aktualisierung und Neustart von Django-Applikationen

Der bisherige Ablauf von der Aktualisierung und dem Neustart der Django-Applikation hinter pislea.bolivia.bo erfordert:

  1. Das Aktualisieren den Quell-Codes.
  2. Das Aktualisieren der Abhängigkeiten in der virtuellen Umgebung.
  3. Die Migration der Datenbank.
  4. Den Neustart der Applikation.

Aktualisieren des Quell-Codes

Um den Quell-Code der Applikation zu aktualisieren, wird das bereits lokal vorhandenen GitHub-Projekt aktualisiert.

@task
def pull(c):
    c.run('cd Projects/pislea2 && git pull')

Aktualisieren der Abhängigkeiten in der virtuellen Umgebung

Die Abhängigkeiten vom Projekt können sich im Laufe der Zeit verändern, wenn Sicherheitsprobleme gefunden, und behoben, werden, aber auch wenn neue Funktionalität entwickelt wird, die neue Pakete erfordert.

Wir installieren die Abhängigkeiten, die für die Produktionsumgebung definiert. Davor muss die virtuelle Umgebung aktiviert werden.

@task
def install(c):
    c.run('cd Projects/pislea2/seguimiento && source venv/bin/activate && pip install -r ../requirements/production.txt')

Migration der Datenbank

Im Laufe der Entwicklung kann sich das Datenmodell verändern. Dieser Schritt ist vorsichtig durchzuführen, vor allem im der Produktionsumgebung.

@task
def migrate(c):
    c.run('cd Projects/pislea2/seguimiento && source ./setenv && ./manage.py migrate')

Neustart der Django-Applikation

Der letzte Schritt ist der Neustart der Applikation, die mit Hilfe von systemd ausgeführt wird und sudo erfordert.

@task
def restart(c):
    c.sudo('systemctl restart seguimiento')
    c.run('systemctl status seguimiento')

Um dieses Kommando auszuführen, wird das Passwort für sudo verwendet. Mit der Option --prompt-for-sudo-password wird sicher gestellt, dass es korrekt abgefragt und weitergegeben wird.

Ausblick

Zugegeben, das ist sehr oberflächlich, wie man mit Fabric, ohne viel Aufwand, die Aktualisierung und den Neustart von einer Django-Applikation vereinfachen kann.

Es fehlt die eigentliche Konfiguration der Django-Applikation, deren virtuellen Umgebung, systemd und nginx. Aber das ist eine andere Geschichte.

Die ausführliche Dokumentation von Fabric.