使用Fabric部署网站应用

以前一直用git同步代码到服务器,这种方法一台机器还行,如果多台机器就不急麻烦了,后来用pssh处理多台,也不方便
后来发现了Fabric,发现这个东西部署起来简直太爽了

创建一下脚本fabfile.py

#!/usr/bin/env python
# encoding: utf-8
import os

from fabric.api import settings, cd, run, env

#需要部署的机器,都是免密码登录的
env.hosts = ['[email protected]', '[email protected]']
#如果需要输入密码
#env.password = 'pwd'

project = "my_flask"
project_path = os.path.join("/var/www", project)
def clone():
    """ clone项目 """
    with cd("/var/www"):
        run("rm -fr %s" % project)
        run("sudo -u www-data git clone [email protected]:/home/git/%s" % project)

def pull():
    """ 更新代码 """
    with cd(project_path):
        run("sudo -u www-data git pull")

def uwsgi_init():
    """ 初始化uwsgi """
    with settings(warn_only=True):
        run("uwsgi --stop /tmp/%s.pid"%project)
    run("sleep 1")
    run("sudo -u www-data uwsgi --ini %s"%(os.path.join(project_path, "uwsgi.ini")))
    run("sleep 1")
    run("ps -aux|grep %s||grep -v grep"%(os.path.join(project_path, "uwsgi.ini")))

def uwsgi_reload():
    """ 更新代码并且重新加载uwsgi """
    run("sudo -u www-data uwsgi --reload /tmp/%s.pid"%project)


def update():
    """ 更新代码并且重新加载uwsgi """
    pull()
    uwsgi_reload()

执行

fab clone 
fab uwsgi_init

每台机器上都克隆并且启动服务了

脚本默认为fabfile.py, 如果修改脚本名 必须加-f参数
fab -f a1.py clone

每次代码提交后更新

fab update 

Fabric最常用的是local()和run(),分别在本地和远程执行命令,put()可以把本地文件上传到远程,当需要在远程指定当前目录时,只需用with cd(‘/path/to/dir/’):即可。

默认情况下,当命令执行失败时,Fabric会停止执行后续命令。有时,我们允许忽略失败的命令继续执行,
比如run(“uwsgi –stop /tmp/%s.pid”%project) 在pid文件不存在的时候有可能失败,这时可以用with settings(warn_only=True):执行命令,这样Fabric只会打出警告信息而不会中断执行。

阅读更多

更多精彩内容