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 相关文章推荐
python实现通过shelve修改对象实例
Sep 26 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
Feb 19 Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
Python工厂函数用法实例分析
May 14 Python
python库lxml在linux和WIN系统下的安装
Jun 24 Python
Python连接Redis的基本配置方法
Sep 13 Python
PyTorch 1.0 正式版已经发布了
Dec 13 Python
Python使用字典的嵌套功能详解
Feb 27 Python
通过python实现随机交换礼物程序详解
Jul 10 Python
Python中包的用法及安装
Feb 11 Python
Python代码需要缩进吗
Jul 01 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简洁函数小结
2011/08/12 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
javascript的BOM
2016/05/03 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
vue货币过滤器的实现方法
2017/04/01 Javascript
AngularJS+bootstrap实现动态选择商品功能示例
2017/05/17 Javascript
JavaScript事件处理程序详解
2017/09/19 Javascript
bootstrap-Treeview实现级联勾选
2017/11/23 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
Openlayers显示瓦片网格信息的方法
2020/09/28 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
python类继承用法实例分析
2015/05/27 Python
Python实现的计数排序算法示例
2017/11/29 Python
使用Python+Splinter自动刷新抢12306火车票
2018/01/03 Python
mac 安装python网络请求包requests方法
2018/06/13 Python
python+POP3实现批量下载邮件附件
2018/06/19 Python
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
python issubclass 和 isinstance函数
2019/07/25 Python
python检测服务器端口代码实例
2019/08/31 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
python 工具 字符串转numpy浮点数组的实现
2020/03/14 Python
python实现ssh及sftp功能(实例代码)
2020/03/16 Python
高山背包:High Sierra
2017/11/23 全球购物
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
自我评价的正确写法
2013/09/19 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
综合管理员岗位职责
2015/02/11 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python
python四种出行路线规划的实现
2021/06/23 Python
Python自动操作神器PyAutoGUI的使用教程
2022/06/16 Python