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异步任务队列示例
Apr 01 Python
Python实现读取文件最后n行的方法
Feb 23 Python
Python算法之求n个节点不同二叉树个数
Oct 27 Python
Python实现针对给定字符串寻找最长非重复子串的方法
Apr 21 Python
python 自动去除空行的实例
Jul 24 Python
python3.7.0的安装步骤
Aug 27 Python
python实现屏保程序(适用于背单词)
Jul 30 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
Feb 27 Python
django 实现简单的插入视频
Apr 07 Python
python模拟斗地主发牌
Apr 22 Python
解决python图像处理图像赋值后变为白色的问题
Jun 04 Python
python下载的库包存放路径
Jul 27 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配置文件php.ini的路径的方法
2014/08/20 PHP
php中$_POST与php://input的区别实例分析
2015/01/07 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
JavaScript为对象原型prototype添加属性的两种方式
2010/08/01 Javascript
19个很有用的 JavaScript库推荐
2011/06/27 Javascript
jQuery移动和复制dom节点实用DOM操作案例
2012/12/17 Javascript
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
jQuery中prev()方法用法实例
2015/01/08 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
javascript封装 Cookie 应用接口
2015/08/07 Javascript
js下拉选择框与输入框联动实现添加选中值到输入框的方法
2015/08/17 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
JavaScript的setter与getter方法
2017/11/29 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
require.js 加载过程与使用方法介绍
2018/10/30 Javascript
Jquery实现无缝向上循环滚动列表的特效
2019/02/13 jQuery
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
如何更优雅地写python代码
2019/07/02 Python
Python sqlite3查询操作过程解析
2020/02/20 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
python实现图片转字符画的完整代码
2021/02/21 Python
一份婚庆公司创业计划书
2014/01/11 职场文书
安全资金保障制度
2014/01/23 职场文书
汽车维修专业自荐书
2014/05/26 职场文书
捐助感谢信
2015/01/22 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
如何给HttpServletRequest增加消息头
2021/06/30 Java/Android