Simple Life

和这个世界交手这许多年   你是否光彩依旧,兴致盎然...

您现在的位置是:首页 爱折腾 爱折腾详情

使用Fabric加快你的项目部署

发布时间:2016-4-28 作者:Felix 浏览(1561)

    项目开发完了,接下来就得部署。很多时候,部署的步骤、指令等等都是相同的,还有多服务器部署的情况,而且在你新的迭代开发完时,测试同学提出bug或者需求微调,不停的改不停的上线。然后就是无休止的push代码,修改配置,重启等等。如果次数多了,不仅降低了工作效率,还容易出错。

    程序员应该学会偷懒,这时的想法就是用脚本去代替我们工作,重复的步骤固化到脚本里。之前一直是用的IDE自带的tools,最近想着自己实现定制化的工具,Fabric是python的一个库,与linux指令相结合,简化使用ssh的应用部署和系统管理,我用它实现上传到测试环境的工具。


    pip安装fabric,这就不多说了,python版本2.7。

    先试验下简单的例子,这里新建个django工程:

django-admin startproject fabtest

    在工程目录下新建python脚本fabfile.py

    测试代码:

from fabric.api import local

def hello():
    local('ls -lrt')  # local执行本机操作
    print 'hello world'

    在工程目录下执行 fab --list输出可执行的fab函数:

Available commands:

    hello

    执行fab hello,得到输出结果:

[localhost] local: ls -lrt
total 32
drwxr-xr-x  2 felix  staff    68  5 25 15:35 templates
-rwxr-xr-x  1 felix  staff   250  5 25 15:35 manage.py
drwxr-xr-x  9 felix  staff   306  5 25 15:50 fabtest
-rw-r--r--  1 felix  staff  3072  5 25 15:50 db.sqlite3
-rw-r--r--  1 felix  staff   946  5 26 10:23 fabfile.py
-rw-r--r--  1 felix  staff   474  5 26 10:23 fabfile.pyc
hello world
Done.

    至此,简单的示例就完成了,下面看下实际代码部署。

    

一. 项目代码打包

    打包项目代码,去除不必要的文件(静态文件,本地配置,pyc文件等),还是刚才的fabfile中添加。

from fabric.api import local
from fabric.colors import green

def prepare():    
    print green('prepare start#####')  # 打印测试代码,颜色便于观看   
    local('tar -zcvf fabtest.tar.gz --exclude=fabfile.py --exclude=*.pyc --exclude=.svn '          
    '--exclude=*/.DS_Store --exclude=.idea --exclude=*.tar.gz ../fabtest') # 打包压缩项目代码,exclude不必要的文件。  
    print green('prepare ok@@@@@')

    保存并执行fab prepare,工程目录下就已生成项目代码包。     


二.  代码部署

    首先部署到哪个服务器,或者是多台服务器得定义好,有多种定义方法。

    1. 可以直接修改fabric.api中的env

from fabric.api import env
env.hosts = ['host1', 'host2']
env.user = 'root'
env.password = '123456'

    2. 定义role

from fabric.api import env
env.roledefs = {'remote': {'hosts': ['root@host1', 'root@host2']}}
env.passwords = {'root@host1:22': 'password1', 
                 'root@host2:22': 'password2'}

    3. ssh key登陆

    这是官方比较推荐的,ssh key免密码登陆服务器,链接

    

    这里我用了第二种

from fabric.api import env, roles, cd, local, put, run
env.roledefs = {'remote': {'hosts': ['root@host1', 'root@host2']}}
env.passwords = {'root@host1:22': 'password1', 
                 'root@host2:22': 'password2'}

@roles('remote')  # 启用对应的服务器
def deploy():
    put('fabtest.tar.gz', '/home/prod/deploys/fabtest.tar.gz') #上传代码
    with cd('home/prod/deploys/'):  # fabric的context manager的运用,进入指定目录
        run('tar -zxvf fabtest.tar.gz') # 执行服务器指令,解压项目代码
        run('service uwsgi reload') # 重启uwsgi
        run('rm -rf fabtest.tar.gz') # 删除压缩包
    local('rm -rf fabtest.tar.gz') # 删除本地压缩包

    当然这只是我想出的一些,你可能需要更多的操作。


三. 组合你的代码

from fabric.api import execute

def manage():        
    execute(prepare)        
    execute(deploy)

    这样在工程目录下,执行 fab manage,就会依次执行你的指令,打包、上传、部署、配置、重启。

    目前我都是用来上传测试服务器,线上还是得用运维的自动化部署工具,但也确实提高了我的开发效率,原本5*n的时间,现在只要一分钟。

    fabric的接口,在fabric.api中提供了,基础的方法已经够用了,当然还有parallel并行执行等一些用法,需要时可以阅读官方文档


基于 Django 搭建

服务器采用的 阿里云

域名来自 万网

苏ICP备16015443号

©2015-2016 felixglow.com.

GitHub

Design by Felix