Maison  >  Article  >  développement back-end  >  Python Fabric implémente le fonctionnement et le déploiement à distance

Python Fabric implémente le fonctionnement et le déploiement à distance

高洛峰
高洛峰original
2017-03-28 16:41:211296parcourir

tissu

Le titre est développement, mais en même temps, vous devez faire des travaux de développement, de tests et d'exploitation et de maintenance... Pourquoi la tâche*3 n'est-elle pas un salaire * 3 (o(╯ □╰)o)

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 en a beaucoup. avantages.

Corriger les bugs, tester, soumettre le référentiel (2 minutes), ssh vers 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 sur les cinq machines d'ABCDE respectivement, et redémarrez une par une (8-10 minutes) = 13-15 minutes

Ce qui est frustrant, c'est que chaque opération est la même, la commande est la même et le Ce qui est terrible, c'est que sur plusieurs machines, il est difficile de le faire avec un script sur cette machine. L'essentiel du temps est perdu en ssh, en tapant des commandes et en l'écrivant sous forme de script. Il peut être exécuté en un seul clic. Passez deux minutes à regarder les résultats de l'exécution

jusqu'à ce que vous le trouviez. Fabric

Fonction

Un outil très puissant

Vous pouvez solidifier les commandes pour. déploiement automatisé ou fonctionnement multi-machines dans un script

et certains outils d'exploitation et de maintenance sont très similaires. La principale raison de son utilisation est que Python...

est simple, facile à utiliser. utiliser et facile à utiliser

Bien sûr, vous pouvez également combiner diverses commandes de shell, y compris des artefacts anciens et des armes modernes Différence

Configuration de l'environnement

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

sudo easy_install fabric

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

Une fois l'installation terminée, vous pouvez vérifier si l'installation est réussie

[ken@~$] which fab
/usr/local/bin/fab

Ensuite, vous pouvez démarrer

Bonjour tout le monde

Allez d'abord sur la machine locale Opération simple, une compréhension préliminaire, la source du l'exemple provient du site officiel

Créez un script py : fabfile.py

def hello():
    print("Hello world!")

Exécution en ligne de commande :

[ken@~/tmp/fab$] fab hello
Hello world!
Done.

Remarque, vous ne pouvez pas utiliser fabfile comme le nom du fichier ici, mais vous devez spécifier le fichier

[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!
Done.

avec des paramètres lors de l'exécution :

Modifier le script fabfile.py :

def hello(name, value):
    print("%s = %s!" % (name, value))

Exécuter

[ken@~/tmp/fab$] fab hello:name=age,value=20
age = 20!
Done.
[ken@~/tmp/fab$] fab hello:age,20
age = 20!
Done.

Effectuer une opération native

Opération locale simple :

from fabric.api import local
def lsfab():
    local('cd ~/tmp/fab')
    local('ls')

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

Le combat réel commence :

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

S'il s'agit d'un fonctionnement manuel :

cd /home/project/test/conf/
git add settings.py
git commit -m 'daily update settings.py'
git pull origin
git push origin

En d'autres termes, Vous devez saisir manuellement ces commandes une fois par jour. Le travail dit quotidien est un travail mécanisé qui doit être répété chaque jour. Voyons comment utiliser Fabric pour réaliser une opération en un clic : (en fait, cela peut être fait. directement avec un script shell, mais fabuleux L'avantage n'est pas là. L'essentiel ici est de préparer les opérations locales + distantes plus tard. Après tout, écrire un script pour les opérations à deux endroits facilite la maintenance)

from fabric.api import local
def setting_ci():
    local("cd /home/project/test/conf/")
    local("git add settings.py")
    #后面你懂的,懒得敲了….
Mélanger et assortir pour intégrer les opérations à distance

À ce moment, supposons que vous souhaitiez vous rendre dans le répertoire du projet correspondant à /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()
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:
Done.
Remarque, si env.password n'est pas déclaré, une interaction nécessitant la saisie d'un mot de passe apparaîtra lors de l'exécution sur la machine correspondante

多服务器混搭

操作多个服务器,需要配置多个host

#!/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)

结果:

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

扩展

1.颜色

可以打印颜色,在查看操作结果信息的时候更为醒目和方便

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

2.错误和异常

关于错误处理

默认,一组命令,上一个命令执行失败后,不会接着往下执行

失败后也可以进行不一样的处理, 文档

目前没用到,后续用到再看了

3.密码管理

看文档

更好的密码管理方式,哥比较土,没打通,主要是服务器列表变化频繁,我的处理方式是:

1.host,user,port,password配置列表,所有的都写在一个文件

或者直接搞到脚本里,当然这个更........

env.hosts = [

'host1',

'host2'
]
env.passwords = { 
'host1': "pwdofhost1",
'host2': "pwdofhost2",
}

 或者

env.roledefs = {
'testserver': ['host1', 'host2'],
'realserver': ['host3', ]
}
env.passwords = {
'host1': "pwdofhost1",
'host2': "pwdofhost2",
'host3': "pwdofhost3", 

2.根据key解析成map嵌套,放到deploy中

另外命令其实也可以固化成一个cmds列表的…..

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
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