分享自己在 csp 中一键进行部署、调试、查看日志等操作的脚本

2018/8/14 源自  CentOS

csp 调试中编译然后部署,耗费的时间比较长,在以往工作中,积累出自己编写的一个脚本工具,现在基本满足大部分需求,分享给大家使用。
脚本保存为 debugTool.sh 可执行 debugTool.sh -h 查看使用指南。
使用前需要将初始化变量设置为自己本地环境的路径。
脚本中使用 sshpass 作为免密钥远程登录命令工具,需要提前安装。

#! /bin/bash

USAGE="\nUsage: `basename $0` [-h] [-p process] [-host address] [-o operater] [-d debugPackageName] \n
\t -h: 命令行帮助信息 \n
\t -p: 需要操作的主进程 metadata | coordinator | worker | debug \n
\t -host: 远程操作的服务器的IP \n
\t -o: 远程操作指令 log | remote | replace \n
\t -debug: 指定远程服务器包名日志级别为 debug \n\n
\t 示例:\n
\t \t 1、一键编译 coordinator 并替换指定 ip 的 coordinator 并重新启动打开启动日志\n
\t \t debugTool.sh -p coordinator -host 192.168.9.163 -o replace\n
\t \t 2、一键预览 coordinator.log 日志\n
\t \t debugTool.sh -p coordinator -host 192.168.9.163 -o log\n
\t \t 3、一键打开指定服务器 coordinator 为远程调试模式,本地可预览日志\n
\t \t debugTool.sh -p coordinator -host 192.168.9.163 -o remote\n
\t \t 4、worker 同 coordinator .只需要将 -p 替换为 worker 即可\n
\t \t 5、一键指定包名为 debug 模式 \n
\t \t debugTool.sh -p debug -host 192.168.9.163 -d com.lanysec.service.event.jointanalysis\n\n
\t 注意:-p 和 -host 都是必须参数\n
"

# 远程服务器的 ssh 账户密码
user="root"
password="xxx"
# 本地 sshpass 免密钥登录安装目录
sshpass_home="/usr/local/bin/"
# 本地 gradle/bin 目录
gradle_bin_home="/usr/local/opt/gradle/libexec/bin/"
# 本地编译 build 目录
local_build="/Users/zhaojp/Desktop/lanysec/sop-modules/build"
# 本地编译 coordinator 目录
coordinator_from_path="/Users/zhaojp/Desktop/lanysec/sop-modules/sop-coordinator/build/libs/"
# 本地编译后生成的 coordinator jar 包的名称
coordinator_from_file="csp-coordinator-1.0.0.jar"
# 远程替换的 coordinator 的 jar 包的名称
coordinator_del_file="csp-coordinator.jar"
# 远程替换的 coordinator 的 jar 包的路径
coordinator_to_path="/usr/csp/lib/coordinator/"
# 本地编译 worker 的路径
worker_from_path="/Users/zhaojp/Desktop/lanysec/sop-modules/sop-worker/build/libs/"
# 本地编译生成后 worker jar 包的名称
worker_from_file="csp-worker-1.0.0.jar"
# 远程需要替换的 worker jar 包的名称
worker_del_file="csp-worker.jar"
# 远程需要替换的 worker jar 包的路径
worker_to_path="/usr/csp/lib/worker/"
# 远程服务器日志的路径
log_path="/var/log/csp/"
# 本地 metadata 目录
local_metadata="/Users/zhaojp/Desktop/lanysec/metadata"


MM() {
    checker
    if [ $process = "metadata" ]; then
      rsyncMetadata
    elif [ $process = "coordinator" ]; then
      coordinator
    elif [ $process = "worker" ]; then
      worker
    elif [ $process = "debug" ]; then
      debug
    else
      echo " 参数 -p 输入有误,必须是 metadata、coordinator、worker、debug 其中一项。 \n"
      exit 0;
    fi
}

# 检查输入参数
checker() {
  if [[ ! -n "$host" ]] || [[ ! -n "$process" ]]; then
    echo -e ${USAGE}
    exit 0;
  fi
  # 如果没有指定操作命令 默认是替换
  if [[ ! -n "$operater" ]]; then
    operater="replace"
  fi
  /usr/bin/ssh-keyscan $host >> ~/.ssh/known_hosts
  DOUSAGE="\nDO Usage: `basename $0` 开始以下操作 \n
  \t 主机: '$host' \n
  \t 操作主进程:'$process' \n
  \t 进行 '$operater' 操作\n
  \t 调试 '$debugPackageName' 操作\n
  "
  echo -e $DOUSAGE
}

# 启动 debug 日志
debug() {
  if [[ -n "$debugPackageName" ]]; then
    curl -X POST -H "Content-Type: text/plain" -d 'DEBUG' http://$host:10080/api/v1/log/$3
  fi
}

