一种远程自动部署方案的实现与设计

本文介绍了一种用于金融行业自动化部署的shell脚本,考虑了行业特有的安全隔离需求。脚本涉及权限检查、文件锁、参数初始化、资源校验、版本更新、日志清理等多个环节,确保在多重防火墙环境下的安全自动化运维。通过这个脚本,可以提升系统的更新效率并降低人为错误。
摘要由CSDN通过智能技术生成

随着互联网的迅猛发展,各大大厂已拥有了自己的一套成熟生态方案,但对于保守的金融行业仍不太可能快速接受新生技术,各大服务器之间设有多重防火墙隔离,需要访问只能通过中间机进行访问,此时想要实现CI/CD一系列自动化运维方案将比较局限。以下为自己编写的一个实现自动部署的shell脚本。使用的都是非常基础的shell命令,可阅读性强!
在这里插入图片描述
脚本设计思路:

  1. runUserCheck:运行用户权限设置。
runUserCheck(){
	if [ "$LOGNAME" != "$RUN_USER" ];then
		writeLog "请以$RUN_USER用户执行!"
		exit 100
	fi
}
  1. shellLock:运行加锁、解锁。
#step_02:运行上锁
shellLock(){
	touch $(SHELL_LOCKFILE)
}

#step_08:运行解锁
shellUnlock(){
	fm -rf $(SHELL_LOCKFILE)
}
  1. 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
	
}
  1. 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
}
  1. 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
}
  1. 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
}
  1. 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
}
  1. 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
}

完整脚本新址!

如有错误欢迎大家留言评论!

点个赞吧!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月球程序猿

你的鼓励将是我创作的最大动

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值