本文从运行环境、python相关知识、fabric参考资料、安装fabric、fabric入门及接口等方面进行了简要介绍,
在此基础上介绍了利用fabric实现web项目自动部署的思路及详细过程。
背景
在向服务器部署项目过程中,实施人员最大的烦劳莫过于修改过多的配置文件了。 假设你一时疏忽忘记修改或改错某些配置,还不得不手动执行停止服务、修改文件、启动服务等操作。 这个过程是一次,也可能需要重复多次。 你或许需要同时部署多台服务器,一样的操作执行多遍,你是不是会觉得又忙,又无趣,还高度紧张无比抓狂? 今天向大家介绍的Fabric,它可以让上述工作变得轻松自如,让我们心情大好。 这篇文章主要目的是讲清楚怎么用Fabric实现项目自动部署,对python、shell相关知识不展开描述, 也不对Fabric所有功能进行介绍。
运行环境
系统:Ubuntu 12.04 (Mac OS 可以使用gsed)
Shell:z-shell
Web容器:tomcat
相关知识
1.python相关知识
由于Fabric是python库,所以我们有必要先了解python的相关语法。 在学习python时,笔者参看的是《简明Python教程》,它比较适合初学python的同学。 不仅从安装、基本概念、运算符、控制流、函数、模块、数据结构、对象、输入输出、 异常、标准库等多个方面进行了介绍,而且有部分练习实例。 另一个python入门指南网址:http://www.pythontab.com/html/pythonshouce27/ 感兴趣的同学还可以看看:https://wiki.python.org/moin/BeginnersGuideChinese
2.简单shell知识
需要了解sed删除、替换内容
什么是Fabric
Fabric是一个python(2.5-2.7)库和命令行工具,主要在于简化使用ssh完成应用程序部署或系统管理任务。 简单说它的特色是执行本地脚本,就可以完成远程服务器部署。 官方文档: http://fabric.readthedocs.org/en/1.8/tutorial.html
安装Fabric
安装Fabric前提是先装了python的相关环境,python安装可以参看《简明Python教程》。 Fabric有三种安装方式, pip install fabric sudo easy_install fabric sudo apt-get install fabric 笔者采用的是最后一种。
Fabric入门
参看网址: http://wklken.me/posts/2013/03/25/python-tool-fabric.html http://www.pythonforbeginners.com/systems-programming/how-to-use-fabric-in-python/
Fabric接口
Fabric 在fabric.api中提供了简单而又强大的命令集合。 你可以简单的这样使用:
local #执行本地命令
run #以用户级别去某具体主机执行远程脚本
sudo #在远程服务器上sudo a command
put #上传本地文件至远端服务器指定目录
get #从远端服务器下载指定文件
prompt #接受用户输入并返回(同raw_input)
reboot #重启远程系统
基于Fabric实现项目自动部署
1.想法
在部署一个项目时通常会按如下几步进行:登录服务器、停止服务、删除原项目(若有)、 部署新项目、修改相关配置文件、启动服务。基于这个想法,可以采用Fabric分步骤编写实现脚本。
2.实现
(1)引入Fabric.api
#在文件头增加 import fabric from fabric.api import *
(2)服务器主机信息
#服务器主机IP及密码,若不写密码,执行时需输入 env.hosts = ['gap@10.11.44.197'] env.password = '123456'#示例
(3)停止服务
#定义停止服务函数
def shutdown():
run('cd ~')
result = run('ps -ef |grep catalina.home=/home/gap/app/apache-tomcat-5\.5\.14 |grep -v grep |awk \'{print $2 }\'')
if result != '':
run('kill -9 %s'%result)
#注:run('/home/gap/app/apache-tomcat-5.5.14/bin/shutdown.sh')不一定能停止服务, 主要原因是shutdown.sh只会关闭startup.sh启动的线程,而无法关闭部署应用的后台线程
(4)删除原项目
#定义删除原项目函数
def rmfile():
run('rm -rf /home/gap/app/apache-tomcat-5\.5\.14/webapps/gap41')
print 'delete file successful'
(5)部署新项目
#定义复制文件及目录函数
def copyfile():
local_directory = '~/GAP41'#根据实际情况修改 with lcd(local_directory):
local('scp -r gap41 gap@10\.11\.44\.197:/home/gap/app/ apache-tomcat-5\.5\.14/webapps/') #注:此处可以优化为先在本地打成tar,然后复制过去,再解压
(6)修改相关配置文件
配置文件修改清单:
- db相关
db.xml
applicationContext.xml
.......
定义修改配置文件函数
#这部分内容太多,举一个修改oscache.properties实例即可
def modifyfile():
......
# modify oscache.properties
#3.oscache.properties
fabric.contrib.files.sed('/home/gap/app/apache-tomcat-5.5.14 /webapps/gap41/WEB-INF/classes/oscache\.properties', before='cache\.path=c:\\\\\\\\myapp\\\\\\\\cache', after='cache\.path=/tmp/gap41/cache', use_sudo=True,backup='.bak')
print 'modify oscache.properties successful' ......
(7)启动服务
#定义启动服务函数 def startup(): run('cd ~') run('set -m; /home/gap/app/apache-tomcat-5.5.14 /bin/startup\.sh') #注:单独使用/home/gap/app/apache-tomcat-5.5.14/bin/startup\.sh'无法启动, 需要加set -m; 才能让tomcat在后台运行。 如果使用/home/gap/app/apache-tomcat-5.5.14/bin/catalina\.sh run', 则在执行脚本的当前窗口会出现后台日志,这种情况 应该也不是我们想看到的结果。
如果想增加执行环境的变量,则可以引入prefix,如下所示
from fabric.context_managers import (prefix)
def startup():
'''startup tomcat '''
with prefix('export LANG=en_US.UTF-8'):
run('cd ~')
run('set -m; %s/bin/startup\.sh'%env.server_tomcat_path)