虽然大多数我们部署项目通过cicd去部署,但是并不是所有的公司都会有cicd或者有的时候一些小项目不会使用cicd,记录下执行jar包和批量执行,就简单的利用shell脚本、ssh-keygen、expect来实现。
1. 建立ssh认证
首先,需要检查expect是否安装:rpm -qa|grep expect 然后,在操作机上创建公钥:ssh-keygen 一路回车即可 创建好之后到/root/.ssh/下就可以看到id开头的2个文件,其中id_rsa.pub就是公钥文件,需要做的就是将这个文件传送给其他机器:ssh-copy-id -i /root/.ssh/id_rsa.pub root@ip 最后ssh root@ip就实现无密码登录了。
#!/bin/bash #注意: ip.txt 文件格式 # ip:密码 # ip:密码 #批量ssh认证建立 for p in $(cat /data/service/ip.txt) #注意ip.txt文件的绝对路径 do ip=$(echo "$p"|cut -f1 -d":") #取ip.txt文件中的ip地址 password=$(echo "$p"|cut -f2 -d":") #取ip.txt文件中的密码 #expect自动交互开始 expect -c " spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$ip expect { \"*yes/no*\" {send \"yes\r\"; exp_continue} \"*password*\" {send \"$password\r\"; exp_continue} \"*Password*\" {send \"$password\r\";} } " done
2. 准备jar包脚本 app.sh
#!/bin/bash #这里可替换为你自己的执行程序,其他代码无需更改 APP_NAME=app.jar basedir="/data/service" #使用说明,用来提示输入参数 usage() { echo "Usage: sh 执行脚本.sh [start|stop|restart|status]" exit 1 } #检查程序是否在运行 is_exist(){ pid=`ps -ef|grep $basedir/$APP_NAME|grep -v grep|grep -v $0|awk '{print $2}' ` #如果不存在返回1,存在返回0 if [ -z "${pid}" ]; then return 1 else return 0 fi } #启动方法 start(){ is_exist if [ $? -eq "0" ]; then echo "$basedir/${APP_NAME} is already running. pid=${pid} ." else # cd $basedir #nohup java -server -jar $basedir/$APP_NAME -Xms512M -Xmx512M -Xmn20M -Xss256k -XX:+UseConcMarkSweepGC --spring.config.location=$basedir/application-customer.yml >/dev/null 2>&1 & java -server -jar $basedir/$APP_NAME -Xms4096M -Xmx4096M -Xmn256M -Xss256k -XX:+UseConcMarkSweepGC --spring.config.location=$basedir/application.yml fi } #停止方法 stop(){ is_exist if [ $? -eq "0" ]; then kill -9 $pid else echo "$basedir/${APP_NAME} is not running" fi } #输出运行状态 status(){ is_exist if [ $? -eq "0" ]; then echo "$basedir/${APP_NAME} is running. Pid is ${pid}" else echo "$basedir/${APP_NAME} is NOT running." fi } #重启 restart(){ is_exist if [ $? -eq "0" ]; then stop start else start fi } #根据输入参数,选择执行对应方法,不输入则执行使用说明 case "$1" in "start") start ;; "stop") stop ;; "status") status ;; "restart") restart ;; *) usage ;; esac
3. 批量启动执行shell脚本启动停止项目
#!/bin/bash #通过ssh批量执行命令 #使用说明,用来提示输入参数 usage() { echo "Usage: sh 执行脚本.sh [start|stop|restart|status]" exit 1 } #启动方法 start(){ for h in $(cat /data/service/ip.txt|cut -f1 -d":") do ssh root@$h '/data/service/app.sh start' #如果命令是多行的,请参照下面 #ssh root@$h '此处写要执行的命令1' #ssh root@$h '此处写要执行的命令2' done } #输出运行状态 status(){ for h in $(cat /data/service/ip.txt|cut -f1 -d":") do ssh root@$h '/data/service/app.sh status' #如果命令是多行的,请参照下面 #ssh root@$h '此处写要执行的命令1' #ssh root@$h '此处写要执行的命令2' done } #停止方法 stop(){ for h in $(cat /data/service/ip.txt|cut -f1 -d":") do ssh root@$h '/data/service/app.sh stop' #如果命令是多行的,请参照下面 #ssh root@$h '此处写要执行的命令1' #ssh root@$h '此处写要执行的命令2' done } #重启 restart(){ for h in $(cat /data/service/ip.txt|cut -f1 -d":") do ssh root@$h '/data/service/app.sh restart' #如果命令是多行的,请参照下面 #ssh root@$h '此处写要执行的命令1' #ssh root@$h '此处写要执行的命令2' done } #根据输入参数,选择执行对应方法,不输入则执行使用说明 case "$1" in "start") start ;; "stop") stop ;; "status") status ;; "restart") restart ;; *) usage ;; esac