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中不同进制互相转换(二进制、八进制、十进制和十六进制)
Apr 05 Python
详细解读Python中的__init__()方法
May 02 Python
python黑魔法之参数传递
Feb 12 Python
Python中 map()函数的用法详解
Jul 10 Python
基于 Django 的手机管理系统实现过程详解
Aug 16 Python
Python使用random模块生成随机数操作实例详解
Sep 17 Python
Django自带的加密算法及加密模块详解
Dec 03 Python
CentOS7下安装python3.6.8的教程详解
Jan 03 Python
pytorch 准备、训练和测试自己的图片数据的方法
Jan 10 Python
Python3.6 中的pyinstaller安装和使用教程
Mar 16 Python
pandas apply多线程实现代码
Aug 17 Python
Django websocket原理及功能实现代码
Nov 14 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 checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
JavaScript知识点总结(十)之this关键字
2016/05/31 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
JS常用加密编码与算法实例总结
2016/12/22 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
2017/01/08 Javascript
JavaScript Base64 作为文件上传的实例代码解析
2017/02/14 Javascript
Iscrool下拉刷新功能实现方法(推荐)
2017/06/26 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
2018/05/17 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
vue按需加载实例详解
2019/09/06 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
element-ui 本地化使用教程详解
2019/10/28 Javascript
python机器学习实战之树回归详解
2017/12/20 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
django数据库自动重连的方法实例
2019/07/21 Python
如何使用html5与css3完成google涂鸦动画
2012/12/16 HTML / CSS
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
《我不是最弱小的》教学反思
2014/02/23 职场文书
工程安全员岗位职责
2014/03/09 职场文书
电子商务专业毕业生求职信
2014/06/12 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
2015年入党决心书
2015/02/05 职场文书
2015双创工作总结
2015/07/24 职场文书
厉行节约工作总结
2015/08/12 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
班干部竞选演讲稿(精选5篇)
2019/09/24 职场文书
浅谈克隆 JavaScript
2021/11/02 Javascript
springboot+zookeeper实现分布式锁
2022/03/21 Java/Android