Heim > Artikel > Backend-Entwicklung > Python Fabric implementiert Beispiele für Remote-Betrieb und -Bereitstellung
In letzter Zeit habe ich immer mehr Dinge übernommen. Die Freigabe-, Betriebs- und Wartungsarbeiten sind ziemlich mechanisch und die Häufigkeit ist ziemlich hoch, was zu Zeitverschwendung führt, aber viele Vorteile hat. Fehler beheben, testen, Repository übermitteln (2 Minuten), SSH zur Testumgebung für Pull-Bereitstellung (2 Minuten), Rsync zu den Online-Maschinen A, B, C, D, E (1 Minute), SSH zu ABCDE5 bzw. jeder Maschine wird nacheinander neu gestartet (8-10 Minuten) = 13-15 Minuten. Das Frustrierende ist, dass jeder Vorgang derselbe ist und der Befehl derselbe ist. Das Schreckliche ist, dass es auf mehreren Computern schwierig ist Die meiste Zeit wurde mit SSH, dem Eingeben von Befehlen und dem Schreiben in Skripts verschwendet, die mit einem Klick ausgeführt werden konnten. Es dauerte zwei Minuten, bis ich die Ausführungsergebnisse betrachtete entdeckte, dass Fabric Befehle für die automatisierte Bereitstellung oder den Betrieb auf mehreren Maschinen konsolidieren kann. Der Hauptgrund für die Verwendung ist, dass es einfach, benutzerfreundlich und leicht zu starten ist Natürlich können Sie auch verschiedene Shell-Befehle kombinieren. Der Unterschied zwischen antiken Artefakten und modernen Waffen
Umgebungskonfiguration
Installieren Sie das entsprechende Paket auf dem lokalen Computer und dem Zielcomputer (beachten Sie, dass beide erforderlich sind). )
sudo easy_install fabric
Es ist derzeit Version 1.6 (oder verwenden Sie pip install, dasselbe )
Nach der Installation können Sie überprüfen, ob die Installation erfolgreich war
Nach der Installation können Sie die offizielle Dokumentation durchsuchen[ken@~$] which fab /usr/local/bin/fab
Dann können Sie beginnen
Hallo Welt
Führen Sie zunächst einfache Vorgänge auf dieser Maschine aus und verschaffen Sie sich ein vorläufiges Verständnis. Die Quelle des Beispiels stammt von der offiziellen Website
Erstellen Sie ein neues Py-Skript: fabfile.py
def hello(): print("Hello world!")Fertig.
[ken@~/tmp/fab$] fab hello Hello world!Beachten Sie, dass hier nicht fabfile als Dateiname verwendet werden muss, sondern die Datei beim Ausführen angegeben werden muss
[ken@~/tmp/fab$] mv fabfile.py test.py fabfile.py -> test.py [ken@~/tmp/fab$] fab hello Fatal error: Couldn't find any fabfiles! Remember that -f can be used to specify fabfile path, and use -h for help. Aborting. [ken@~/tmp/fab$] fab -f test.py hello Hello world!mit Parametern:
Ändern fabfile.py-Skript:
def hello(name, value): print("%s = %s!" % (name, value))Fertig.
[ken@~/tmp/fab$] fab hello:name=age,value=20 age = 20! Done. [ken@~/tmp/fab$] fab hello:age,20 age = 20!Native Operation ausführen
Einfache lokale Operation
from fabric.api import local def lsfab(): local('cd ~/tmp/fab') local('ls')Fertig.
[ken@~/tmp/fab$] pwd;ls /Users/ken/tmp/fab fabfile.py fabfile.pyc test.py test.pyc [ken@~/tmp/fab$] fab -f test.py lsfab [localhost] local: cd ~/tmp/fab [localhost] local: ls fabfile.py fabfile.pyc test.py test.pycDer eigentliche Kampf beginnt:
Angenommen, Sie möchten jeden Tag eine Konfigurationsdatei „settings.py“ an das Repository senden (Konflikte werden hier nicht berücksichtigt). Situation)
Wenn es sich um einen manuellen Vorgang handelt:
Mit anderen Worten, Sie müssen diese Befehle einmal täglich manuell eingeben. Der sogenannte tägliche Job bedeutet, dass er jeden Tag wiederholt wird. Es ist mechanisiert. Schauen wir uns an, wie man Fabric verwendet, um eine Ein-Klick-Vervollständigung zu erreichen: (Tatsächlich kann es direkt mit Shell-Skripten durchgeführt werden, aber der Vorteil von Fab liegt hier nicht. Der Hauptzweck besteht darin, sich darauf vorzubereiten Lokale + Remote-Operationen später (Schreiben Sie ein Skript für eine einfache Wartung)cd /home/project/test/conf/ git add settings.py git commit -m 'daily update settings.py' git pull origin git push originMischen und anpassen, um Remote-Operationen zu integrieren
from fabric.api import local def setting_ci(): local("cd /home/project/test/conf/") local("git add settings.py") #后面你懂的,懒得敲了…..Angenommen, Sie möchten zu diesem Zeitpunkt gehen entsprechendes Projektverzeichnis von Maschine A /home/ken/project, um die Konfigurationsdatei zu aktualisieren
#!/usr/bin/env python # encoding: utf-8 from fabric.api import local,cd,run env.hosts=['user@ip:port',] #ssh要用到的参数 env.password = 'pwd' def setting_ci(): local('echo "add and commit settings in local"') #刚才的操作换到这里,你懂的 def update_setting_remote(): print "remote update" with cd('~/temp'): #cd用于进入某个目录 run('ls -l | wc -l') #远程操作用run def update(): setting_ci() update_setting_remote()Fertig.
[ken@~/tmp/fab$] fab -f deploy.py update [user@ip:port] Executing task 'update' [localhost] local: echo "add and commit settings in local" add and commit settings in local remote update [user@ip:port] run: ls -l | wc -l [user@ip:port] out: 12 [user@ip:port] out:Beachten Sie, dass bei env.password nicht deklariert ist, erscheint bei der Ausführung auf dem entsprechenden Rechner eine Interaktion, die nach einem Passwort fragt
Multi-Server-Mashup
#!/usr/bin/env python # encoding: utf-8 from fabric.api import * #操作一致的服务器可以放在一组,同一组的执行同一套操作 env.roledefs = { 'testserver': ['user1@host1:port1',], 'realserver': ['user2@host2:port2', ] } #env.password = '这里不要用这种配置了,不可能要求密码都一致的,明文编写也不合适。打通所有ssh就行了' @roles('testserver') def task1(): run('ls -l | wc -l') @roles('realserver') def task2(): run('ls ~/temp/ | wc -l') def dotask(): execute(task1) execute(task2)Fertig.
[ken@~/tmp/fab$] fab -f mult.py dotask [user1@host1:port1] Executing task 'task1' [user1@host1:port1] run: ls -l | wc -l [user1@host1:port1] out: 9 [user1@host1:port1] out: [user2@host2:port2] Executing task 'task2' [user2@host2:port2] run: ls ~/temp/ | wc -l [user2@host2:port2] out: 11 [user2@host2:port2] out:Erweiterung
1 .Farbe
Sie können die Farbe ausdrucken, was beim Anzeigen von Betriebsergebnisinformationen auffälliger und praktischer ist
from fabric.colors import * def show(): print green('success') print red('fail') print yellow('yellow') #fab -f color.py show
Informationen zur Fehlerbehandlung
Standardmäßig wird eine Gruppe von Befehlen nicht weiter ausgeführt, nachdem die Ausführung des vorherigen Befehls fehlgeschlagen ist 🎜>
Eine andere Verarbeitung kann auch nach einem Fehler durchgeführt werden wird derzeit nicht verwendet. Ich werde es erneut lesen, wenn ich es später verwende 3. Passwortverwaltung Siehe die Dokumentation Eine bessere Methode zur Passwortverwaltung, ich bin etwas unerfahren und habe es nicht herausgefunden, hauptsächlich weil sich die Serverliste häufig ändert. Meine Verarbeitungsmethode ist:1.Host, Benutzer, Port, Passwort-Konfigurationsliste, alles in eine Datei geschrieben oder direkt in das Skript, das ist natürlich mehr... ...
oder
env.hosts = [ 'host1', 'host2' ] env.passwords = { 'host1': "pwdofhost1", 'host2': "pwdofhost2", }
2. Analysieren Sie es gemäß dem Schlüssel in eine Kartenverschachtelung und fügen Sie es in „Deploy“ ein.
env.roledefs = { 'testserver': ['host1', 'host2'], 'realserver': ['host3', ] } env.passwords = { 'host1': "pwdofhost1", 'host2': "pwdofhost2", 'host3': "pwdofhost3", }Tatsächlich können auch andere Befehle verwendet werden. In einer Cmds-Liste zusammengefasst. .Weitere Python-Fabric-Implementierungsbeispiele für Artikel zum Remote-Betrieb und zur Bereitstellung finden Sie auf der chinesischen PHP-Website!