Python自动化部署工具Fabric的简单上手指南


Posted in Python onApril 19, 2016

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 相关文章推荐
python 七种邮件内容发送方法实例
Apr 22 Python
深入分析在Python模块顶层运行的代码引起的一个Bug
Jul 04 Python
python实现文本去重且不打乱原本顺序
Jan 26 Python
Python使用email模块对邮件进行编码和解码的实例教程
Jul 01 Python
开源软件包和环境管理系统Anaconda的安装使用
Sep 04 Python
python中Apriori算法实现讲解
Dec 10 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
Feb 07 Python
Django框架model模型对象验证实现方法分析
Oct 02 Python
在tensorflow中实现去除不足一个batch的数据
Jan 20 Python
Python识别验证码的实现示例
Sep 30 Python
python 调整图片亮度的示例
Dec 03 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 Python
python实现简单socket通信的方法
Apr 19 #Python
python实现域名系统(DNS)正向查询的方法
Apr 19 #Python
python安装与使用redis的方法
Apr 19 #Python
Python实现文件复制删除
Apr 19 #Python
利用Python获取赶集网招聘信息前篇
Apr 18 #Python
Python Sql数据库增删改查操作简单封装
Apr 18 #Python
python使用paramiko实现远程拷贝文件的方法
Apr 18 #Python
You might like
用PHP实现文件上传二法
2006/10/09 PHP
ThinkPHP文件上传实例教程
2014/08/22 PHP
PHP获取ip对应地区和使用网络类型的方法
2015/03/11 PHP
php防止sql注入的方法详解
2017/02/20 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
js jquery数组介绍
2012/07/15 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
ReactJs实现树形结构的数据显示的组件的示例
2017/08/18 Javascript
详解封装基础的angular4的request请求方法
2018/06/05 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
python爬虫入门教程之点点美女图片爬虫代码分享
2014/09/02 Python
python使用datetime模块计算各种时间间隔的方法
2015/03/24 Python
Python验证码识别的方法
2015/07/10 Python
详解python时间模块中的datetime模块
2016/01/13 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
python对象及面向对象技术详解
2016/07/19 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
css3实现wifi信号逐渐增强效果实例
2017/08/09 HTML / CSS
利用三角函数在canvas上画虚线的方法
2018/01/11 HTML / CSS
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
高一化学教学反思
2014/02/05 职场文书
大学班级文化建设方案
2014/05/06 职场文书
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
男方婚礼答谢词
2015/01/20 职场文书
财务个人年度总结范文
2015/02/26 职场文书
学校捐书倡议书
2015/04/27 职场文书
2019秋季运动会口号
2019/06/25 职场文书
2019自荐信范文集锦!
2019/07/03 职场文书
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL