Heim >Backend-Entwicklung >Python-Tutorial >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).
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 werden muss Sehen wir uns für die maschinelle Arbeit an, wie man Fabric verwendet, um eine Ein-Klick-Vervollständigung zu erreichen: (Eigentlich kann dies direkt mit Shell-Skripten erfolgen, aber der Vorteil von Fab liegt hier nicht. Der Hauptzweck besteht hier darin, sich auf Local + vorzubereiten Remote-Operationen später. Schließlich gibt es zwei Orte, um die Wartung zu vereinfachen Projektverzeichnis von Maschine A /home/ken/project, um die Konfigurationsdatei zu aktualisierencd /home/project/test/conf/ git add settings.py git commit -m 'daily update settings.py' git pull origin git push originDann führen Sie Folgendes aus:
from fabric.api import local def setting_ci(): local("cd /home/project/test/conf/") local("git add settings.py") #后面你懂的,懒得敲了…..
Fertig.
#!/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()
Multi-Server-Mashup
Um mehrere Server zu betreiben, müssen mehrere Hosts konfiguriert werden[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:
Ergebnis:
Fertig.
#!/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)1. FarbeSie können die Farbe ausdrucken, was beim Anzeigen von Betriebsergebnisinformationen auffälliger und praktischer ist
[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:
2. Fehler und Ausnahmen
from fabric.colors import * def show(): print green('success') print red('fail') print yellow('yellow') #fab -f color.py showEine andere Verarbeitung kann auch nach einem Fehler durchgeführt werden wird derzeit nicht verwendet, ich werde es noch einmal lesen, wenn ich es später verwenden muss 3. Passwortverwaltung Sehen Sie sich die Dokumentation an Eine bessere Passwortverwaltungsmethode, ich bin relativ unbedarft, ich habe es nicht herausgefunden, es liegt hauptsächlich an Änderungen in der Serverliste. Meine Verarbeitungsmethode ist häufig: 1. Host-, Benutzer-, Port- und Passwortkonfigurationsliste, alles in eine Datei geschrieben oder direkt in das Skript, das ist natürlich bequemer .......
oder
2. Analysieren Sie es gemäß dem Schlüssel in eine Kartenverschachtelung und fügen Sie es in die Bereitstellung ein Darüber hinaus ist der Befehl auch Kann verfestigt werden in eine Cmds-Liste...env.hosts = [ 'host1', 'host2' ] env.passwords = { 'host1': "pwdofhost1", 'host2': "pwdofhost2", }
Weitere Beispiele für die Python-Fabric-Implementierung von Artikeln zu Remote-Betrieb und -Bereitstellung finden Sie auf der chinesischen PHP-Website!
env.roledefs = { 'testserver': ['host1', 'host2'], 'realserver': ['host3', ] } env.passwords = { 'host1': "pwdofhost1", 'host2': "pwdofhost2", 'host3': "pwdofhost3", }