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设置windows桌面壁纸的实现代码
Jan 28 Python
详解Python爬虫的基本写法
Jan 08 Python
apache部署python程序出现503错误的解决方法
Jul 24 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
Mar 19 Python
python 构造三维全零数组的方法
Nov 12 Python
通过shell+python实现企业微信预警
Mar 07 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
Mar 29 Python
我喜欢你 抖音表白程序python版
Apr 07 Python
django模板获取list中指定索引的值方式
May 14 Python
python求numpy中array按列非零元素的平均值案例
Jun 08 Python
Python实现七个基本算法的实例代码
Oct 08 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
Dec 15 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
dede3.1分页文字采集过滤规则详说(图文教程)续二
2007/04/03 PHP
一贴学会PHP 新手入门教程
2009/08/03 PHP
如何在HTML 中嵌入 PHP 代码
2015/05/13 PHP
深入讲解PHP Session及如何保持其不过期的方法
2015/08/18 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
2016/10/29 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
实用javaScript技术-屏蔽类
2006/08/15 Javascript
iphone safari不支持position fixed的解决方法
2012/05/04 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
2016/06/22 Javascript
js实现带三角符的手风琴效果
2017/03/01 Javascript
B/S(Web)实时通讯解决方案分享
2017/04/06 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
vue2.0+vue-dplayer实现hls播放的示例
2018/03/02 Javascript
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
JavaScript:ES2019 的新特性(译)
2019/08/08 Javascript
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
linux安装Python3.4.2的操作方法
2018/09/28 Python
python通过移动端访问查看电脑界面
2020/01/06 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
Python Socket多线程并发原理及实现
2020/12/11 Python
The North Face北面英国官网:美国著名户外品牌
2017/12/13 全球购物
预备党员党课思想汇报
2014/01/13 职场文书
民主评议政风行风整改方案
2014/09/17 职场文书
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
保证书格式
2015/01/16 职场文书
小学教师节活动总结
2015/03/20 职场文书
缅怀先烈主题班会
2015/08/14 职场文书
2016年“11.11”光棍节活动总结
2016/04/05 职场文书
Python打包exe时各种异常处理方案总结
2021/05/18 Python
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技
Java实现简单小画板
2022/06/10 Java/Android