尝试用fabric部署应用


说来惭愧,个人是最近才知道fabric的。但是一上手就觉得fabric非常不错,解决了我长久以来的部署问题。

原因我的部署方式是:

  1. 登录远程服务器
  2. svn update/git pull
  3. deploy.sh

后来觉得把未测试的代码签入代码库不是很好,想直接复制本地代码到远程服务器上再部署,于是第一步变成了:

  1. 打包本地代码文件
  2. scp到远程服务器上
  3. 在远程服务器上解压缩

上面的步骤中既有本地的,也有远程的。
我本来想把上面的操作全部写到一个shell脚本中,每次执行一下就行。远程的操作我先考虑到的是ssh server “command to execute”方式,但是远程需要操作的命令比较多,这样会很长。另外还有个问题是远程deploy后退出服务器,服务突然“消失”了。后来又尝试bash+here document的方式,仍旧遇到第二个问题。没办法,在远程服务器上写一个脚本,用ssh server “command to execute“方式运行,并且在deploy之后tail -f某个日志文件防止退出。于是我的部署就变成本地一个脚本,远程服务器上一个脚本,而且执行完之后还无法退出。

偶尔遇到了fabric,查询了fabric的文档。尝试把本地和远程脚本一起写到fabfile.py中。同样遇到了服务”消失”的问题,通过run(“command”, pty=False)解决。最终脚本如下:

from fabric.api import env, local, run, put 

def redeploy():
  src_pkg = "src-snapshot.tar.gz"
  local("tar czf %s . --exclude --git" % src_pkg)
  put(src_pkg, ".")
  run("rm -rf source logs/*")
  run("mkdir source")
  run("tar xzf %s --directory source" % src_pkg)
  run("deploy.sh", pty=False)
  local("rm -f %s" % src_pkg)

执行方法:

fab -H foo@myserver

大致介绍下fabric的命令:run是执行远程命令,local是本地命令,put是把本地文件上传到远程服务器。

当然fabric不仅仅能用于部署,还能用于日常管理。个人觉得这点可以继续挖据。

,

One response to “尝试用fabric部署应用”

  1. […] 接上篇。 最近学习rsync,突然想到自己之前使用fabric上传工程时与其用tar上传再解压缩还不如用rsync增量传输,后者可以更快。查了下fabric的文档,发现有提供几个方法: […]