每次版本上线后,陆续会有现网反馈的 bug 需要修复,这个时候研发会给一些 web.zip 形式的替换文件进行测试、上线修复 bug。而每次在测试环境部署时,总是有人不进行备份,直接 cp 过去覆盖,后续如果有问题回滚比较麻烦,同时需要敲一堆命令,较为繁琐,为了方便操作,遂写了一个简单的脚本,实现自动上传、备份、部署的操作。
1.从 Jira 下载 web.zip 压缩包至本地并解压(个人是下载在 D:\file)
2.运行代码,如果需要重启服务器,输入:1 ,不需要重启则输入:0
3.喝杯水休息,等待服务器重启成功
首先是一些下面需要用的方法,连接服务器、上传文件、执行 linux 命令、关闭服务器连接。
这些主要是 paramiko 这个库的一些操作,作为测试人员这一块可能接触的比较少,一般运维的工程师可能了解更多一点,我也只是懂一点皮毛,没有深入研究
def trans_connect(host,username,password):
try:
trans = paramiko.Transport((host,22))
trans.connect(username=username,password=password)
except Exception,e:
print e
return trans
def trans_web(trans,remotepath,localpath):
sftp = paramiko.SFTPClient.from_transport(trans)
sftp.put(localpath,remotepath)
trans.close()
def ssh_connect(host,username,password):
try:
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(host,22,username,password)
except Exception ,e:
print e
return ssh_client
def ssh_exec_cmd(ssh_client,cmd,arg):
return ssh_client.exec_command(cmd,arg)
def ssh_close(ssh_client):
ssh_client.close()
下面便是主要的脚本:
其中打印文件夹中的所有文件,不包括文件夹这几行代码,我借鉴百度上的一个 ideal,说实话我还没太看懂这段,蜜汁尴尬
为什么在执行命令的时候,要加上 arg 呢?
一开始我是默认 get_pty=True 写死的,后来发现在重启服务的时候 service tomcat_iorder_appsvr restart ,服务停掉就起不来了
后来找了不少资料,试着将 get_pty=False 重启了一遍服务,发现就好了,至于原因我也是没太了解,欢迎懂得兄弟帮我解答一下
def main():
host = '172.31.x.xxx'
username = 'root'
password = 'xxxxxxxx123'
remotepath = '/opt/web/web.zip'
localpath = r'D:/file/web.zip' -----存放web.zip地址
#删除并创建新的web文件夹
print u'开始删除opt下web,并创建新web\n'
cmd = 'cd /opt;rm -rf web;mkdir web;ls'
arg = 'get_pty=True'
ssh_client=ssh_connect(host,username,password)
stdin, stdout, stderr = ssh_exec_cmd(ssh_client,cmd,arg)
for line in stdout:
print line.strip('\n')
ssh_close(ssh_client)
#上传文件
print u'开始上传文件\n'
trans = trans_connect(host,username=username,password=password)
trans_web(trans,remotepath=remotepath,localpath=localpath)
#解压并删除压缩包
print u'解压并删除压缩包\n'
cmd = 'cd /opt/web;ls;unzip web.zip;rm -rf web.zip;ls'
ssh_client=ssh_connect(host,username,password)
stdin, stdout, stderr = ssh_exec_cmd(ssh_client,cmd,arg)
for line in stdout:
print line.strip('\n')
ssh_close(ssh_client)
#备份需要替换的文件
print u'开始备份需要替换的文件'
path=r'D:\\file\\web'
fns=[os.path.join(root,fn) for root,dirs,files in os.walk(path) for fn in files]
for f in fns:
oldfile = '/home/iorder_appsvr/iorder_appsvr'+ str(f[9:].replace('\\','/'))
newfile = oldfile + str(time.strftime("%y%m%d")) + 'bak'
cmd = "mv %s %s"%(oldfile,newfile)
ssh_client=ssh_connect(host,username,password)
stdin, stdout, stderr = ssh_exec_cmd(ssh_client,cmd,arg)
for line in stdout:
print line.strip('\n')
ssh_close(ssh_client)
time.sleep(1)
print(u'总计:'+ str(len(fns)) +u'个 备份完成')
#复制文件至appsvr
ssh_client=ssh_connect(host,username,password)
cmd = '\cp -Rf /opt/web/ /home/iorder_appsvr/iorder_appsvr/'
stdin, stdout, stderr = ssh_exec_cmd(ssh_client,cmd,arg)
for line in stdout:
print line.strip('\n')
time.sleep(2)
#重启服务
print u"是否需要重启服务器,是请输入1,否请输入0"
result = raw_input(u'是否需要重启服务器:')
result = int(result)
if result == 1:
cmd = 'service tomcat_iorder_appsvr restart'
arg = 'get_pty=False'
ssh_client=ssh_connect(host,username,password)
stdin, stdout, stderr = ssh_exec_cmd(ssh_client,cmd,arg)
for line in stdout:
print line.strip('\n')
time.sleep(2)
ssh_close(ssh_client)
else:
ssh_close(ssh_client)
if __name__ == "__main__":
main()
That's all