某CICD系统分布式存储异常处理脚本
#!/bin/bash## authored by zhaoxc# 漏扫工具会使得 glusterfs 6.5 版本的卷处于异常状态。 异常时 gluster vol status xxx 状态为 N ; 而命令返回值无异常#VOL_LIST="vol "VOL_FILE="/root/glusterfs-recovery.log"log(){echo"$(date'+%Y-%m-%d %H:%M:%S')-$1"|tee-a"$LOG_FILE"}# 检查卷状态, 返回状态字符串check_volume(){localvol=$1localstatus_outputlocalvol_status="NULLNULL"# 获取卷状态详细输出status_output=$(/usr/sbin/gluster volume status"$vol"2>&1)localsingle_line_output=$(echo"$status_output"|tr'\n'' ')ifecho"$single_line_output"|grep-q"Brick.*$vol";thenlocalbrick_section=$(echo"$single_line_output"|grep-o"Brick[^B]*$vol[^B]*")localonline_status=$(echo"$brick_section"|grep-oE"\s[YN]\s"|tr-d' ')if["$online_status"="N"];thenvol_status="offline"elif["$online_status"="Y"];thenvol_status="online"elsevol_status="unknown"fifiecho"$vol_status"}recover_volume(){localvol=$1log"开始恢复卷:$vol"# 停止卷log"停止卷:$vol"if/usr/sbin/gluster volume stop"$vol"force--mode=script>>"$LOG_FILE"2>&1;thenlog"卷$vol停止成功"elselog"卷$vol停止操作完成"fisleep5# 启动卷log"启动卷:$vol"if/usr/sbin/gluster volume start"$vol">>"$LOG_FILE"2>&1;thenlog"卷$vol启动成功"return0elselog"卷$vol启动失败"return1fi}main(){localvol_status="EmptyEmpty"localOFFLINE_VOLUMES=()log"=== 开始 GlusterFS 卷状态检查 ==="log"当前VOL_LIST的值:$VOL_LIST"log"VOL_LIST中的卷数量:$(echo$VOL_LIST|wc-w)"# 检查每个卷forvolin$VOL_LIST;dolog"检查卷:$vol"# 获取卷状态vol_status=$(check_volume"$vol")log"本卷检查的返回值为:$vol_status>>>>>>>>>>>>"# 根据状态决定是否重启if["$vol_status"="offline"]||["$vol_status"="unknown"];thenOFFLINE_VOLUMES+=("$vol")recover_volume"$vol"elif["$vol_status"="online"];thenlog"卷$vol状态正常,无需处理"elselog"卷$vol状态异常:$vol_status"filog"---"done# 输出结果摘要log"=== 检查完成 ==="if[${#OFFLINE_VOLUMES[@]}-eq0];thenlog"所有卷均在线"elselog"本次离线卷列表:${OFFLINE_VOLUMES[*]}"fi}# 执行主函数main