1、前言
此处旨在记录在实际工作中用到shell脚本,积累一些常用的用法,后续也可以参考。
2、功能点
因为项目原因,对外的sdk部署比较麻烦,一套操作下来,可能得一两个小时,为了提升效率和操作正确性,所以将操作整合成一个shell脚本,当前shell脚本主要涉及到的操作如下(只记录新增的功能):
- 定义全局变量,用于保存脚本日志
- 检测docker和docker-compose的安装状态
- 判断系统的某个服务是否启动
- 判断文件是否更新
3、实际的脚本
#!/bin/bash
#获取脚本所在文件夹
currentDir=$(cd $(dirname $0); pwd)
current_time=$(date +"%Y-%m-%d %H:%M:%S")
#定义全局变量
declare logFile=${currentDir}/installLog.log
#检测网络联通
function checkNetStatus(){
echo -e "\e[32m 开始检测网络状态... \e[0m" >> ${logFile} 2>&1
ping -c 3 "user.dca.com" >> ${logFile} 2>&1
if [ $? -ne 0 ]
then
local netStatus=0
echo -e "\e[33m 无法连接外网,请采用离线模式授权,授权终止 \e[0m" >> ${logFile} 2>&1
else
local netStatus=1
echo -e "\e[32m 可以联通外网,采用在线模式授权 \e[0m" >> ${logFile} 2>&1
fi
return $netStatus
}
#检测Docker安装状态,未安装、部分安装、全部安装
function checkDockerStatus(){
echo -e "\e[32m 检测docker和docker-compose安装环境\e[0m"
if ! [ -x "$(command -v docker)" ]
then
dockerStatus=0
echo -e "\e[33m 当前服务器未安装docker,尝试自动安装 \e[0m"
else
echo -e "\e[32m 当前服务器已经存在docker,跳过安装步骤 \e[0m"
fi
if ! [ -x "$(command -v docker-compose)" ]
then
dockerComposeStatus=0
echo -e "\e[33m 当前服务器未安装docker-compose,尝试自动安装 \e[0m"
else
echo -e "\e[32m 当前服务器已经存在docker-compose,跳过安装步骤 \e[0m"
fi
#安装docker和docker-compose
if [ -n "$dockerStatus" ] && [ $dockerStatus -eq 0 ]
then
echo -e "\e[32m 开始安装docker和docker-compose组件... \e[0m"
installDocker
#安装docker会安装docker-compose,所以修改compose状态为已安装
dockerComposeStatus=1
fi
if [ -n "$dockerComposeStatus" ] && [ $dockerComposeStatus -eq 0 ]
then
echo -e "\e[32m 开始安装docker-compose组件... \e[0m"
installDockerCompose
fi
}
function unzipPackages(){
echo -e "\e[32m 开始解压文件... \e[0m"
#判断文件夹是否存在
if [ ! -d /home/dca ]
then
mkdir /home/dca
fi
if [ ! -d /home/dca/soft ]
then
mkdir /home/dca/soft
fi
if [ ! -d /home/dca/docker ]
then
mkdir /home/dca/docker
fi
#解压文件到指定文件夹
unzip -o 'cloudsdk-all-packages.zip' -d ./cloudsdk-all-packages >> ${logFile} 2>&1
#复制文件到指定文件夹下
cp ./cloudsdk-all-packages/docker-setup-offline.zip /home/dca/soft
cp ./cloudsdk-all-packages/bit_service.zip /home/dca/soft
cp ./cloudsdk-all-packages/'cloud FrontEnd SDK.zip' /home/dca/soft
cp ./cloudsdk-all-packages/cloudsdk_setup_offline.zip /home/dca/docker
#解压docker安装包、bitService安装包、cloudsdk安装包
unzip -o /home/dca/soft/docker-setup-offline.zip -d /home/dca/soft >> ${logFile} 2>&1
unzip -o /home/dca/soft/bit_service.zip -d /home/dca/soft >> ${logFile} 2>&1
unzip -o /home/dca/soft/'cloud FrontEnd SDK.zip' -d /home/dca/soft >> ${logFile} 2>&1
unzip -o /home/dca/docker/cloudsdk_setup_offline.zip -d /home/dca/docker >> ${logFile} 2>&1
echo -e "\e[32m 解压文件完成 \e[0m"
}
#安装Docker
function installDocker(){
cd /home/dca/soft
sh ./docker-runtime-offlinesetup.sh >> ${logFile} 2>&1
if ! [ -x "$(command -v docker)" ]
then
echo -e "\e[31m docker和docker-compose组件安装失败!!! \e[0m"
else
echo -e "\e[32m docker和docker-compose组件安装成功 \e[0m"
fi
}
#安装Docker compose
function installDockerCompose(){
cp -r /home/dca/soft/docker/docker-compose /usr/bin
chmod 755 /usr/bin/docker-compose
if ! [ -x "$(command -v docker-compose)" ]
then
echo -e "\e[31m docker-compose组件安装失败!!! \e[0m"
else
echo -e "\e[32m docker-compose组件安装成功 \e[0m"
fi
}
#安装部署BitService
function installBitService(){
if systemctl status bit_service >> ${logFile} 2>&1; then
echo -e "\e[32m bit_service授权服务已经存在 \e[0m"
else
echo -e "\e[33m bit_service授权服务不存在,开始安装... \e[0m"
cd /home/dca/soft
chmod 755 ./bit_service.run
sudo ./bit_service.run >> ${logFile} 2>&1
echo -e "\e[32m bit_service授权服务安装完成 \e[0m"
systemctl enable bit_service
systemctl start bit_service
systemctl status bit_service >> ${logFile} 2>&1
fi
#判断bitService是否启动成功
if systemctl status bit_service >> ${logFile} 2>&1; then
echo -e "\e[32m bit_service授权服务启动成功 \e[0m"
else
echo -e "\e[31m bit_service授权服务启动失败!!! \e[0m"
fi
}
#安装cloudSdk
function installcloudSDK(){
echo -e "\e[32m 开始导入镜像和启动容器... \e[0m"
cd /home/dca/docker
docker load -i dcacoreservicesdk.tar >> ${logFile} 2>&1
docker-compose -f dcacoreservicesdk-compose-b-r.yaml up -d >> ${logFile} 2>&1
echo -e "\e[32m 容器启动完成 \e[0m"
docker ps -a
}
#在线授权
function onlineActive(){
cd /opt/bitanswer/service
./bit_service -e /home/dca/soft/dca_.exm
./bit_service -a $1
}
#部署前端文件
function copyFrontFile(){
echo -e "\e[32m 开始复制前端文件到docker容器... \e[0m"
docker cp /home/dca/soft/'FrontEnd_SDK&Example'/assets dcacoreservicesdk:/app/dacservice/wwwroot/
docker cp /home/dca/soft/'FrontEnd_SDK&Example'/doc dcacoreservicesdk:/app/dacservice/wwwroot/
echo -e "\e[32m 开始复制前端文件到docker容器... \e[0m"
}
#配置前端代码中的服务器地址(私有化部署暂无配置服务器地址的操作)
#判断压缩文件是否更新过
function checkUpdate(){
if [ ! -e $logFile ] || test $logFile -ot $currentDir/cloudsdk-all-packages.zip
then
#需要安装
local updateStatus=0
else
#不需要重新安装
local updateStatus=1
fi
echo "脚本执行时间:$current_time" >> ${logFile} 2>&1
return $updateStatus
}
#重启docker容器
function restartDocker(){
echo -e "\e[32m 开始重启dokcer容器... \e[0m"
docker stop dcacoreservicesdk >> ${logFile} 2>&1
cd /home/dca/docker
docker-compose -f dcacoreservicesdk-compose-b-r.yaml up -d >> ${logFile} 2>&1
echo -e "\e[32m 重启完成 \e[0m"
docker ps -a
}
checkUpdate
updateStatus=$?
#解压所有的安装包
if [ $updateStatus -eq 0 ]
then
unzipPackages
else
echo -e "\e[33m 压缩文件未发生变化,跳过解压步骤!!!... \e[0m"
fi
#安装docker和docker-compose
checkDockerStatus
#安装bit_service授权服务
installBitService
#安装cloudSDK
if [ $updateStatus -eq 0 ]
then
installcloudSDK
else
echo -e "\e[33m 镜像文件未发生变化,跳过启动docker容器步骤!!!... \e[0m"
fi
#检测网络联通
checkNetStatus
if [ $? -eq 1 ]
then
read -p "请输入授权码:" activeCode
while [ -z $activeCode ]
do
read -p "授权码不能为空,请重新输入:" activeCode
done
echo -e "\e[32m 在线授权完成,授权结果如下: \e[0m"
onlineActive $activeCode
fi
#授权成功后,重启docker容器
restartDocker
echo -e "\e[32m 所有程序部署完成,授权成功后,浏览器访问验证页面URL http://服务器IP:5121/index.html \e[0m"