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实现的一只从百度开始不断搜索的小爬虫
Aug 13 Python
Python tempfile模块学习笔记(临时文件)
May 25 Python
Python中字符编码简介、方法及使用建议
Jan 08 Python
在IIS服务器上以CGI方式运行Python脚本的教程
Apr 25 Python
整理Python中的赋值运算符
May 13 Python
python实现ID3决策树算法
Dec 20 Python
TensorFlow实现非线性支持向量机的实现方法
Apr 28 Python
Python常见内置高效率函数用法示例
Jul 31 Python
python实现简单http服务器功能
Sep 17 Python
python实现三次样条插值
Dec 17 Python
Pandas统计重复的列里面的值方法
Jan 30 Python
利用PyQt中的QThread类实现多线程
Feb 18 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
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
PHP 高手之路(一)
2006/10/09 PHP
PHP 命令行参数详解及应用
2011/05/18 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
php实现从上传文件创建缩略图的方法
2015/04/02 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
JS 强制设为首页的代码
2009/01/31 Javascript
jQuery 使用个人心得
2009/02/26 Javascript
深入理解JS中的变量及作用域、undefined与null
2014/03/04 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
使用vue-router设置每个页面的title方法
2018/02/11 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
Python linecache.getline()读取文件中特定一行的脚本
2008/09/06 Python
Python实现简单文本字符串处理的方法
2018/01/22 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
Python自动化操作实现图例绘制
2020/07/09 Python
Python使用pycharm导入pymysql教程
2020/09/16 Python
Python之京东商品秒杀的实现示例
2021/01/06 Python
Html5无刷新修改browser Url的方法
2014/01/15 HTML / CSS
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
Square Off美国/加拿大:世界上最聪明的国际象棋棋盘
2018/12/06 全球购物
质量月活动策划方案
2014/03/10 职场文书
2014年3.15团委活动总结
2014/03/16 职场文书
《彭德怀和他的大黑骡子》教学反思
2014/04/12 职场文书
留学经费担保书
2014/05/12 职场文书
干部竞争上岗演讲稿
2014/09/11 职场文书
员工辞职信范文
2015/03/02 职场文书
离婚案件原告代理词
2015/05/23 职场文书
Python一些基本的图像操作和处理总结
2021/06/23 Python
总结Pyinstaller打包的高级用法
2021/06/28 Python