In größeren Umgebungen sind oft eine ganze Reihe von Servern für bestimmte Aufgaben zuständig. Mit den von Fabric angebotenen Rollen lassen sie sich zusammenfassen und in eigenen Skripts verwenden. Dazu dient die Variable
»roledefs
«
:
env.hosts = ['www1', 'www2'] env.roledefs = { 'web': ['www1', 'www2'] }
Um einen Task nur für bestimmte Rollen auszuführen, gibt man ihn auf der Kommmandozeile hinter dem Schalter
»-R
«
an.
Ein etwas komplizierteres Beispiel legt eine Django-basierte Webanwendung zugrunde, bei der typischerweise während der Entwicklung die Datenbank mit sogenannten Migrations regelmäßig zu aktualisieren ist ( Listing 2 ). Der dazu gehörige Fabric-Task aktualisiert also erst die notwendigen Python-Pakete, installiert den Code auf allen beteiligten Rechnern und führt die Datenbankoperationen einmalig auf dem Datenbank-Server aus. List 3 zeigt das Skript dafür.
Listing 2
Migration einer Django-Datenbank
01 def get_code(): 02 with cd("/home/web"): 03 run("git pull -t origin master") 04 05 def update_pip(): 06 run("pip install -U -r /home/web/requirements.txt") 07 08 @task 09 @runs_once 10 @roles('db') 11 def update_tables(): 12 # Create new tables 13 run('./manage.py syncdb') 14 # Migrate existing tables and data 15 run('./manage.py migrate') 16 17 @task 18 @roles('web') 19 def restart_apache(): 20 sudo("/etc/init.d/apache2 restart") 21 22 @task 23 def deploy(): 24 get_code() 25 update_pip() 26 execute('update_tables') 27 execute('restart_apache')
Der mit
»fab deploy
«
gestartete
»deploy
«
-Task führt zuerst auf allen Rechnern
»git pull
«
im Verzeichnis
»/home/web
«
aus. Auch die in der Datei
»/home/web/requirements.txt
«
aufgeführen Python-Pakete werden auf allen Rechnern aktualisiert. Der Sub-Task
»update_tables
«
läuft dagegen nur einmal (
»@runs_once
«
) und nur auf dem Datenbank-Server (
»@roles('db')
«
) ab. Analog wird der Apache-Servern auf allen Rechnern der
»web
«
-Rolle neu gestartet.