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中删除文件的程序代码
Mar 13 Python
Python基础教程之正则表达式基本语法以及re模块
Mar 25 Python
python 第三方库的安装及pip的使用详解
May 11 Python
python之Character string(实例讲解)
Sep 25 Python
Linux下python与C++使用dlib实现人脸检测
Jun 29 Python
kafka-python批量发送数据的实例
Dec 27 Python
python异步存储数据详解
Mar 19 Python
python模拟斗地主发牌
Apr 22 Python
Python3 搭建Qt5 环境的方法示例
Jul 16 Python
Python还能这么玩之只用30行代码从excel提取个人值班表
Jun 05 Python
Python 中 Shutil 模块详情
Nov 11 Python
Python实战实现爬取天气数据并完成可视化分析详解
Jun 16 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
实用函数8
2007/11/08 PHP
php分页思路以及在ZF中的使用
2012/05/30 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
2015/03/23 PHP
护卫神php套件 php版本升级方法(php5.5.24)
2015/05/10 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
2017/01/17 PHP
用JQuery 实现的自定义对话框
2007/03/24 Javascript
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
2009/04/07 Javascript
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
2009/12/03 Javascript
javascript自定义startWith()和endWith()的两种方法
2013/11/11 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
2015/08/24 Javascript
jquery单击事件和双击事件冲突解决方案
2016/03/02 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
2016/08/16 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
解决vue的过渡动画无法正常实现问题
2019/10/31 Javascript
vue-cli在 history模式下的配置详解
2019/11/26 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
Python实现的数据结构与算法之队列详解
2015/04/22 Python
使用requests库制作Python爬虫
2018/03/25 Python
详解python3中zipfile模块用法
2018/06/18 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
pytorch 获取tensor维度信息示例
2020/01/03 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
Python虚拟环境库virtualenvwrapper安装及使用
2020/06/17 Python
python 中的命名空间,你真的了解吗?
2020/08/19 Python
如何用python开发Zeroc Ice应用
2021/01/29 Python
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
优秀的茶餐厅创业计划书
2014/01/03 职场文书
大学生饮食配送创业计划书
2014/01/04 职场文书
博士生专家推荐信
2015/03/25 职场文书
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript
选购到合适的激光打印机
2022/04/21 数码科技
MongoDB数据库之添删改查
2022/04/26 MongoDB
CSS中calc(100%-100px)不加空格不生效
2023/05/07 HTML / CSS