自动化脚本
当前市面上已经有很多自动化的项目,如果只是想实现简单的自动化,可以使用自己的自动化脚本,如果任务不复杂,自己实现起来也是比较简单的,还可以自己定制。用什么语言实现都可以,我选择的是 python 因为其足够简单。
如何写自动化脚本
- 选择自己顺手的语言
- 使用 ssh 框架连接服务器
- 上传项目包
- 执行包处理逻辑
- 启动服务
- 打印日志
代码
目前只是单机代码,目的是学习和研究,如果想要实现集群部署,还是使用 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()
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于