Fabric est un outil Python basé sur le protocole SSH. Par rapport à la méthode traditionnelle ssh/scp, l'écriture de commandes de gestion dans la syntaxe Python est plus lisible et plus facile à développer. La gestion d'une ou plusieurs machines est comme une opération locale.
Adresse du site Web officiel : http://fabfile.org
Installation
Omettre le processus d'installation des outils de gestion Python et pip
pip install fabric
Vérifier si l'installation est réussi
Entrez dans le mode d'édition python et entrez le code S'il n'y a pas d'erreur, cela signifie une installation réussie
from fabric.api import local
version fabric hello world
fichier par défaut de fabric fabfile.py Bien sûr. , si vous ne souhaitez pas utiliser ce nom, vous devez ajouter le paramètre -f
Créer le fichier fabfile.py
vim fabrile.py
Modifier le code
#coding:utf-8 from fabric.api import local# def hello(): # local函数用来执行本地命令 local('echo "hello wolrd!"')
Exécutez le code
fab hello
Vous pouvez utiliser fab -l pour afficher la tâche exécutable, actuellement bonjour la fonction
Exécuter le résultat
[localhost] local: echo "hello world!" hello world! Done.
Méthode de maintenance traditionnelle :
$ ssh x.x.x.x 'uname -a' -- 输出略
Exemple de Fabric :
$ cat fabfile.py
from fabric.api import run def uname(): run('uname -a')
$ fab -H x.x.x.x uname -- 输出略
Intuitivement, il semble que beaucoup de code doit être écrit par rapport à la méthode ssh, mais il y a moins de liens contrôlables dans la méthode ssh Par exemple, si vous souhaitez déterminer si un service a été démarré, démarrez-le s'il n'a pas été démarré, etc. L'approche impérative ssh est un peu plus gênante. (Bien sûr, vous pouvez écrire un script sur la machine exploitée et appeler ce script via ssh)
Parlons de quelques avantages de Fabric :
Définition du rôle
Facile à coder Lire
encapsule les opérations locales et distantes (avez-vous toujours besoin d'encapsuler vous-même les opérations système/popen/ssh ?)
Paramètres flexibles (spécifier dynamiquement l'hôte/le rôle, etc., et exécution simultanée basée sur le multitraitement)
Sortie complète du journal
En fait, ceux répertoriés dans le travail quotidien ont essentiellement une encapsulation similaire, mais il existe un outil mature prêt à l'emploi, pourquoi ne pas l'utiliser ? Droite.
Configurations couramment utilisées :
env.host — IP de l'hôte, bien sûr, vous pouvez également spécifier le paramètre -H
env.password — Mot de passe, veuillez l'ignorer si vous avez créé un canal
env.roledefs - Regroupement de rôles, par exemple : {'web' : ['x', 'y'], 'db' : ['z']>
fab -l -- Afficher les tâches (commandes) disponibles
fab -H -- Spécifier l'hôte, prendre en charge plusieurs hôtes séparés par des virgules
fab -R -- Spécifier le rôle, prendre en charge plusieurs
fab -P Le fichier d'entrée par défaut est : fabfile/fabfile.py
Pour plus d'informations, veuillez vous référer à : fab --help
Fonctions couramment utilisées :
local('pwd') — Commande locale
lcd('/tmp') - Changer de répertoire local
cd('/tmp') - Changer de répertoire distant
run('uname -a ') - Exécutez la commande à distance
Sudo ('/ETC/Init.d/Nginx Start ') -Endonnez le SUDO à distance, faites attention à l'option PTY
Exemple 1 : Gérer le service Nginx distant
Exemple 2 : Basé sur les rôles$ cat fabfile.py
from fabric.api import * @task def nginx_start(): ''' nginx start ''' sudo('/etc/init.d/nginx start') @task def nginx_stop(): ''' nginx stop ''' sudo('/etc/init.d/nginx stop')
$ fab --list -- 查看可用命令 Available commands: nginx_start nginx start nginx_stop nginx stop $ fab -H x.x.x.x nginx_start -- 启动 nginx
$ cat fabfile.py
from fabric.api import * env.roledefs = {'nginx': ['x.x.x.x', 'y.y.y.y'], 'mysql': 'z.z.z.z'} @task def mysql_start() ''' mysql start ''' sudo('/etc/init.d/mysql start')
$ fab --list -- 查看可用命令 Available commands: nginx_start nginx start nginx_stop nginx stop mysql_start mysql start $ fab -R nginx nginx_start -- 启动 nginx $ fab -R mysql mysql_start -- 启动 mysql
Est-ce qu'ils ressemblent tous à des locaux ? Droite.
$ cat fabfile
def hello(): ''' test hello ''' with lcd('/tmp'): # 切换到 /tmp 目录下 local('svn co http://xxx xxx') # check 代码到本地 local('tar czf xxx.tar.gz xxx/') # 压缩本地包 put('xxx.tar.gz', '/tmp') # 上传压缩包到远程 /tmp 目录下 with cd('/tmp'): # 切换到远程 /tmp 目录 run('tar zxf xxx.tar.gz') # 远程解压
env.hosts = ['root@ip1:22',root@ip2:22]