Heim  >  Artikel  >  Backend-Entwicklung  >  Python Fabric implementiert Beispiele für Remote-Betrieb und -Bereitstellung

Python Fabric implementiert Beispiele für Remote-Betrieb und -Bereitstellung

高洛峰
高洛峰Original
2017-01-16 17:32:411038Durchsuche

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

Befehlszeilenausführung:
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


Fertig.
[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:

Ausführen
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

Ergebnis:
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.pyc
Der 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 origin

Mischen 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


Dann führen Sie Folgendes aus:
#!/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

Um mehrere Server zu betreiben, müssen mehrere Hosts konfiguriert werden


Ergebnis:
#!/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

2. Fehler und Ausnahmen
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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn