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 相关文章推荐
Windows下搭建python开发环境详细步骤
Jul 20 Python
Python代码缩进和测试模块示例详解
May 07 Python
python实现求两个字符串的最长公共子串方法
Jul 20 Python
Python Pywavelet 小波阈值实例
Jan 09 Python
python django下载大的csv文件实现方法分析
Jul 19 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
Aug 26 Python
PyTorch实现AlexNet示例
Jan 14 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
May 07 Python
什么是Python变量作用域
Jun 03 Python
python右对齐的实例方法
Jul 05 Python
python 命令行传参方法总结
May 25 Python
你喜欢篮球吗?Python实现篮球游戏
Jun 11 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 定界符格式引起的错误
2011/05/24 PHP
浅析linux下apache服务器的配置和管理
2013/08/10 PHP
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
用js实现判断当前网址的来路如果不是指定的来路就跳转到指定页面
2011/05/02 Javascript
JS判断元素为数字的奇异写法分享
2012/08/01 Javascript
JavaScript prototype属性深入介绍
2012/11/27 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
jQuery中的siblings用法实例分析
2015/12/24 Javascript
JavaScript交换两个变量值的七种解决方案
2016/12/01 Javascript
微信小程序 radio单选框组件详解及实例代码
2017/01/10 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
2017/01/13 Javascript
Vue集成Iframe页面的方法示例
2017/12/12 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
[42:32]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第二局
2016/02/27 DOTA
python简单获取本机计算机名和IP地址的方法
2015/06/03 Python
python遍历 truple list dictionary的几种方法总结
2016/09/11 Python
利用Python查看目录中的文件示例详解
2017/08/28 Python
查找python项目依赖并生成requirements.txt的方法
2018/07/10 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
python生成xml时规定dtd实例方法
2020/09/21 Python
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
Tiqets荷兰:出售欧洲最美丽的景点和博物馆门票
2018/01/09 全球购物
纽约市的奢华内衣目的地:Anya Lust
2019/08/02 全球购物
医科大学生毕业的自我评价分享
2013/11/12 职场文书
大学生毕业求职信
2014/06/12 职场文书
交通事故委托书范本
2014/09/28 职场文书
欢迎家长标语
2014/10/08 职场文书
商业门面租房协议书
2014/11/25 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL
docker-compose部署Yapi的方法
2022/04/08 Servers