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列表操作使用示例分享
Feb 21 Python
使用Python标准库中的wave模块绘制乐谱的简单教程
Mar 30 Python
python与sqlite3实现解密chrome cookie实例代码
Jan 20 Python
python 3.7.0 安装配置方法图文教程
Aug 27 Python
修改默认的pip版本为对应python2.7的方法
Nov 06 Python
python实现对图片进行旋转,放缩,裁剪的功能
Aug 07 Python
python使用协程实现并发操作的方法详解
Dec 27 Python
pytorch GAN伪造手写体mnist数据集方式
Jan 10 Python
Python3搭建http服务器的实现代码
Feb 11 Python
Python如何使用turtle库绘制图形
Feb 26 Python
Python局部变量与全局变量区别原理解析
Jul 14 Python
如何基于Python和Flask编写Prometheus监控
Nov 25 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
优化WordPress的Google字体以加速国内服务器上的运行
2015/11/24 PHP
ThinkPHP3.2.1图片验证码实现方法
2016/08/19 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
javascript 年月日联动实现核心代码
2009/12/21 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
js 实现菜单左右滚动显示示例介绍
2013/11/21 Javascript
javascript列表框操作函数集合汇总
2013/11/28 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
2016/07/12 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
2016/12/27 Javascript
基于vue.js快速搭建图书管理平台
2017/10/29 Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
实例详解Node.js 函数
2018/06/10 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
浅谈js中的attributes和Attribute的用法与区别
2020/07/16 Javascript
一篇文章快速了解Python的GIL
2018/01/12 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
2018/07/18 Python
使用python绘制温度变化雷达图
2019/10/18 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
英国大码女性时装零售商:Evans
2018/08/29 全球购物
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
如何判断计算机可能已经中马
2013/03/22 面试题
思想汇报格式
2014/01/05 职场文书
北京青年观后感
2015/06/15 职场文书
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技
Win11 BitLocker 驱动器加密
2022/04/19 数码科技
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers