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-07 16:46:061180Durchsuche

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).

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 aktualisieren
cd /home/project/test/conf/
git add settings.py
git commit -m 'daily update settings.py'
git pull origin
git push origin

Dann 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.

Beachten Sie, dass env.password lautet nicht deklariert, erscheint bei der Ausführung auf dem entsprechenden Rechner eine Interaktion, die nach einem Passwort fragt
#!/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.

Erweiterung
#!/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. Farbe

Sie 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

Informationen zur Fehlerbehandlung

Standardmäßig wird eine Gruppe von Befehlen nicht ausgeführt, nachdem die Ausführung des vorherigen Befehls fehlgeschlagen ist
from fabric.colors import *
def show():
    print green('success')
    print red('fail')
    print yellow('yellow')
#fab -f color.py show
Eine 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", 
}

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