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 相关文章推荐
解决python2.7 查询mysql时出现中文乱码
Oct 09 Python
python 删除非空文件夹的实例
Apr 26 Python
Python使用pandas处理CSV文件的实例讲解
Jun 22 Python
浅谈python之新式类
Aug 12 Python
解决Python print输出不换行没空格的问题
Nov 14 Python
python微信好友数据分析详解
Nov 19 Python
Django缓存系统实现过程解析
Aug 02 Python
python requests抓取one推送文字和图片代码实例
Nov 04 Python
Python While循环语句实例演示及原理解析
Jan 03 Python
什么是python的自省
Jun 21 Python
使用Python操作MySQL的小技巧
Sep 10 Python
Python如何在bool函数中取值
Sep 21 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 PDO函数库详解
2010/04/27 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
2012/01/20 PHP
PHP swfupload图片上传的实例代码
2013/09/30 PHP
PHP中的output_buffering详细介绍
2014/09/27 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
2014/10/30 PHP
PHP实现货币换算的方法
2014/11/29 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
Web版彷 Visual Studio 2003 颜色选择器
2007/01/09 Javascript
javascript AOP 实现ajax回调函数使用比较方便
2010/11/20 Javascript
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
2017/03/29 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
2017/05/17 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
2017/12/26 Javascript
javascript中数组的常用算法深入分析
2019/03/12 Javascript
js实现计时器秒表功能
2019/12/16 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
2020/08/07 Javascript
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
python编程实现12306的一个小爬虫实例
2017/12/27 Python
python正则中最短匹配实现代码
2018/01/16 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
css3实现背景模糊的三种方式(小结)
2020/05/15 HTML / CSS
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
天游软件面试
2013/11/23 面试题
《九色鹿》教学反思
2014/02/27 职场文书
创建市级文明单位实施方案
2014/03/01 职场文书
迎新晚会策划方案
2014/06/13 职场文书
小班上学期个人总结
2015/02/12 职场文书