共计 2061 个字符,预计需要花费 6 分钟才能阅读完成。
之前有写到 Jenkins 打包微服务教程-一个配置文件即可打包所有模块,其中构建后操作使用到了 Publish Over SSH 这个插件,当有很多主机时,会显得很麻烦,而且需要另外页面去配置。
于是就把构建后操作里面的运行镜像修改为只使用 shell 脚本的方式来实现。代码如下:
# 准备工作 -> 1. 定义主机 2.获取工作目录 3. 连接新主机不询问是否添加到known_hosts
cat > hosts.txt <<EOF
172.26.1.21 root xxx dev_test "-e ACTIVE=pro -e NACOS_URL=172.26.1.21"
EOF
current_dir=$(pwd)
grep -q 'StrictHostKeyChecking no' /etc/ssh/ssh_config || echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config
#==========定义远程执行脚本文件开始==========
cat << 'EOF' > script.sh
#!/bin/bash
cd /tmp/robot-patrol-platform
tarName=$(ls *.tar -1t | head -n 1)
imageName=$(docker load -i ${tarName} | cut -d' ' -f3)
containerName=$(echo ${imageName} | cut -d: -f1)
# 删除原来的容器,并新建一个容器
if docker ps | grep "${containerName}" >/dev/null 2>&1; then docker rm -f ${containerName} ; fi
docker run -d --net host $1 --restart=unless-stopped --name ${containerName} ${imageName}
# 删除无用的镜像,只保留最新的镜像
serviceName=${containerName}
if docker images | grep "${serviceName}" >/dev/null 2>&1; then docker rmi -f $(docker images | grep ${serviceName} |awk 'NR>1 {print $3}'); fi
# 删除临时文件夹
rm -rf /tmp/robot-patrol-platform/${tarName}
rm -rf /tmp/robot-patrol-platform/script.sh
echo "The script has been executed successfully."
EOF
#==========定义远程执行脚本文件结束==========
#==========定义任务函数开始==========
dotask () {
ip=$1; username=$2; password=$3; environment=$4; param=$5
echo "===============远程主机 "$ip" 开始执行任务==============="
sshpass -p $password scp $current_dir/${module}/target/*.tar $username@$ip:/tmp/robot-patrol-platform
sshpass -p $password scp $current_dir/script.sh $username@$ip:/tmp/robot-patrol-platform
sshpass -p $password ssh $username@$ip "chmod +x /tmp/robot-patrol-platform/script.sh && /tmp/robot-patrol-platform/script.sh $param"
echo "===============远程主机 "$ip" 脚本执行完成==============="
}
#==========定义任务函数结束==========
while read -r ip username password environment param; do
if [ "$host" = "all" ]; then
dotask $ip $username $password $environment "$param"
elif [ "$host" = "$environment" ]; then
dotask $ip $username $password $environment "$param"
fi
done < hosts.txt
echo "===============所有任务已完成==============="
该 ssh 脚本完全替代了 Publish Over SSH,通过 sshpass
命令免密拷贝文件和在宿主机执行脚本。
脚本最开始,定义了目标主机的ip、用户名、密码以及环境和 docker 执行添加的额外环境变量,其中环境用于匹配$host
变量。
其中 $module
还是和之前的变量,$host
是需要打包到的目标机器,如果该字段为 all,打包到所配置的全部机器上。
提醒:本文发布于594天前,文中所关联的信息可能已发生改变,请知悉!
AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完