Neulich hatte ich übrigens die Gelegenheit, einen Freund meinen Beitrag sehen zu lassen. "Kimoi, das Bild ist ekelhaft. Wirklich ekelhaft? Hat jemals jemand darauf hingewiesen?" Ich habe einen hochgelobten Kommentar erhalten.
Stoff ist ein einfaches und sehr leistungsfähiges Werkzeug.
Es ist jedoch auch ein gefährliches Werkzeug, je nachdem, wie es verwendet wird. Sie müssen sehr vorsichtig sein, besonders wenn es von einem menschlichen Abfall wie mir verwendet wird.
Möchte ich heute etwas Seltsames in der Produktionsumgebung bereitstellen? Seltsame Leute (Chefs und andere) beobachten, wie die Handtaschen ruckeln.
Du musst vorsichtig sein.
Egal wie vorsichtig Sie sind, es tritt ein Fehler auf. Daher müssen Sie eine ordnungsgemäße Fehlerbehandlung durchführen, um verschiedene Dinge nicht zu beschädigen. Wenn Sie irgendwo nach dem Bearbeiten der Einstellungsdatei eine Fehlermeldung erhalten Der Daemon wurde nie wieder gestartet, da ich nur die Datei geändert habe. Sie müssen zurückrollen, damit es nicht passiert.
Dann kehren sie in ihren ursprünglichen Zustand zurück und gehen, als wäre nichts passiert. Es ist, als ob ein Mensch wie ich von Anfang an nicht existiert hätte.
Das irrelevante Vorwort ist das schlechteste lange, aber es ist ein Stoff-Rollback-Ansatz.
Die Grundlagen der Rollback-Verarbeitung, wenn ein Fehler in Fabric auftritt, bestehen darin, ihn in "env.warn_only = True" zu verpacken. Versuchen Sie, nicht plötzlich abzubrechen. Wenn ein Fehler auftritt, rollen Sie vorsichtig zurück. Das ist der eine.
with settings(warn_only=True):
backup_important_file()
run('sed -e "s/foo/bar/g" important_file > tmp_file')
run('mv tmp_file important_file')
result = do_something_bad()
if result.return_code != 0:
# Rollbacking…
restore_important_file()
Es gibt jedoch häufig mehrere Aufgaben, die von Fabric ausgeführt werden.
Wenn die für jeden Aufgabenfehler erforderliche Rollback-Verarbeitung häufig ist, Wenn Sie es gehorsam implementieren, sieht es zum Beispiel so aus.
env.warn_only=True
def task1():
result = run('run command1')
if result.return_code != 0:
rollback()
def task2():
result = run('run command2')
if result.return_code != 0:
rollback()
def task3():
result = run('run command3')
if result.return_code != 0:
rollback()
def rollback():
# Rollbacking...
restore_everything()
@task
def do_it():
task1()
task2()
task3()
Dies ist oft ausreichend, aber eine etwas klarere Methode ist möglich.
Durch Vorbereiten einer Wrapper-Funktion und Verwenden des Kontextmanagers Es ist möglich, die Rollback-Verarbeitung mehrerer Aufgaben zu kombinieren.
Wenn der Rollback-Prozess mehreren Aufgaben gemeinsam ist, Das ist sauberer.
env.warn_only=False
def task1():
run('run command1')
def task2():
run('run command2')
def task3():
run('run command3')
def rollback():
# Rollbacking...
restore_everything()
@contextmanager
def rollbackwrap():
try:
yield
except SystemExit:
rollback()
abort("Error has occurred while running task!")
@task
def do_it():
with rollbackwrap():
task1()
task2()
task3()
task4()
Wo Sie Fehler individuell behandeln möchten
with settings(warn_only=True):
Es wäre gut zu benutzen.
Ich habe sehr viel auf die folgenden Artikel verwiesen. http://awaseroot.wordpress.com/2012/06/05/fabric-wrappers-and-more-error-handling/