Maison > développement back-end > Tutoriel Python > La structure Python implémente des exemples d'opérations et de déploiement à distance

La structure Python implémente des exemples d'opérations et de déploiement à distance

高洛峰
Libérer: 2017-01-07 16:46:06
original
1380 Les gens l'ont consulté

Récemment, j'ai repris de plus en plus de choses. Les travaux de libération et d'exploitation et de maintenance sont assez mécaniques, et la fréquence est assez élevée, ce qui entraîne une perte de temps mais présente de nombreux avantages. Corrigez les bugs, testez, soumettez le référentiel (2 minutes), ssh à l'environnement de test pour le déploiement pull (2 minutes), rsync vers les machines en ligne A, B, C, D, E (1 minute), ssh vers ABCDE5 respectivement Chaque machine est redémarré une par une (8-10 minutes) = 13-15 minutes. Le plus frustrant c'est que chaque opération est la même, la commande est la même. Ce qui est terrible c'est que sur plusieurs machines, il est difficile de le faire avec une seule. script sur cette machine. La plupart du temps a été perdu en ssh, en tapant des commandes et en les écrivant dans des scripts, qui peuvent être exécutés en un seul clic. Il a fallu deux minutes pour examiner les résultats de l'exécution

jusqu'à ce que je découvre. cette structure peut solidifier les commandes pour un déploiement automatisé ou un fonctionnement sur plusieurs machines. Dans un script, il est très similaire à certains outils d'exploitation et de maintenance. La principale raison de son utilisation est qu'il est simple, facile à utiliser et facile à démarrer. , vous pouvez également combiner diverses commandes shell. La différence entre les artefacts anciens et les armes modernes

Configuration de l'environnement

Installez le package correspondant sur la machine locale et la machine cible (notez que les deux sont requis)

sudo easy_install fabric

Il s'agit actuellement de la version 1.6 (ou utilisez pip install, pareil)

Après l'installation, vous pouvez vérifier si l'installation est réussie

[ken@~$] which fab
/usr/local/bin/fab
Copier après la connexion

Après l'installation, vous pouvez parcourir la documentation officielle

Ensuite, vous pouvez démarrer

Bonjour tout le monde
Effectuez d'abord des opérations simples sur cette machine et ayez une compréhension préliminaire. la source de l'exemple provient du site officiel

Créez un nouveau script py : fabfile.py

def hello():
    print("Hello world!")
Copier après la connexion

Exécution en ligne de commande :

[ken@~/tmp/fab$] fab hello
Hello world!
Copier après la connexion

Terminé.
Notez que fabfile n'a pas besoin d'être utilisé comme nom de fichier ici, mais le fichier doit être spécifié lors de l'exécution de

[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!
Copier après la connexion

Terminé.
avec paramètres :

Modifier fabfile .py script :

def hello(name, value):
    print("%s = %s!" % (name, value))
Copier après la connexion

Exécuter

[ken@~/tmp/fab$] fab hello:name=age,value=20
age = 20!
Done.
[ken@~/tmp/fab$] fab hello:age,20
age = 20!
Copier après la connexion

Terminé.
Exécuter l'opération native
Opération locale simple :

from fabric.api import local
def lsfab():
    local('cd ~/tmp/fab')
    local('ls')
Copier après la connexion

Résultat :

[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
Copier après la connexion

Terminé.
La bataille proprement dite commence :

Supposons que vous souhaitiez soumettre chaque jour un fichier de configuration settings.py au référentiel (les conflits ne sont pas pris en compte ici)

S'il s'agit d'une opération manuelle :

cd /home/project/test/conf/
git add settings.py
git commit -m 'daily update settings.py'
git pull origin
git push origin
Copier après la connexion

En d'autres termes, vous devez taper ces commandes manuellement une fois par jour. Le travail dit quotidien signifie qu'il doit être répété tous les jours. . Pour le travail mécanisé, voyons comment utiliser Fabric pour réaliser une réalisation en un clic : (En fait, cela peut être fait directement à l'aide de scripts shell, mais l'avantage de fab n'est pas là. L'objectif principal ici est de préparer le travail local et distant. opérations plus tard. Après tout, les opérations à deux endroits Écrivez un script pour une maintenance facile)

from fabric.api import local
def setting_ci():
    local("cd /home/project/test/conf/")
    local("git add settings.py")
    #后面你懂的,懒得敲了…..
Copier après la connexion

Mélanger et assortir pour intégrer les opérations à distance
À ce stade, supposons que vous souhaitiez accéder au répertoire du projet correspondant. du /home/ken/project de la machine A pour mettre à jour le fichier de configuration

#!/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()
Copier après la connexion

Ensuite, exécutez :

[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:
Copier après la connexion

Terminé.
Notez que si env.password n'est pas déclaré , une interaction demandant un mot de passe apparaîtra lors de l'exécution sur la machine correspondante

Mashup multi-serveur
Pour faire fonctionner plusieurs serveurs, plusieurs hôtes doivent être configurés

#!/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)
Copier après la connexion

Résultat :

[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:
Copier après la connexion

Terminé.
Extension
1 .Couleur

Vous pouvez imprimer la couleur, ce qui est plus accrocheur et pratique lors de la visualisation des informations sur les résultats de l'opération

from fabric.colors import *
def show():
    print green('success')
    print red('fail')
    print yellow('yellow')
#fab -f color.py show
Copier après la connexion

2. Erreurs et exceptions

À propos de la gestion des erreurs

Par défaut, un groupe de commandes ne continuera pas à s'exécuter après l'échec de la commande précédente

. Vous pouvez également effectuer différents traitements après échec. Le document

n'est pas utilisé actuellement Je le relirai lorsque je l'utiliserai plus tard

3. Gestion des mots de passe

Voir. la documentation

Une meilleure méthode de gestion des mots de passe, je suis un peu naïf et je n'ai pas compris, principalement parce que la liste des serveurs change fréquemment, ma méthode de traitement est :

1. liste de configuration de l'hôte, de l'utilisateur, du port, du mot de passe, le tout écrit dans un fichier

ou directement dans le script, bien sûr c'est plus... ...

env.hosts = [
'host1',
'host2'

]
env.passwords = { 
'host1': "pwdofhost1",
'host2': "pwdofhost2",
}
Copier après la connexion

ou

env.roledefs = {
'testserver': ['host1', 'host2'],
'realserver': ['host3', ]
}
env.passwords = {
'host1': "pwdofhost1",
'host2': "pwdofhost2",
'host3': "pwdofhost3", 
}
Copier après la connexion

2. Analysez-le dans l'imbrication de la carte en fonction de la clé et mettez-le en déploiement

En fait, d'autres commandes peuvent également être utilisées Solidifiées dans une liste de cmds...

Pour plus d'exemples d'implémentation de Python Fabric d'articles liés au fonctionnement et au déploiement à distance, veuillez prêter attention au site Web PHP chinois !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal