Python下Fabric的简单部署方法


Posted in Python onJuly 14, 2015

Fabric是一个用Python开发的部署工具,最大特点是不用登录远程服务器,在本地运行远程命令,几行Python脚本就可以轻松部署。
文档入口
简单安装

sudo easy_install fabric

部署脚本

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from datetime import datetime
from fabric.api import *

# 登录用户和主机名:
env.user = 'root'
env.hosts = ['www.example.com'] # 如果有多个主机,fabric会自动依次部署

def pack():
  ' 定义一个pack任务 '
  # 打一个tar包:
  tar_files = ['*.py', 'static/*', 'templates/*', 'favicon.ico']
  local('rm -f example.tar.gz')
  local('tar -czvf example.tar.gz --exclude=\'*.tar.gz\' --exclude=\'fabfile.py\' %s' % ' '.join(tar_files))

def deploy():
  ' 定义一个部署任务 '
  # 远程服务器的临时文件:
  remote_tmp_tar = '/tmp/example.tar.gz'
  tag = datetime.now().strftime('%y.%m.%d_%H.%M.%S')
  run('rm -f %s' % remote_tmp_tar)
  # 上传tar文件至远程服务器:
  put('shici.tar.gz', remote_tmp_tar)
  # 解压:
  remote_dist_dir = '/srv/www.example.com@%s' % tag
  remote_dist_link = '/srv/www.example.com'
  run('mkdir %s' % remote_dist_dir)
  with cd(remote_dist_dir):
    run('tar -xzvf %s' % remote_tmp_tar)
  # 设定新目录的www-data权限:
  run('chown -R www-data:www-data %s' % remote_dist_dir)
  # 删除旧的软链接:
  run('rm -f %s' % remote_dist_link)
  # 创建新的软链接指向新部署的目录:
  run('ln -s %s %s' % (remote_dist_dir, remote_dist_link))
  run('chown -R www-data:www-data %s' % remote_dist_link)
  # 重启fastcgi:
  fcgi = '/etc/init.d/py-fastcgi'
  with settings(warn_only=True):
    run('%s stop' % fcgi)
  run('%s start' % fcgi)

    以上定义了pack和deploy两个任务,如果我们用Fabric部署,只需简单地输入两条命令:

$ fab pack
$ fab deploy

Fabric提供几个简单的API来完成所有的部署,最常用的是local()和run(),分别在本地和远程执行命令,put()可以把本地文件上传到远程,当需要在远程指定当前目录时,只需用with cd(‘/path/to/dir/'):即可。

默认情况下,当命令执行失败时,Fabric会停止执行后续命令。有时,我们允许忽略失败的命令继续执行,比如run(‘rm /tmp/abc')在文件不存在的时候有可能失败,这时可以用with settings(warn_only=True):执行命令,这样Fabric只会打出警告信息而不会中断执行。

Fabric是如何在远程执行命令的呢?其实Fabric所有操作都是基于SSH执行的,必要时它会提示输入口令,所以非常安全。更好的办法是在指定的部署服务器上用证书配置无密码的ssh连接。

如果是基于团队开发,可以让Fabric利用版本库自动检出代码,自动执行测试、打包、部署的任务。由于Fabric运行的命令都是基本的Linux命令,所以根本不需要用Fabric本身来扩展,会敲Linux命令就能用Fabric部署。

利用Fabric部署Python、Ruby、PHP这样的非编译型网站应用非常方便,而对于编译型的Java、C#等就麻烦了,编译本身就是一个极其复杂的大工程,需要依赖特定工具或者IDE,很难做到自动化。

Python 相关文章推荐
浅述python2与python3的简单区别
Sep 19 Python
python 将list转成字符串,中间用符号分隔的方法
Oct 23 Python
python列表使用实现名字管理系统
Jan 30 Python
Python中时间datetime的处理与转换用法总结
Feb 18 Python
Django 内置权限扩展案例详解
Mar 04 Python
详解PyCharm+QTDesigner+PyUIC使用教程
Jun 13 Python
一篇文章了解Python中常见的序列化操作
Jun 20 Python
django框架model orM使用字典作为参数,保存数据的方法分析
Jun 24 Python
django如何自己创建一个中间件
Jul 24 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
Python学习之os模块及用法
Jun 03 Python
完美处理python与anaconda环境变量的冲突问题
Apr 07 Python
python简单获取数组元素个数的方法
Jul 13 #Python
python连接字符串的方法小结
Jul 13 #Python
简单上手Python中装饰器的使用
Jul 12 #Python
python比较两个列表大小的方法
Jul 11 #Python
python实现计算倒数的方法
Jul 11 #Python
python实现基本进制转换的方法
Jul 11 #Python
python计算圆周率pi的方法
Jul 11 #Python
You might like
php下连接mssql2005的代码
2011/01/17 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
CI框架的安全性分析
2016/05/18 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
yii2 开发api接口时优雅的处理全局异常的方法
2019/05/14 PHP
一起来写段JS drag拖动代码
2010/12/09 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
2014/06/06 Javascript
javascript数组去重方法汇总
2015/04/23 Javascript
jQuery zclip插件实现跨浏览器复制功能
2015/11/02 Javascript
javascript中Date对象的使用总结
2016/11/21 Javascript
AngularJS中使用ngModal模态框实例
2017/05/27 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
2017/07/25 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
vue中设置、获取、删除cookie的方法
2018/09/21 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
js中Function引用类型常见有用的方法和属性详解
2019/12/11 Javascript
关于element-ui表单中限制输入纯数字的解决方式
2020/09/08 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
Django数据库操作之save与update的使用
2020/04/01 Python
深入了解NumPy 高级索引
2020/07/24 Python
教你使用Canvas处理图片的方法
2017/11/28 HTML / CSS
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
探索欧洲最好的品牌:Bombinate
2019/06/14 全球购物
英国行业制服供应商:Alexandra
2019/09/14 全球购物
运动会四百米广播稿
2014/01/19 职场文书
最新会计专业求职信范文
2014/01/28 职场文书
高三上学期学习自我评价
2014/04/23 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
2014幼儿园班主任工作总结
2014/12/04 职场文书
初中优秀学生评语
2014/12/29 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js