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实现的各种排序算法代码
Mar 04 Python
python模块restful使用方法实例
Dec 10 Python
python实现简单点对点(p2p)聊天
Sep 13 Python
python利用有道翻译实现"语言翻译器"的功能实例
Nov 14 Python
详解django.contirb.auth-认证
Jul 16 Python
对Python3.6 IDLE常用快捷键介绍
Jul 16 Python
Python对HTML转义字符进行反转义的实现方法
Apr 28 Python
python绘制评估优化算法性能的测试函数
Jun 25 Python
pytorch 在sequential中使用view来reshape的例子
Aug 20 Python
python中二分查找法的实现方法
Dec 06 Python
python 数据类型强制转换的总结
Jan 25 Python
linux系统下pip升级报错的解决方法
Jan 31 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下实现折线图效果的代码
2007/04/28 PHP
CodeIgniter基本配置详细介绍
2013/11/12 PHP
php foreach正序倒序输出示例代码
2014/07/01 PHP
smarty表格换行实例
2014/12/15 PHP
使用ajax+jqtransform实现动态加载select
2014/12/01 Javascript
js实现照片墙功能实例
2015/02/05 Javascript
jquery UI Datepicker时间控件的使用及问题解决
2016/04/28 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
vue服务端渲染的实例代码
2017/08/28 Javascript
javascript帧动画(实例讲解)
2017/09/02 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
vue prop属性传值与传引用示例
2019/11/13 Javascript
javascript实现移动端轮播图
2020/12/09 Javascript
Python中__init__和__new__的区别详解
2014/07/09 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
使用python实现飞机大战游戏
2020/03/23 Python
python如何输出反斜杠
2020/06/18 Python
去除python中的字符串空格的简单方法
2020/12/22 Python
Python基于爬虫实现全网搜索并下载音乐
2021/02/14 Python
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
美国波西米亚风格服装品牌:Show Me Your Mumu
2018/01/05 全球购物
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
体育专业个人的求职信范文
2013/09/21 职场文书
行政助理岗位职责
2013/11/10 职场文书
汽车专业毕业生推荐信
2013/11/12 职场文书
颁奖典礼主持词
2014/03/25 职场文书
合作协议书
2014/04/23 职场文书
节能环保口号
2014/06/12 职场文书
食品安全承诺书范文
2014/08/29 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
机修车间主任岗位职责
2015/04/08 职场文书
vue完美实现el-table列宽自适应
2021/05/08 Vue.js
使用Ajax实现进度条的绘制
2022/04/07 Javascript