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.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 Python
回调函数的意义以及python实现实例
Jun 20 Python
教你用Python创建微信聊天机器人
Mar 31 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
Jul 06 Python
python简单操作excle的方法
Sep 12 Python
python Django中models进行模糊查询的示例
Jul 18 Python
Anaconda的安装及其环境变量的配置详解
Apr 22 Python
Django 允许局域网中的机器访问你的主机操作
May 13 Python
Keras使用ImageNet上预训练的模型方式
May 23 Python
Python StringIO及BytesIO包使用方法解析
Jun 15 Python
Django如何批量创建Model
Sep 01 Python
python实现求纯色彩图像的边框
Apr 08 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
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
2007/09/30 PHP
最新的php 文件上传模型,支持多文件上传
2009/08/13 PHP
PHP求最大子序列和的算法实现
2011/06/24 PHP
在smarty中调用php内置函数的方法
2013/02/07 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
2013/06/03 PHP
Prototype使用指南之ajax
2007/01/10 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
js 赋值包含单引号双引号问题的解决方法
2014/02/26 Javascript
node.js中的fs.mkdir方法使用说明
2014/12/17 Javascript
jquery实现勾选复选框触发事件给input赋值
2015/02/01 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
JS模仿手机端九宫格登录功能实现代码
2016/04/28 Javascript
JavaScript lodash常见用法系列小结
2016/08/24 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
vue.js移动数组位置,同时更新视图的方法
2018/03/08 Javascript
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
详解处理bootstrap4不支持远程静态框问题
2018/07/20 Javascript
在Vue中使用axios请求拦截的实现方法
2018/10/25 Javascript
微信小程序加载机制及运行机制图解
2019/11/27 Javascript
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
2021/01/25 Javascript
python实现求最长回文子串长度
2018/01/22 Python
Python从单元素字典中获取key和value的实例
2018/12/31 Python
12个Python程序员面试必备问题与答案(小结)
2019/06/24 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
2020/03/24 Python
Python中全局变量和局部变量的理解与区别
2021/02/07 Python
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
幼儿园感恩节活动方案
2014/10/06 职场文书
组织生活会表态发言材料
2014/10/17 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
离婚协议书格式范本
2016/03/18 职场文书