批量删除OpenStack实例

在Linux终端实现批量删除OpenStack实例,支持并发删除、安全确认、重试机制、优先清理运行中实例

#!/bin/bash
# ======================================================================
# 增强版 OpenStack 删除实例脚本
# 功能:支持并发删除、安全确认、重试机制、优先清理运行中实例
# 更新:2025年4月30日
# ======================================================================#######################################
# 配置区(用户可自定义参数)
#######################################
delete_InstanceMAX_RETRY=20     # 最大尝试次数(删除失败时尝试再次删除实例)
CHECK_INTERVAL=5                # 实例状态检测间隔(单位:秒)
no_InstanceMAX_RETRY_TIME=20    # 实例列表为空,连续监测实例列表都是空的次数
CONCURRENCY=2                   # 并发删除线程数(建议不超过 API 限制)
MAX_WAIT_TIME=3600              # 最大等待超时时间(单位:秒,60 分钟)LOG_FILE="./log_instance_delete_$(date +%Y%m%d).log" # 日志文件路径(自动按日期生成)# 统计变量
TOTAL_DELETED_INSTANCES=0        # 已删除实例总数统计
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 ((i=1; i<=delete_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_FILE"return 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="$1"echo -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/BUILD)i) 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_count=0  # 连续空检测计数器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_RETRY'LOG_FILE='$LOG_FILE'DELETED_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_count=0  # 重置空检测计数器
done

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/903600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

# 基于 Python 和 jieba 的中文文本自动摘要工具

基于 Python 和 jieba 的中文文本自动摘要工具 在信息爆炸的时代&#xff0c;快速准确地提取文本核心内容变得至关重要。今天&#xff0c;我将介绍一个基于 Python 和 jieba 的中文文本自动摘要工具&#xff0c;帮助你高效地从长文本中提取关键信息。 一、背景与需求 在处理…

Seaborn数据可视化库

一、Seaborn介绍&#xff1a;基于Matplotlib的Python数据可视化库&#xff0c;专注绘制统计图形&#xff0c;简化可视化过程&#xff0c;提供高级接口和美观默认主题。 二、安装与导入 1.安装&#xff1a;可使用pip install seaborn或conda install seaborn&#xff0c;也可使…

机器视觉2D码垛和机器视觉3D码垛的区别

机器视觉3D码垛是一种结合3D视觉技术和工业机器人的自动化系统,主要用于在复杂环境中精准识别、定位并堆叠(码垛)各种形状、尺寸的物体。它通过3D传感器(如激光雷达、结构光相机、双目视觉等)获取物体的三维空间信息,并结合算法规划机器人的抓取路径和码放策略,实现高效…

Python魔法函数深度解析

一、魔法函数是什么&#xff1f; 魔法函数&#xff08;Magic Methods&#xff09;是Python中以双下划线&#xff08;__xx__&#xff09;包裹的特殊方法&#xff0c;它们为类提供了一种与Python内置语法深度集成的能力。这些方法由解释器自动调用&#xff0c;无需显式调用&…

C++负载均衡远程调用学习之自定义内存池管理

目录 1.内存管理_io_buf的结构分析 2.Lars_内存管理_io_buf内存块的实现 3.buf总结 4.buf_pool连接池的单例模式设计和基本属性 5.buf_pool的初始化构造内存池 6.buf_pool的申请内存和重置内存实现 7.课前回顾 1.内存管理_io_buf的结构分析 ## 3) Lars系统总体架构 ​ …

流水线问题(算法设计)C++

目录 一、需求分析 1.1 问题描述 1.2 数据需求 1.3 功能需求 1.4 开发环境 二、概要设计 2.1 抽象数据类型 ADT 的定义 2.2 系统的主要功能模块 2.3 功能模块联系图 三、详细设计 3.1 数据结构设计 3.2 主要算法 四、系统运行及结果分析 1. 用户界面 2. 程序运行…

从实列中学习linux shell4: shell 脚本中 $0 $1 $2 $3 >> 以及 awk 都是干啥的?

在 Linux Shell 脚本中&#xff0c;这些符号和工具的功能如下&#xff1a; 一、位置参数 $0 $1 $2 $3 符号功能说明示例$0脚本自身的文件名若执行 ./test.sh&#xff0c;则 $0 值为 ./test.sh$1第一个参数执行 ./test.sh apple 时&#xff0c;$1 值为 "apple"$2第二…

TM1668芯片学习心得三

一、键扫数据储存地址如下所示&#xff0c;先发读键命令后&#xff0c;开始读取按键数据BYTE1-BYTE5字节&#xff0c;读数据从低位开始输出&#xff0c;其中B6和B7位为无效位&#xff0c;此时芯片输出为0。芯片K和KS引脚对应的按键按下时&#xff0c;相对应的字节内的 BIT位为1…

MySQL 基本查询(一)

文章目录 Create(insert)指定列的单行插入和全列插入多行全列插入和指定列的多行插入如果主键存在&#xff0c;要插入替换存在的值replace 基本select全列查询指定列查询where子句where子句案例语文成绩在 [80, 90] 分的同学及语文成绩数学成绩是 58 或者 59 或者 98 或者 99 分…

LeetCode路径总和系列问题解析:I、II、III的解决方案与优化

文章目录 引言一、路径总和 I&#xff08;LeetCode 112&#xff09;问题描述方法思路Java代码实现复杂度分析 二、路径总和 II&#xff08;LeetCode 113&#xff09;问题描述方法思路Java代码实现复杂度分析 三、路径总和 III&#xff08;LeetCode 437&#xff09;问题描述方法…

NFC 碰一碰发视频贴牌技术,音频功能的开发实践与技术解析

在数字化营销与信息交互场景中&#xff0c;NFC 碰一碰技术凭借其便捷性和高效性&#xff0c;成为快速传递多媒体内容的新选择。通过 NFC 实现视频音频的快速传输&#xff0c;不仅能提升用户体验&#xff0c;还能为各类场景带来创新应用。本文将深入探讨该功能开发过程中的关键技…

跨境电商生死劫:IP筛查三法则破解封号魔咒

一、血泪数据&#xff1a;90%封号案源于IP污染 跨境电商平台风控系统持续升级&#xff0c;2023年亚马逊全球封号案例中&#xff0c;67%涉及账号关联&#xff08;Marketplace Pulse数据&#xff09;&#xff0c;其中IP问题占比高达91%。更触目惊心的是&#xff1a; 新号存活率&…

MIPS架构详解:定义、应用与其他架构对比

一、MIPS架构的定义 MIPS&#xff08;Microprocessor without Interlocked Pipeline Stages&#xff09; 是一种经典的精简指令集&#xff08;RISC&#xff09;处理器架构&#xff0c;由斯坦福大学John Hennessy团队于1981年提出&#xff0c;强调高效流水线设计和硬件简化。 核…

第十六届蓝桥杯 2025 C/C++组 脉冲强度之和

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; P12338 [蓝桥杯 2025 省 B/Python B 第二场] 脉冲强度…

从Ping到iperf3:深度实战无线网络压测与优化指南

以下是测试无线网络稳定性的详细步骤与工具指南&#xff0c;涵盖信号质量、吞吐量、干扰排查等关键维度&#xff1a; 一、基础信号质量测试 1. 信号强度与覆盖测试 工具&#xff1a;手机APP&#xff08;WiFi Analyzer、NetSpot&#xff09;或笔记本&#xff08;Acrylic WiFi&a…

MySQL 连接池 (Pool) 常用方法详解

MySQL 连接池 (Pool) 常用方法详解 1. 创建连接池 首先需要创建连接池实例&#xff1a; const mysql require(mysql2/promise); // 使用Promise版本const pool mysql.createPool({host: localhost,user: root,password: password,database: test,waitForConnections: true…

大型连锁酒店集团数据湖应用示例

目录 一、应用前面临的严峻背景 二、数据湖的精细化构建过程 &#xff08;一&#xff09;全域数据整合规划 &#xff08;二&#xff09;高效的数据摄取与存储架构搭建 &#xff08;三&#xff09;完善的元数据管理体系建设 &#xff08;四&#xff09;强大的数据分析平台…

GNU gettext 快速上手

文章目录 1.简介2.核心概念国际化 (i18n)本地化 (l10n)POT 文件PO 文件MO 文件文本域翻译函数 3.主要组件4.使用示例参考文献 1.简介 GNU gettext 是一套用于软件国际化&#xff08;internationalization&#xff0c;i18n&#xff09;和本地化&#xff08;localization&#x…

分享:VTK版本的选择 - WPF空域问题

在早期版本中&#xff0c;ActiViz 对 Windows Presentation Foundation (WPF) 框架的支持是通过 WindowsFormHost 组件实现的&#xff0c;这种方式依赖于 WindowsForm 和 WPF 的互操作性。然而&#xff0c;这种方法存在一个众所周知的“空域问题”&#xff08;airspace issue&a…

python数据分析(六):Pandas 多数据操作全面指南

Pandas 多数据操作全面指南&#xff1a;Merge, Join, Concatenate 与 Compare 1. 引言 在数据分析工作中&#xff0c;我们经常需要处理多个数据集并将它们以各种方式组合起来。Pandas 提供了多种强大的多数据操作方法&#xff0c;包括合并(merge)、连接(join)、连接(concaten…