使用python fabric写的一个简单的远程部署示例

SDUTACM 2016-09-06

python基础教程:

http://www.runoob.com/python/python-tutorial.html

fabric帮助文档:

http://fabric-chs.readthedocs.io/zh_CN/chs/tutorial.html

一、环境

1 安装python

python版本2.5 – 2.7

mac上安装方式

brew install python

查看版本

python --version

2 安装fabric

mac上安装命令

brew install fabric

二、简单示例程序

这个程序要在多个服务器部署,可以部署多个项目,但是具体部署哪个项目,需要在参数中传入。部署多个服务器时,是依次部署,依次启动的方式,不会导致同时将服务器关闭,到时服务不可用的问题!

该脚本文件名为deploy.py

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

from fabric.api import *
import time

TOMCAT_HOME = "/xxxx/apache-tomcat-8.0.29"
WAR_DIR = "/home/jenkins/.jenkins/xxxx/target/"

#要远程部署的几个服务器
servers = [
	'myserver1',
	'myserver2'
]

#这几个服务器有统一的用户名访问
env.user= "server_username "

#服务器用户密码
env.password = "server_password"

def deploy(projectname):
	for server in servers:
		print("正在部署服务器:" +  server + " 项目名:" + projectname)
		with settings(host_string = server):
			deploy_one_server(projectname)
			print("部署服务器 "+ server +" 项目" + projectname + " 完成!")
			print "休息60秒"
			time.sleep(60)

#部署一个服务器
def deploy_one_server(projectname):
	warfilename = projectname + ".war"
	#1,上传文件到tomcat根目录
	print("1,上传文件到tomcat根目录")
	with lcd(WAR_DIR):
		with cd(TOMCAT_HOME):
			put(warfilename,warfilename)
			run("ls")

	#2,关闭服务器
	print "2,关闭服务器"
	close_tomcat()

	#3,删除原有的部署文件
	print "3,删除原有的部署文件"
	with cd(TOMCAT_HOME + "/webapps/"):
		run("rm -rf " + projectname + "/")
		run("rm -rfv " + warfilename)

	#4,将已上传的文件放到tomcat项目目录
	print "4,将已上传的文件放到tomcat项目目录"
	with cd(TOMCAT_HOME):
		run("mv " + warfilename + " ./webapps/")

	#5,启动服务器
	print "5,启动服务器"
	run(TOMCAT_HOME +"/bin/startup.sh",pty=False)

#关闭tomcat服务器
def close_tomcat():
	#kill可能会因为没有tomcat线程,导致关闭命令失败,所以需要在产生异常时继续执行
	with settings(
		hide('warnings', 'running', 'stdout', 'stderr'),
		warn_only=True
	):
		run("ps -ef |grep tomcat |grep -v grep   |awk -F \" \" '{print $2}' | xargs kill -9")

 

注意:最后启动tomcat时,run方法要使用pty=False

pty在True的情况下启动tomcat正常,但会在结束后导致tomcat进程也被干掉

 参考资料:https://segmentfault.com/q/1010000005131935


脚本调用:

fab -f deploy.py deploy:projectname=xxx

 

 

 

相关推荐

hyxinyu / 0评论 2020-04-27