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 16 Python
举例讲解Python中metaclass元类的创建与使用
Jun 30 Python
详解python3实现的web端json通信协议
Dec 29 Python
Python中标准库OS的常用方法总结大全
Jul 19 Python
python实现随机调用一个浏览器打开网页
Apr 21 Python
Python使用win32 COM实现Excel的写入与保存功能示例
May 03 Python
pycharm 实现显示project 选项卡的方法
Jan 17 Python
Python使用Slider组件实现调整曲线参数功能示例
Sep 06 Python
Python爬虫小例子——爬取51job发布的工作职位
Jul 10 Python
Python经纬度坐标转换为距离及角度的实现
Nov 01 Python
Python高并发和多线程有什么关系
Nov 14 Python
有趣的二维码:使用MyQR和qrcode来制作二维码
May 10 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
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
Egret引擎开发指南之运行项目
2014/09/03 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
有关Promises异步问题详解
2015/11/13 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
JS查找数组中重复元素的方法详解
2017/06/14 Javascript
JS原生轮播图的简单实现(推荐)
2017/07/22 Javascript
JS实现模糊查询带下拉匹配效果
2018/06/21 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
[01:29]Ti4循环赛第三日精彩回顾
2014/07/13 DOTA
Python获取Linux系统下的本机IP地址代码分享
2014/11/07 Python
利用Psyco提升Python运行速度
2014/12/24 Python
一波神奇的Python语句、函数与方法的使用技巧总结
2015/12/08 Python
python requests使用socks5的例子
2019/07/25 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
Python3标准库之functools管理函数的工具详解
2020/02/27 Python
css3 矩阵的使用详解
2018/03/20 HTML / CSS
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
家居设计专业个人自荐信范文
2013/11/26 职场文书
王老吉广告词
2014/03/20 职场文书
事业单位鉴定材料
2014/05/25 职场文书
网络营销策划方案
2014/06/04 职场文书
小英雄雨来观后感
2015/06/09 职场文书
党章学习心得体会2016
2016/01/14 职场文书
第四次工业革命,打工人与机器人的竞争
2022/04/21 数码科技