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装饰器验证配置文件示例
Feb 24 Python
Python实现统计英文单词个数及字符串分割代码
May 28 Python
用python写个自动SSH登录远程服务器的小工具(实例)
Jun 17 Python
pandas删除指定行详解
Apr 04 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
python远程连接MySQL数据库
Apr 19 Python
Pytorch Tensor的索引与切片例子
Aug 18 Python
Python 中使用 PyMySQL模块操作数据库的方法
Nov 10 Python
Python3操作MongoDB增册改查等方法详解
Feb 10 Python
Python 如何对文件目录操作
Jul 10 Python
python中把元组转换为namedtuple方法
Dec 09 Python
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
Apr 21 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读取RSS feed的代码
2008/08/01 PHP
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
mongo Table类文件 获取MongoCursor(游标)的实现方法分析
2013/07/01 PHP
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
JS控制表单提交的方法
2015/07/09 Javascript
浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号
2016/03/22 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
2017/07/13 Javascript
修改npm全局安装模式的路径方法
2018/05/15 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
2019/12/12 Javascript
vue绑定数字类型 value为数字的实例
2020/08/31 Javascript
[59:07]海涛为你详解DOTA2新版本“贤哲秘契”
2014/11/22 DOTA
[04:26]DOTA2上海特锦赛小组赛第二日 TOP10精彩集锦
2016/02/27 DOTA
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
Python中常见的异常总结
2018/02/20 Python
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
django实现用户注册实例讲解
2019/10/30 Python
python pyenv多版本管理工具的使用
2019/12/23 Python
将labelme格式数据转化为标准的coco数据集格式方式
2020/02/17 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
中专生自我鉴定书范文
2013/12/28 职场文书
运动会广播稿400字
2014/01/25 职场文书
《散步》教学反思
2014/03/02 职场文书
歌唱比赛策划方案
2014/06/06 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
二手房购房协议书范本
2014/10/05 职场文书
2014年超市工作总结
2014/11/19 职场文书
党小组推荐意见
2015/06/02 职场文书
校园安全教育心得体会
2016/01/15 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript
MySQL sql_mode修改不生效的原因及解决
2021/05/07 MySQL