背景

每次版本上线后,陆续会有现网反馈的 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


↙↙↙阅读原文可查看相关链接,并与作者交流