版本更新发布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新鲜出炉的代码了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#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,该函数就仅仅完成上面函数的最后一步,通知测试或正式环境的服务器执行更新代码的操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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等)操作。

1
2
3
4
$ cat project1.sls
/home/update/projectdir/project1.sh:
cmd:
- run

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

1
2
3
4
5
6
7
8
9
10
11
$ 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/正式环境目录/
----------------本文结束 感谢阅读----------------