版本更新发布WEB化(4)_用saltAPI来操作git库

运维平台的代码可以随便放在一台合适的服务器上面,并不需要在该台服务器上有saltstack或git,因为saltAPI可以实现你几乎所需的操作或功能,用好saltAPI就可以了。关于代码的更新、提交、下发、同步操作就用saltsatck和saltAPI来做就好。
其实一个自定义函数updateObject()就可以搞定所有的,考虑git server提交更新完成后,测试服务器pull到本地测试环境,经过测试环境的测试没有问题,再下发到正式环境时就不需要再反复的向server提交更新代码了,正式环境的服务器直接pull到本地就行了,所以又堆了个函数pushObject()。

1、提交更新下发文件函数updateObject在第2篇中提到过,下面详细扯扯:
更新的代码文件拷贝到workdir目录后经过git.add、git.status、git.commit一系列操作后就可以git.push到serverdir目录了,然后正式或测试服务器就可以愉快的git.pull新鲜出炉的代码了。

#gname是salt的分组后的组名,正式环境当然用正式环境的那组服务器了
#lsfile是salt服务器上的sls文件,接下来介绍
#falg标识是发布到正式环境还是发布到测试环境
def updateObject(workdir, serverdir, slsfile, gname, comminfo, flag):
	workdir = r'/opt/git/' + workdir
	serverdir = r'/opt/git/' + serverdir
	sapi = saltAPI()
	params = {'client':'local', 'tgt':'git server服务器的key', 'fun':'git.add', 'arg1':workdir, 'arg2':workdir}
	Info = sapi.saltCmd(params)
	params = {'client':'local', 'tgt':'git server服务器的key', 'fun':'git.status', 'arg1':workdir}
	Info.append(sapi.saltCmd(params))
	params = {'client':'local', 'tgt':'git server服务器的key', 'fun':'git.commit', 'arg1':workdir, 'arg2':comminfo}
	Info.append(sapi.saltCmd(params))
	params = {'client':'local', 'tgt':'git server服务器的key', 'fun':'git.push', 'arg1':workdir, 'arg2':serverdir, 'arg3':r"branch='master'"}
	Info.append(sapi.saltCmd(params))
	#//////////////////#
	if flag:
		params = {'client':'local', 'tgt':'测试环境服务器的key', 'fun':'state.sls', 'arg1':slsfile}
		pullinfo = sapi.saltCmd(params)
	else:
		params = {'client':'local', 'tgt':gname, 'expr_form':'nodegroup', 'fun':'state.sls', 'arg1':slsfile}
		pullinfo = sapi.saltCmd(params)
	#///////////////#
	repullinfo = []
	for key in pullinfo[0]:
		repullinfo.append(key)
		repullinfo.append(pullinfo[0][key].values()[0]['name'])
		repullinfo.append(pullinfo[0][key].values()[0]['result'])
	res = [Info[1][0]['git server服务器的key'], Info[2][0]['git server服务器的key'], repullinfo]
	return res

2、仅仅执行下发命令的函数pushObject,该函数就仅仅完成上面函数的最后一步,通知测试或正式环境的服务器执行更新代码的操作。

def pushObject(workdir, serverdir, slsfile, gname, flag):
	workdir = r'/opt/git/' + workdir
	serverdir = r'/opt/git/' + serverdir
	sapi = saltAPI()
	Info = [[{'git server服务器的key':'Not git add'}], [{'git server服务器的key':'Not git status'}], [{'git server服务器的key':'Not git commit'}], [{'git server服务器的key':'Not git push'}]]
	#//////////////////#
	if flag:
		params = {'client':'local', 'tgt':'测试环境服务器的key', 'fun':'state.sls', 'arg1':slsfile}
		pullinfo = sapi.saltCmd(params)
	else:
		params = {'client':'local', 'tgt':gname, 'expr_form':'nodegroup', 'fun':'state.sls', 'arg1':slsfile}
		pullinfo = sapi.saltCmd(params)
	#///////////////#
	repullinfo = []
	for key in pullinfo[0]:
		repullinfo.append(key)
		repullinfo.append(pullinfo[0][key].values()[0]['name'])
		repullinfo.append(pullinfo[0][key].values()[0]['result'])
	res = [Info[1][0]['git server服务器的key'], Info[2][0]['git server服务器的key'], repullinfo]
	return res

3、在saltstack上的sls文件,写的很简单就是在测试或正式环境的服务器上执行更新代码(git pull、rsync、backup等)操作。

[root@xxx-xxx-xxx xxx]# cat project1.sls
/home/update/projectdir/project1.sh:
  cmd:
    - run

4、sls文件的功能说到底就是执行一个更新脚本,更新脚本做了git.pull从git server上获取新鲜的代码,rsync将获取到的代码同步到生产环境的目录,备份被更新的代码这三件事。

[root@xxx-xxx-xx projectdir]# cat project.sh
#!/bin/bash
DATE1=`date '+%Y_%m_%d_%H_%M'`
cd /home/update/projectdir/subproject1.git
git pull git://git server服务器IP:监听的端口/subproject1/subproject1.server master
bakdir='/home/update/projectdir/bak/projectdir_bak_'$DATE1
mkdir -p $bakdir
rsync -qcrlb --delete --backup-dir=$bakdir --exclude-from=/home/update/projectdir/project.exclude /home/update/projectdir/subproject1.git/ /opt/正式环境目录/ --log-file=/opt/log/projectdir/subproject1_$DATE1.log
chown -R user.user /opt/正式环境目录/

转载请注明出去:http://www.xiaomastack.com/2014/10/13/release-4/ 谢谢!

发表评论:

你的电子邮件地址将不会被公开.

82 + = 83