视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python自动化部署工具Fabric的简单上手指南
2020-11-27 14:27:02 责编:小采
文档


Fabric 是基于 SSH 协议的 Python 工具,相比传统的 ssh/scp 方式,用 Python 的语法写管理命令更易读也更容易扩展,管理单台或者多台机器犹如本地操作一般。

官网地址:http://fabfile.org

安装
省略python、pip管理工具安装过程

pip install fabric

验证是否安装成功
进入python编辑模式,输入代码,无错即表示成功安装

from fabric.api import local

fabric版hello world
fabric 默认文件fabfile.py,当然如果不想用这个名字,需要加-f参数

创建fabfile.py文件

vim fabrile.py

编辑代码

#coding:utf-8
from fabric.api import local#
def hello():
 # local函数用来执行本地命令
 local('echo "hello wolrd!"')

执行代码

fab hello

可以通过fab -l查看可以执行的任务,当前为hello函数
运行结果

[localhost] local: echo "hello world!"
hello world!
Done.

传统维护方法:

$ ssh x.x.x.x 'uname -a' -- 
输出略

Fabric 示例:

$ cat fabfile.py
from fabric.api import run
def uname():
 run('uname -a')
$ fab -H x.x.x.x uname -- 
输出略

肉眼直观看上去,貌似比 ssh 方式要写不少代码,但是基于 ssh 方式中间可控环节比较少,例如:你想判断某服务是否已经启动,没有启动则执行启动等等操作。ssh 命令式的做法稍显麻烦。(当然龌龊一点可以在被操作机器上写好一个脚本,ssh 调用这个脚本)

说几个 Fabric 的优点吧:

角色定义

代码易读

封装了本地、远程操作(还需要自己封装system/popen/ssh操作么?)

参数灵活(动态指定 host/role 等,还有并发执行 基于multiprocessing )

完整的日志输出

罗列的这些,其实日常工作里基本都有类似的封装了,但是有现成的一个成熟的工具,干啥不用呢?对吧。

常用的配置:

env.host -- 主机ip,当然也可以-H参数指定

env.password -- 密码,打好通道的请无视

env.roledefs -- 角色分组,比如:{'web': ['x', 'y'], 'db': ['z']}

fab -l -- 显示可用的task(命令)

fab -H -- 指定host,支持多host逗号分开

fab -R -- 指定role,支持多个

fab -P -- 并发数,默认是串行

fab -w -- warn_only,默认是碰到异常直接abort退出

fab -f -- 指定入口文件,fab默认入口文件是:fabfile/fabfile.py

更多请参考:fab --help

常用的函数:

local('pwd') -- 执行本地命令

lcd('/tmp') -- 切换本地目录

cd('/tmp') -- 切换远程目录

run('uname -a') -- 执行远程命令

sudo('/etc/init.d/nginx start') -- 执行远程sudo,注意pty选项

示例1:管理远程 nginx 服务

$ 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

示例2:基于角色

$ 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

示例3:混合本地和远程操作

$ 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') # 远程解压

是不是看上去都是像本地一样?对吧。

示例4:多个目标服务器
相同密码或者手动输入:

env.hosts = ['root@ip1:22',root@ip2:22]

不同密码或者不想手动输入(此方法也可定义不角色一组服务器):

#coding:utf-8
from fabric.api import local,cd,put,lcd,env,run,execute,roles
env.roledefs = {
 'role1':['root@ip1:22',],
 'role2':['root@ip2:22',]
}
env.passwords={
 'root@ip1:22':'pwd1',
 'root@ip2:22':'pwd2'
}
@roles('role1')
def role1():
 with cd('/tmp'):
 run('ls -l')
@roles('role2')
def role2():
 with cd('/tmp'):
 run('ls')
def task():
 execute(role1)
 execute(role2)

更多Python自动化部署工具Fabric的简单上手指南相关文章请关注PHP中文网!

下载本文
显示全文
专题