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 相关文章推荐
在Django中使用Sitemap的方法讲解
Jul 22 Python
Python二分查找详解
Sep 13 Python
Swift 3.0在集合类数据结构上的一些新变化总结
Jul 11 Python
75条笑死人的知乎神回复,用60行代码就爬完了
May 06 Python
如何使用python把ppt转换成pdf
Jun 29 Python
Django之form组件自动校验数据实现
Jan 14 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
Feb 21 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
Apr 25 Python
python中如何写类
Jun 29 Python
python中np是做什么的
Jul 21 Python
Python logging模块进行封装实现原理解析
Aug 07 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
Sep 20 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
动态生成gif格式的图像要注意?
2006/10/09 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
Thinkphp连表查询及数据导出方法示例
2016/10/15 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
2011/06/28 Javascript
Script标签与访问HTML页面详解
2014/01/10 Javascript
Jquery插件分享之气泡形提示控件grumble.js
2014/05/20 Javascript
jQueryMobile之Helloworld与页面切换的方法
2015/02/04 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
2016/01/29 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
在Vue组件化中利用axios处理ajax请求的使用方法
2017/08/25 Javascript
使用 vue-i18n 切换中英文效果
2018/05/23 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
vue项目移动端实现ip输入框问题
2019/03/19 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
Python中的两个内置模块介绍
2015/04/05 Python
Python tkinter事件高级用法实例
2018/01/31 Python
python-django中的APPEND_SLASH实现方法
2019/06/21 Python
python中的列表与元组的使用
2019/08/08 Python
使用python3批量下载rbsp数据的示例代码
2019/12/20 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
咨询公司各岗位职责
2013/12/02 职场文书
挂牌仪式策划方案
2014/05/18 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
龙门石窟导游词
2015/02/02 职场文书
2015年幼儿园学期工作总结
2015/05/22 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
2021/04/24 Python
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL