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使用MD5加密字符串示例
Aug 22 Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 Python
Python中的字符串查找操作方法总结
Jun 27 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
Apr 26 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
Python3实现转换Image图片格式
Jun 21 Python
python 批量解压压缩文件的实例代码
Jun 27 Python
Python集合操作方法详解
Feb 09 Python
使用Python发现隐藏的wifi
Mar 04 Python
python判断字符串以什么结尾的实例方法
Sep 18 Python
用python实现一个简单计算器(完整DEMO)
Oct 14 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
Feb 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中基本符号及使用方法
2010/03/23 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
Javascript面象对象成员、共享成员变量实验
2010/11/19 Javascript
JS获取页面input控件中所有text控件并追加样式属性
2013/02/25 Javascript
jquery教程ajax请求json数据示例
2014/01/13 Javascript
JS中怎样判断undefined(比较不错的方法)
2014/03/27 Javascript
javascript跨域的4种方法和原理详解
2014/04/08 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
JavaScript比较同一天的时间大小实例代码
2018/02/09 Javascript
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
js中DOM事件绑定分析
2018/03/18 Javascript
vue移动端城市三级联动组件使用详解
2019/07/26 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
2019/09/09 Javascript
vue项目中使用rem,在入口文件添加内容操作
2020/11/11 Javascript
[01:02:18]VGJ.S vs infamous Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
Python简单实现子网掩码转换的方法
2016/04/13 Python
Python 私有函数的实例详解
2017/09/11 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
Django+JS 实现点击头像即可更改头像的方法示例
2018/12/26 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
利用Python检测URL状态
2019/07/31 Python
python使用自定义钉钉机器人的示例代码
2020/06/24 Python
利用SVG和CSS3来实现一个炫酷的边框动画
2015/07/22 HTML / CSS
中国第一家杂志折扣订阅网:杂志铺
2016/08/30 全球购物
俄罗斯名牌服装网上商店:UNIQUE FABRIC
2019/07/25 全球购物
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
求职简历的自我评价怎样写好
2013/10/07 职场文书
高三自我鉴定范文
2013/10/19 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
养成教育工作总结
2015/08/13 职场文书
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL
抖音动画片,皮皮虾,《治愈系》动画在用这首REMIX作为背景音乐,Anak ,The last world with you完整版
2022/03/16 杂记