自动化脚本

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

自动化脚本

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 回帖

欢迎来到这里!

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

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