以前一直用git同步代码到服务器,这种方法一台机器还行,如果多台机器就不急麻烦了,后来用pssh处理多台,也不方便
后来发现了Fabric,发现这个东西部署起来简直太爽了
fabfile.py
#!/usr/bin/env python
# encoding: utf-8
import os
from fabric.api import settings, cd, run, env
#需要部署的机器,都是免密码登录的
env.hosts = ['root@RealserverNet1', 'root@RealserverNet2']
#如果需要输入密码
#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 git@10.10.100.52:/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只会打出警告信息而不会中断执行。