随着互联网的迅猛发展,各大大厂已拥有了自己的一套成熟生态方案,但对于保守的金融行业仍不太可能快速接受新生技术,各大服务器之间设有多重防火墙隔离,需要访问只能通过中间机进行访问,此时想要实现CI/CD一系列自动化运维方案将比较局限。以下为自己编写的一个实现自动部署的shell脚本。使用的都是非常基础的shell命令,可阅读性强!
脚本设计思路:
- runUserCheck:运行用户权限设置。
runUserCheck(){
if [ "$LOGNAME" != "$RUN_USER" ];then
writeLog "请以$RUN_USER用户执行!"
exit 100
fi
}
- shellLock:运行加锁、解锁。
#step_02:运行上锁
shellLock(){
touch $(SHELL_LOCKFILE)
}
#step_08:运行解锁
shellUnlock(){
fm -rf $(SHELL_LOCKFILE)
}
- para_init:参数化检测。
#step_03:参数初始化
para_init(){
#日志目录不存在新建目录
if [ ! -d $SHELL_LOGDIR ];then
if mkdir -p $SHELL_LOGDIR 2>>/dev/null;then
writeLog "日志目录$SHELL_LOGDIR不存在,新建目录$SHELL_LOGDIR成功!"
else
echo "日志目录$SHELL_LOGDIR不存在,新建目录$SHELL_LOGDIR失败,程序终止!" >$HOME/autoUpdate/err.log
exit 101
fi
fi
#存储目录不存在新建目录
if [ ! -d $SAVE_DIR ];then
if mkdir -p $SAVE_DIR 2>>/dev/null;then
writeLog "资源存储目录$SAVE_DIR不存在,新建目录$SAVE_DIR成功!"
else
writeLog "资源存储目录$SAVE_DIR不存在,新建目录$SAVE_DIR失败,程序终止!"
exit 102
fi
fi
#锁文件存在不允许执行
if [ -f ${SHELL_LOCKFILE} ];then
writeLog "程序正在运行,请稍后重试!"
exit 103
fi
}
- updateResourceIsExist:资源校验、合法性检查等。
#step_04:判断FTP中待更新资源目录以及文件是否存在
updateResourceIsExist(){
writeLog "待更新资源检测中..."
timeout 10 ftp -n -i -v <<EOF 2>>/dev/null > ${SHELL_TMPFILE}
open ${IP}
user ${USER} ${PASSWD}
cd ${RESOURCE_DIR}
ls *
close
bye
EOF
writeLog `cat ${SHELL_TMPFILE}`
writeLog "检测待更新资源目录[${RESOURCE_DIR}]是否存在中..."
if grep "550 Failed to change directory." ${SHELL_TMPFILE} >/dev/null;then
writeLog "待更新资源目录[${RESOURCE_DIR}]不存在,此次无需更新,程序终止!"
exit 104
else
writeLog "待更新资源目录[${RESOURCE_DIR}]存在!"
writeLog "检测.ctl文件是否存在中..."
if grep ${CTL_FILE} ${SHELL_TMPFILE} >/dev/null;then
writeLog "${CTL_FILE}文件存在!"
writeLog "检测.ok文件是否存在中..."
if grep ${OK_FILE} ${SHELL_TMPFILE} >/dev/null;then
writeLog "${OK_FILE}文件存在!"
else
writeLog "${OK_FILE}文件不存在,此次无需更新,程序终止!"
exit 105
fi
else
writeLog "${CTL_FILE}文件不存在,此次无需更新,程序终止!"
exit 106
fi
fi
rm -rf ${SHELL_TMPFILE} 2>>/dev/null
}
- version_update:版本更新:准备,备份、部署、回滚。
#step_05:初始化.ctl文件;.ctl文件内容合法性验证;文件MD5比对;资源备份
version_update(){
ftpDownFile ${CTL_FILE}
CTL_FILE_PATH=${SAVE_DIR}/${CTL_FILE}
if [ -s ${CTL_FILE_PATH} ]; then
ctl_info=`cat ${CTL_FILE_PATH}`
writeLog "ctl文件内容:"
writeLog "${ctl_info}"
else
writeLog ".ctl文件内容为空,程序终止!"
exit 110
fi
i=1 #循环次数统计
writeLog "待更新资源MD5值比对中..."
cat ${CTL_FILE_PATH} | while read line
do
#writeLog $line
filepath=`echo $line |awk -F ' ' '{print $2}'`
filemd5_old=`echo $line |awk -F ' ' '{print $1}'`
if [ -z $filepath || -z $filemd5_old ];then
writeLog ".ctl文件第一行内容非法!"
i=`expr $i + 1`
continue
else
file_suffix=${filepath##*.} #文件后缀名
ftpDownFile ${filepath##*/}
writeLog "源文件${filepath}的MD5值:${filemd5_old}"
if [ ".${file_suffix}" -eq ".tar" ];then
writeLog "正在获取包文件${filepath##*/}的MD5值..."
filemd5_new=`get_md5 ${SAVE_DIR}/${filepath##*/}` #.ctl配置的资源路径与下载的路径不一致
writeLog "下载的包文件${filepath##*/}的MD5值获取成功,MD5值:${filemd5_new}"
#md5值比对
if [ "${filemd5_new}" -eq "${filemd5_old}" ];then
writeLog "包文件${filepath##*/}的MD5值与.ctl配置文件配置的MD5值不匹配,程序终止!"
exit 111
else
#备份tar包资源
resource_bakup ${filepath}
#资源更新
writeLog "正在更新${filepath##*/}...."
update_exec ${filepath}
writeLog "${filepath##*/}更新完成!"
i=`expr $i + 1`
continue
fi
elif grep "${filepath}" ${CONF_FILE};then #此处.ctl配置的${filepath}需为系统存在的资源。
if [ ! -f ${filepath} ];then
writeLog ".ctl配置的配置文件资源[${filepath}]在系统中不存在,不执行更新该资源,请手工执行更新!"
i=`expr $i + 1`
continue
else
writeLog "正在获取配置文件${filepath##*/}的MD5值..."
filemd5_new=`get_md5 ${SAVE_DIR}/${filepath##*/}`
writeLog "下载的配置文件${filepath##*/}的MD5值获取成功,MD5值:${filemd5_new}"
#md5值比对
if [ "${filemd5_new}" -eq "${filemd5_old}" ];then
writeLog "配置文件${filepath##*/}的MD5值与.ctl配置文件配置的MD5值不匹配,程序终止!"
exit 112
else
#备份配置文件资源
resource_bakup ${filepath}
#资源更新【过程中发生错误回滚??】
writeLog "正在更新${filepath##*/}...."
update_exec ${filepath}
writeLog "${filepath##*/}更新完成!"
i=`expr $i + 1`
continue
fi
fi
else
writeLog ".ctl配置的待更新文件[${filepath}]不在允许更新范围。"
fi
fi
done
}
- deleteOkFile:部署后续处理。
#step06:移除.ok文件
deleteOkFile(){
writeLog "$1文件下载中..."
timeout 10 ftp -n -i -v <<EOF 2>>/dev/null > ${SHELL_TMPFILE}
open ${IP}
user ${USER} ${PASSWD}
cd ${RESOURCE_DIR}
binary
prompt
delete ${OK_FILE}
close
bye
EOF
writeLog `cat ${SHELL_TMPFILE}`
if grep "250 Delete operation successful." ${SHELL_TMPFILE} >/dev/null;then
writeLog "$1文件删除成功!"
else
writeLog "$1文件删除失败!请登录确认!"
#exit 0
fi
rm -rf ${SHELL_TMPFILE} 2>>/dev/null
}
- uploadLogFile:结果文件传输通知。
#step07:上传日志文件
uploadLogFile(){
writeLog "日志文件上传中..."
timeout 10 ftp -n -i -v <<EOF 2>>/dev/null > ${SHELL_TMPFILE}
open ${IP}
user ${USER} ${PASSWD}
cd ${RESOURCE_DIR}
lcd ${SHELL_DIR}
binary
prompt
put ${SHELL_LOGFILE}
close
bye
EOF
writeLog `cat ${SHELL_TMPFILE}`
if grep "226-File successfully transferred" ${SHELL_TMPFILE} >/dev/null;then
writeLog "日志文件${SHELL_LOGFILE}上传成功!"
else
writeLog "日志文件${SHELL_LOGFILE}上传失败!请登录确认!"
#exit 0
fi
rm -rf ${SHELL_TMPFILE} 2>>/dev/null
}
- cleanLog:日志清理。
#日志及临时文件清理
cleanLog(){
#find ${SHELL_LOGDIR} -mtime +${SAVE_DAYS} -name "*.log" -exec rm {} \;
writeLog "日志文件清理检测中..."
fileList=`find ${SHELL_LOGDIR} -mtime +${SAVE_DAYS} -name "*.log"`
if [ -z fileList ];then
writeLog "无需清理日志!"
else
writeLog "待清理文件列表:"
writeLog "${fileList}"
rm -f fileList
writeLog "日志清理完成!"
fi
#rm -rf ${SAVE_DIR}/*
writeLog "临储文件清理检测中..."
curDirNum=`ls -l ${SAVE_DIR} | grep -E "^d" | wc -l`
if [ $curDirNum -gt $saveDirNum ];then
delDirNum=`expr $curDirNum - $saveDirNum`
writeLog "待清理临储文件天数:${delDirNum} =====>>"
for file in `ls -l ${SAVE_DIR} | grep -E "^d" | head -n $delDirNum | awk '{print $NF}'`
do
writeLog "echo `ls -l ${SAVE_DIR}/${file} | grep -E "^d"`"
if rm -rf ${SAVE_DIR}/${file};then
writeLog "${SAVE_DIR}/${file}目录清理完成!"
else
writeLog "${SAVE_DIR}/${file}目录清理失败,请检查!"
fi
done
else
writeLog "无需要清理的临储文件!"
fi
}
如有错误欢迎大家留言评论!
点个赞吧!!