背景
在向服务器部署项目过程中,实施人员最大的烦劳莫过于修改过多的配置文件了。
假设你一时疏忽忘记修改或改错某些配置,还不得不手动执行停止服务、修改文件、启动服务等操作。
这个过程是一次,也可能需要重复多次。
你或许需要同时部署多台服务器,一样的操作执行多遍,你是不是会觉得又忙,又无趣,还高度紧张无比抓狂?
今天向大家介绍的Fabric,它可以让上述工作变得轻松自如,让我们心情大好。
这篇文章主要目的是讲清楚怎么用Fabric实现GAP集成自动部署,对python、shell相关知识不展开描述,
也不对Fabric所有功能进行介绍。
运行环境
系统:Ubuntu 12.04
shell:z-shell
web容器:tomcat
数据库:oracle10g
相关知识
使用Fabric需要但不限于下面的相关知识:
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实现GAP自动部署
1.想法
在部署一个项目时通常会按如下几步进行:登录服务器、停止服务、删除原项目(若有)、
部署新项目、修改相关配置文件、启动服务。基于这个想法,可以采用Fabric分步骤编写实现脚本。
2.实现
(1)引入Fabric.api
#在文件头增加
import fabric
from fabric.api import *
(2)服务器主机信息
#服务器主机IP及密码,若不写密码,执行时需输入
env.hosts = ['user@11.12.13.181']
env.password = '123456'#示例
(3)停止服务
#定义停止服务函数
def shutdown():
run('cd ~')
result = run('ps -ef |grep catalina.home=/home/user/app/apache-tomcat-5\.5\.14
|grep -v grep |awk \'{print $2 }\'')
if result != '':
run('kill -9 %s'%result)
#注:run('/home/user/app/apache-tomcat-5.5.14/bin/shutdown.sh')不一定能停止服务,
主要原因是shutdown.sh只会关闭startup.sh启动的线程,而无法关闭部署应用的后台线程
(4)删除原项目
#定义删除原项目函数
def rmfile():
run('rm -rf /home/user/app/apache-tomcat-5\.5\.14/webapps/gap')
print 'delete file successful'
(5)部署新项目
#定义复制文件及目录函数
def copyfile():
local_directory = '~/GAP'#根据实际情况修改
with lcd(local_directory):
local('scp -r gap user@11\.12\.13\.181:/home/user/app/apache-tomcat-5\.5\.14/webapps/')
#注:此处可以优化为先在本地打成tar,然后复制过去,再解压
(6)修改相关配置文件
配置文件修改清单:
- db相关
db.xml
- 日志
log4j.properties
- 缓存
oscache.properties
- 接口权限
applicationContext-api.xml
- Tomcat中conf/server.xml
#方法1:手工修改所有相关文件后,再copy到某个备用目录,第(5)执行后,再copy覆盖对应文件
#方法2:定义修改配置文件函数
#这部分内容太多,举一个修改oscache.properties实例即可
def modifyfile():
......
# modify oscache.properties
#3.oscache.properties
fabric.contrib.files.sed('/home/user/app/apache-tomcat-5.5.14
/webapps/gap/WEB-INF/classes/oscache\.properties',
before='cache\.path=c:\\\\\\\\myapp\\\\\\\\cache',
after='cache\.path=/tmp/gap/cache',
use_sudo=True,backup='.bak')
print 'modify oscache.properties successful'
......
(7)启动服务
#定义启动服务函数
def startup():
run('cd ~')
run('set -m; /home/user/app/apache-tomcat-5.5.14
/bin/startup\.sh')
#注:单独使用/home/user/app/apache-tomcat-5.5.14/bin/startup\.sh'无法启动,
需要加set -m; 才能让tomcat在后台运行。
如果使用/home/user/app/apache-tomcat-5.5.14/bin/catalina\.sh run',
则在执行脚本的当前窗口会出现后台日志,这种情况
应该也不是我们想看到的结果。
实例脚本之汇总
#定义自动部署方法
def autodeploy():
shutdown()
rmfile()
copyfile()
modifefile()
startup()
运行方式:fab -H user@11.12.13.181 autodeploy