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中用sleep()方法操作时间的教程
May 22 Python
Python实现简单的语音识别系统
Dec 13 Python
python定时关机小脚本
Jun 20 Python
Python学习笔记之视频人脸检测识别实例教程
Mar 06 Python
python函数的万能参数传参详解
Jul 26 Python
python3 反射的四种基本方法解析
Aug 26 Python
Python qrcode 生成一个二维码的实例详解
Feb 12 Python
基于python3的socket聊天编程
Feb 17 Python
Python %r和%s区别代码实例解析
Apr 03 Python
python3中calendar返回某一时间点实例讲解
Nov 18 Python
python 实现数据库中数据添加、查询与更新的示例代码
Dec 07 Python
Django使用django-simple-captcha做验证码的实现示例
Jan 07 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执行速度全攻略(下)
2006/10/09 PHP
thinkphp下MySQL数据库读写分离代码剖析
2017/04/18 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
一段批量给页面上的控件赋值js
2010/06/19 Javascript
Jquery replace 字符替换实现代码
2010/12/02 Javascript
收集的10个免费的jQuery相册
2011/02/26 Javascript
浅析Cookie中的Path与domain
2013/12/18 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
javascript事件冒泡简单示例
2016/06/20 Javascript
Google 地图获取API Key详细教程
2016/08/06 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
详解springmvc 接收json对象的两种方式
2016/12/06 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
2017/01/16 Javascript
jQueryUI Sortable 应用Demo(分享)
2017/09/07 jQuery
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
JavaScript This指向问题详解
2019/11/25 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
python3实现钉钉消息推送的方法示例
2019/03/14 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
2019/03/30 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
python列表返回重复数据的下标
2020/02/10 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
HTML5的一个显示电池状态的API简介
2015/06/18 HTML / CSS
软件配置管理有什么好处
2015/04/15 面试题
大学生暑期实践感言
2014/02/26 职场文书
周年庆促销方案
2014/03/15 职场文书
大学社团计划书
2014/05/01 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
2016党性教育学习心得体会
2016/01/21 职场文书
Java新手教程之ArrayList的基本使用
2021/06/20 Java/Android
微信小程序中wxs文件的一些妙用分享
2022/02/18 Javascript
一篇文章告诉你如何实现Vue前端分页和后端分页
2022/02/18 Vue.js
利用Apache Common将java对象池化的问题
2022/06/16 Servers