# worker 操作
worker() {
  if [[ -n "$operater" ]] && [[ $operater = 'log' ]]; then

      $sshpass_home/sshpass -p $password ssh -o StrictHostKeyChecking=no -tt $user@$host tail -n 500 -f $log_path"/worker.log"
      echo 'done !';
      exit 0;

  elif [[ -n "$operater" ]] && [[ $operater = 'remote' ]]; then

      #首先停掉定时任务; 其次停掉 coordinator; 远程启动 coordinator
      $sshpass_home/sshpass -p $password ssh -o StrictHostKeyChecking=no -tt $user@$host << EEOOFF
      service iptables stop
      service crond stop
      /usr/csp/bin/worker.sh stop
      cd /usr/csp/lib/worker/
      java -Xmx3g -javaagent:../spring-instrument-4.3.13.RELEASE.jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=38000 -jar csp-worker.jar
EEOOFF
      exit 0;

  elif [[ -n "$operater" ]] && [[ $operater = 'replace' ]]; then

      cd $local_build
      $gradle_bin_home/gradle -PsvnRevison=trunk clean build --refresh-dependencies publishToMavenLocal --parallel --profile -x test
      if [ $host == 'localhost' ] || [ $host == '127.0.0.1' ]; then
          echo '本地编译 worker 已完成。'
          exit 0;
      fi
      #先删除 worker.jar
      echo '删除 '$host ' '$worker_from_file
      $sshpass_home/sshpass -p $password ssh -o StrictHostKeyChecking=no -tt $user@$host rm -rf $worker_to_path$worker_from_file

      #上传jar
      echo '上传 '$worker_from_file ' 到 ' $host
      $sshpass_home/sshpass -p $password scp -o StrictHostKeyChecking=no $worker_from_path$worker_from_file $user@$host:$worker_to_path

      $sshpass_home/sshpass -p $password ssh -o StrictHostKeyChecking=no -tt $user@$host > /dev/null 2>&1 << EEOOFF
      cd $worker_to_path
      rm -rf $worker_del_file
      mv -f $worker_from_file $worker_del_file
      /usr/csp/bin/worker.sh restart
      exit
EEOOFF
      echo 'done !';
      # 查看log
      $sshpass_home/sshpass -p $password ssh -o StrictHostKeyChecking=no -tt $user@$host tail -n 500 -f $log_path"/worker.log"
  else
      echo " 参数 -o 输入有误,必须是 log、remote、replace 其中一项,默认是 replace \n"
      exit 0;
  fi
}


# coordinator 操作
coordinator() {
  if [[ -n "$operater" ]] && [[ $operater = 'log' ]]; then

      $sshpass_home/sshpass -p $password ssh -o StrictHostKeyChecking=no -tt $user@$host tail -n 500 -f $log_path"/coordinator.log"
      echo 'done !';
      exit 0;

  elif [[ -n "$operater" ]] && [[ $operater = 'remote' ]]; then

      # 首先停掉定时任务; 其次停掉 coordinator; 远程启动 coordinator
      $sshpass_home/sshpass -p $password ssh -o StrictHostKeyChecking=no -tt $user@$host << EEOOFF
      service iptables stop
      service crond stop
      /usr/csp/bin/coordinator.sh stop
      cd /usr/csp/lib/coordinator/
      java -Xmx4g -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -javaagent:../spring-instrument-4.3.13.RELEASE.jar -jar csp-coordinator.jar
EEOOFF
      exit 0;

  elif [[ -n "$operater" ]] && [[ $operater = 'replace' ]]; then

      cd $local_build
      $gradle_bin_home/gradle -PsvnRevison=trunk clean build --refresh-dependencies publishToMavenLocal --parallel --profile -x test
      if [ $host == 'localhost' ] || [ $host == '127.0.0.1' ]; then
          echo '本地编译 coordinator 已完成。'
          exit 0;
      fi
      # 先删除 coordinator.jar
      echo '删除 '$host' '$coordinator_from_file
      $sshpass_home/sshpass -p $password ssh -o StrictHostKeyChecking=no -tt $user@$host rm -rf $coordinator_to_path$coordinator_from_file

      # 上传jar
      echo '上传 '$coordinator_from_file ' 到 ' $host
      $sshpass_home/sshpass -p $password scp -o StrictHostKeyChecking=no $coordinator_from_path$coordinator_from_file $user@$host:$coordinator_to_path

      # 执行更新
      $sshpass_home/sshpass -p $password ssh -o StrictHostKeyChecking=no -tt $user@$host > /dev/null 2>&1 << EEOOFF
      cd $coordinator_to_path
      rm -rf $coordinator_del_file
      mv -f $coordinator_from_file $coordinator_del_file
      /usr/csp/bin/coordinator.sh restart
      exit
EEOOFF
      echo 'done !';
      # 查看 log
      $sshpass_home/sshpass -p $password ssh -o StrictHostKeyChecking=no -tt $user@$host tail -n 500 -f $log_path"/coordinator.log"

  else
      echo " 参数 -o 输入有误,必须是 log、remote、replace 其中一项,默认是 replace \n"
      exit 0;
  fi
}

# 同步远程服务器的 metadata 到本地
rsyncMetadata() {
    rm -rf $local_metadata
    META_DIR=/etc/csp/metadata

    $sshpass_home/sshpass -p $password ssh $user@$host "test -d $META_DIR"
    if [ $? -ne 0 ]; then
      META_DIR=/home/bds/metadata/
      echo '检测目录 '${META_DIR}' 不存在,开始同步 '$META_DIR
      $sshpass_home/sshpass -p $password scp -r -P 22 $user@$host:$META_DIR $local_metadata
    else
       echo '检测目录 '${META_DIR}' 存在,开始同步 '$META_DIR
       $sshpass_home/sshpass -p $password scp -r -P 22 $user@$host:$META_DIR $local_metadata
    fi
    echo '同步 '$host':'$META_DIR' metadata 成功 '
    exit 0;
}

until [ $# -eq 0 ]
do
  case "$1" in
        -h | --help)
            echo -e ${USAGE}
            exit 0
            ;;
        -p | --process)
            shift
            process=$1
            shift
            ;;
        -host | --address)
            shift
            host=$1
            shift
            ;;
        -o | --operation)
            shift
            operater=$1
            shift
            # break
            ;;
        -d | --debugPackageName)
            shift
            debugPackageName=$1
            shift
            ;;
        *)
            echo -e ${USAGE} >&2
            exit 1
            ;;
  esac
done

MM