模具厂咋做网站,哈尔滨seo网络优化招聘,nginx 代理 wordpress,网站域名空间购买在Linux终端实现批量删除OpenStack实例#xff0c;支持并发删除、安全确认、重试机制、优先清理运行中实例
#!/bin/bash
#
# 增强版 OpenStack 删除实例脚本
# 功能#xff1a;支持并发删除、安全确认、重试机制、优先清理运行中实例
# 更新#xff1a;2025年4月30日
# ##…在Linux终端实现批量删除OpenStack实例支持并发删除、安全确认、重试机制、优先清理运行中实例
#!/bin/bash
#
# 增强版 OpenStack 删除实例脚本
# 功能支持并发删除、安全确认、重试机制、优先清理运行中实例
# 更新2025年4月30日
# #######################################
# 配置区用户可自定义参数
#######################################
delete_InstanceMAX_RETRY20 # 最大尝试次数删除失败时尝试再次删除实例
CHECK_INTERVAL5 # 实例状态检测间隔单位秒
no_InstanceMAX_RETRY_TIME20 # 实例列表为空连续监测实例列表都是空的次数
CONCURRENCY2 # 并发删除线程数建议不超过 API 限制
MAX_WAIT_TIME3600 # 最大等待超时时间单位秒60 分钟LOG_FILE./log_instance_delete_$(date %Y%m%d).log # 日志文件路径自动按日期生成# 统计变量
TOTAL_DELETED_INSTANCES0 # 已删除实例总数统计
DELETED_INSTANCES_FILE/tmp/deleted_instances.txt # 已删除实例ID临时记录文件# 颜色定义终端输出美化
RED\033[0;31m # 红色 - 错误/危险操作
GREEN\033[0;32m # 绿色 - 成功/正常状态
YELLOW\033[0;33m # 黄色 - 警告/等待状态
BLUE\033[0;34m # 蓝色 - 执行中/进度信息
NC\033[0m # 无颜色 - 重置终端颜色#######################################
# 函数带重试机制的实例删除
# 参数
# $1 : 实例ID必填
# 返回值
# 0 - 删除成功 | 1 - 删除失败
# 描述
# 使用指数退避策略重试删除最多尝试 delete_InstanceMAX_RETRY 次删除实例
#######################################
retry_delete() {local instance_id$1for ((i1; idelete_InstanceMAX_RETRY; i)); dolog ${BLUE}尝试删除实例 [ID: $instance_id] (第 $i 次尝试)...${NC}if nova force-delete $instance_id; thenlog ${GREEN}删除实例成功: $instance_id${NC}echo $instance_id $DELETED_INSTANCES_FILEreturn 0fisleep $((i*2)) # 指数退避等待donelog ${RED}错误删除实例 $instance_id 失败已达最大重试次数${delete_InstanceMAX_RETRY} 次${NC}return 1
}#######################################
# 函数安全获取实例列表
# 参数
# $1 : 实例状态默认 ACTIVE
# 返回值
# 实例ID列表格式每行一个ID
# 描述
# 过滤无效字符并格式化输出避免脏数据干扰
#######################################
safe_get_instances() {local status${1:-ACTIVE}nova list --status $status | awk -F | /[0-9a-f]{8}-/ {gsub(/ /, , $2);if ($4 ~ status) print $2} status$status
}#######################################
# 函数日志记录
# 参数
# $1 : 日志信息支持颜色代码
# 描述
# 自动添加时间戳并同时输出到终端和日志文件
#######################################
log() {local msg$1echo -e $(date %Y-%m-%d %T) - $msg | tee -a $LOG_FILE
}# 导出函数到子 Shell确保并发调用时可用
export -f log retry_delete#######################################
# 主流程
######################################## 解析命令行参数
while getopts s:i:c:l: opt; docase $opt ins) STATUS$OPTARG;; # 指定目标实例状态如 ACTIVE/BUILDi) CHECK_INTERVAL$OPTARG;; # 自定义检测间隔时间c) CONCURRENCY$OPTARG;; # 调整并发线程数l) LOG_FILE$OPTARG;; # 指定日志文件路径*) echo -e ${RED}用法: $0 [-s 状态] [-i 间隔] [-c 并发数] [-l 日志路径]${NC}exit 1;;esac
done# 初始化 OpenStack 环境
source /openstack/admin-openrc.sh || { log ${RED}错误环境变量加载失败请检查 admin-openrc.sh 文件权限或路径${NC}exit 1
}# 检查日志目录可写性
if [ ! -w $(dirname $LOG_FILE) ]; thenecho -e ${RED}错误日志目录不可写 [路径: $(dirname $LOG_FILE)]${NC} 2exit 1
fi# 初始化临时文件记录已删除实例$DELETED_INSTANCES_FILE# 进程锁检查防止重复运行
LOCK_FILE/tmp/os_clean.lock
if [ -e $LOCK_FILE ]; thenlog ${YELLOW}警告检测到已有清理进程运行中 [PID: $(cat $LOCK_FILE)]${NC}exit 1
fi
echo $$ $LOCK_FILE
trap rm -f $LOCK_FILE; TOTAL_DELETED_INSTANCES$(wc -l $DELETED_INSTANCES_FILE); log ${GREEN} 脚本进程中断退出已删除实例数: $TOTAL_DELETED_INSTANCES ; rm -f $DELETED_INSTANCES_FILE EXIT# 安全确认确保转义符被解析
if [[ -t 0 ]]; thenread -p $(printf ${YELLOW}危险操作是否确认执行删除实例(y/N): ${NC}) -n 1 confirm[[ $confirm ! y ]] { log 操作已取消; exit; }echo
fi# 主循环状态检测与删除
log \n${GREEN} 开始删除实例 [时间: $(date %T)]
start_time$(date %s)
empty_count0 # 连续空检测计数器while :; do# 超时检查防止无限等待if (( $(date %s) - start_time MAX_WAIT_TIME )); thenlog ${RED}错误操作超时已超过最大等待时间${MAX_WAIT_TIME} 秒${NC}exit 1fi# 获取目标实例列表instances$(safe_get_instances ${STATUS:-ACTIVE})creating_instances$(safe_get_instances BUILD)# 优先删除运行中的实例if [ -n $instances ]; thenlog 检测到 ${#instances[]} 个运行中实例启动并发删除...printf %s\n ${instances[]} | xargs -P $CONCURRENCY -I {} bash -c delete_InstanceMAX_RETRY$delete_InstanceMAX_RETRYLOG_FILE$LOG_FILEDELETED_INSTANCES_FILE$DELETED_INSTANCES_FILE$(declare -f log retry_delete)retry_delete \{}\sleep $((CHECK_INTERVAL/2)) # 降低 API 请求频率continuefi# 处理创建中的实例等待后重试if [ -n $creating_instances ]; thenlog ${YELLOW}提示检测到 ${#creating_instances[]} 个创建中实例等待 ${CHECK_INTERVAL} 秒...${NC}sleep $CHECK_INTERVALcontinuefi# 空状态处理连续检测退出机制if [ -z $instances ]; thenlog ${YELLOW}提示未发现可操作实例等待 ${CHECK_INTERVAL} 秒后重试至多重试${no_InstanceMAX_RETRY_TIME}次...${NC}sleep $CHECK_INTERVAL# 连续${no_InstanceMAX_RETRY_TIME} 次空检测则退出if (( empty_count ${no_InstanceMAX_RETRY_TIME} )); thenTOTAL_DELETED_INSTANCES$(wc -l $DELETED_INSTANCES_FILE)log ${GREEN} 脚本运行清理完成已删除实例总数: ${TOTAL_DELETED_INSTANCES} exit 0ficontinuefiempty_count0 # 重置空检测计数器
done