自动化脚本

本贴最后更新于 2326 天前,其中的信息可能已经水流花落

自动化脚本

18d8bc3eb13533fa2c3f5003a3d3fd1f41345b16jpg

当前市面上已经有很多自动化的项目,如果只是想实现简单的自动化,可以使用自己的自动化脚本,如果任务不复杂,自己实现起来也是比较简单的,还可以自己定制。用什么语言实现都可以,我选择的是 python 因为其足够简单。

如何写自动化脚本

  1. 选择自己顺手的语言
  2. 使用 ssh 框架连接服务器
  3. 上传项目包
  4. 执行包处理逻辑
  5. 启动服务
  6. 打印日志

代码

目前只是单机代码,目的是学习和研究,如果想要实现集群部署,还是使用 saltstack 这种成熟的框架比较好。

下面是一个小例子

#!/usr/bin/python # coding:utf8 import json import os import sys import threading import time import paramiko # ssh服务器配置信息 host = '' port = username = '' password = '' # 项目根路径 projectRootPath = '' # 本地包位置 localPackageName = '' # 要传到服务器的包位置 remotePackageName = '' # 上传之前执行命令 beforeCmd = '' # 上传之后执行命令,替换prod文件 afterCmd = '' # 服务重启命令 restartCmd = '' # 日志命令 logCmd = '' # 默认配置 mvn = True upload = True restart = True logResult = True # 控制结束的标识 def controlEnd(): value = 0 while True: if value == 8: print('bye bye') break value = int(input("are you ok")) print('value is ' + '-' * 30 + str(value)) # 打印log def log(ssh): stdin, stdout, stderr = ssh.exec_command(logCmd) while True: try: logContent = stdout.readline().replace('\n', '') print(logContent) except: pass # 执行命令并打印结果 def execCommandAndPrint(ssh, command, startLog='', endLog=''): if startLog != '': print(startLog) print(command) stdin, stdout, stderr = ssh.exec_command(command) print(stdout.read().decode('utf8')) if endLog != '': print(endLog) # ssh连接 def sshConnect(hostname, username, password, port): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=hostname, port=port, username=username, password=password) return ssh oldPercents = 0 t1 = time.time() uploadFileSize = 0 # 进度条 def progress_bar(transferred, toBeTransferred, suffix=''): global uploadFileSize global t1 if uploadFileSize == 0: uploadFileSize = toBeTransferred bar_len = 60 filled_len = int(round(bar_len * transferred / float(toBeTransferred))) percents = round(100.0 * transferred / float(toBeTransferred), 1) bar = '=' * filled_len + '-' * (bar_len - filled_len) global oldPercents # 以2为上传进度输出信息 if percents - oldPercents > 2: t2 = time.time() # 网速kb/s speed = round(((percents - oldPercents) / 100) * uploadFileSize / 1024 / (t2 - t1), 2) print('[%s] %s%s %skb/s%s\r' % (bar, percents, '%', speed, suffix)) oldPercents = percents t1 = t2 if __name__ == "__main__": if len(sys.argv) > 1: argv = sys.argv[1] loads = json.loads(argv) mvn = loads['mvn'] == "True" upload = loads['upload'] == "True" restart = loads['restart'] == "True" logResult = loads['log'] == "True" projectRootPath = loads['projectRootPath'] host = loads['host'] port = int(loads['port']) username = loads['username'] password = loads['password'] print(os.getcwd()) # 1.mvn构建 if mvn: print("开始构建...") os.chdir(projectRootPath) os.system("mvn clean package -DskipTests") # 2.连接ssh服务器 print("正在连接远程服务器" + "." * 15) ssh = sshConnect(host, username=username, password=password, port=port) print("已连接远程服务器" + "." * 15) if upload: # 3.前置处理包,解压移动删除等 execCommandAndPrint(ssh, beforeCmd, startLog='开始处理压缩包...') # 4.上传jar包 print('开始上传包...' + localPackageName + "," + remotePackageName) sftp = ssh.open_sftp() put = sftp.put(localPackageName, remotePackageName, callback=progress_bar) print('上传成功') # 5.后置处理,删除上传的jar包等 execCommandAndPrint(ssh, afterCmd, startLog='开始解压压缩包...') if restart: # 6.重启服务 execCommandAndPrint(ssh, restartCmd, endLog='重启成功' + '.' * 15) if logResult: # 7.打印日志 t = threading.Thread(target=log, args=(ssh,)) t.setDaemon(True) t.start() controlEnd() ssh.close()

相关帖子

1 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...