批量创建OpenStack实例
在Linux终端实现批量创建OpenStack实例,支持支持统计、并发创建、安全确认、重试机制、日志。
#!/bin/bash
# ======================================================================
# 增强版OpenStack实例创建脚本(修复日志功能)
# 功能:支持统计、并发创建、安全确认、重试机制
# 更新日期:2025年4月19日
# ======================================================================#######################################
# 配置区(用户可自定义参数)
######################################## --------------------
# 实例配置
# --------------------
FLAVOR="BJ1-2U4GB64GB" # 实例规格(必填)
SECURITY_GROUP="default" # 安全组名称(默认安全组)
NETWORK_NAME="BJself1" # 网络名称(必须存在)# --------------------
# 资源限制配置
# --------------------
MAX_INSTANCES_per_Image_per_Zone=2 # 单个镜像在每个可用区中最大实例数
MAX_TOTAL_INSTANCES_ALL_ZONE=10 # 实时查询所有可用区内的实例总数上限
AVAILABILITY_ZONES=( # 可用区列表(格式:nova:zone_name)"nova:bjcontroller1""nova:bjcompute1"
)# --------------------
# 运行控制配置
# --------------------
SLEEP_TIME=5 # 资源检查间隔时间(秒)
LOG_FILE="./log_launch_Instance_$(date +%Y%m%d).log" # 日志文件路径# --------------------
# 颜色定义(终端输出美化)
# --------------------
RED='\033[0;31m' # 红色 - 错误信息
GREEN='\033[0;32m' # 绿色 - 成功信息
YELLOW='\033[0;33m' # 黄色 - 警告信息
NC='\033[0m' # 无颜色 - 重置终端颜色#######################################
# 初始化区(加载环境/资源检查)
######################################## --------------------
# 加载OpenStack认证信息
# --------------------
source /openstack/admin-openrc.sh || { echo -e "${RED}错误:加载环境变量失败${NC}" | tee -a "$LOG_FILE" >&2exit 1
}# --------------------
# 获取网络ID(不使用 awk)
# --------------------
fixnet=$(openstack network list -f value -c Name -c ID | grep -w "$NETWORK_NAME" | cut -d' ' -f2)
if [ -z "$fixnet" ]; thenecho -e "${RED}错误:未找到网络 '$NETWORK_NAME'${NC}" | tee -a "$LOG_FILE" >&2exit 1
fi# --------------------
# 获取可用镜像列表
# --------------------
imagelist=$(glance image-list | grep -o '[a-zA-Z0-9]\{8\}-[a-zA-Z0-9]\{4\}-[a-zA-Z0-9]\{4\}-[a-zA-Z0-9]\{4\}-[a-zA-Z0-9]\{12\}')
if [ -z "$imagelist" ]; thenecho -e "${RED}错误:未找到可用镜像${NC}" | tee -a "$LOG_FILE" >&2exit 1
fi#######################################
# 统计变量声明
#######################################
declare -A ZONE_IMAGE_COUNT # 每个可用区已使用的镜像数量
declare -A ZONE_INSTANCE_COUNT # 每个可用区已创建的实例数量
TOTAL_INSTANCES=0 # 全局累计实例总数# 初始化统计变量
for zone in "${AVAILABILITY_ZONES[@]}"; doZONE_IMAGE_COUNT[$zone]=""ZONE_INSTANCE_COUNT[$zone]=0
done#######################################
# 功能函数区
######################################## --------------------
# 函数:get_instance_count
# 用途:获取指定镜像在指定可用区的实例数量
# --------------------
get_instance_count() {local image=$1local zone=$2openstack server list --long -f value -c "Image" -c "Availability Zone" | grep -w "$image" | grep -w "$zone" | wc -l
}# --------------------
# 函数:get_total_instances_all_zones
# 用途:获取所有可用区的实例总数
# --------------------
get_total_instances_all_zones() {openstack server list --all-projects -c ID -f value | wc -l
}# --------------------
# 函数:create_instance
# 用途:创建单个实例
# --------------------
create_instance() {local image=$1local zone=$2echo -e "${GREEN}$(date '+%Y-%m-%d %H:%M:%S') [创建实例]- (镜像: $image| 可用区节点: $zone)${NC}" | tee -a "$LOG_FILE"# 调用OpenStack API创建实例if ! openstack server create \--flavor "$FLAVOR" \--image "$image" \--nic "net-id=$fixnet" \--security-group "$SECURITY_GROUP" \--availability-zone "$zone" \"instance-$(date +%s)" >> "$LOG_FILE" 2>&1; thenecho -e "${RED}错误:创建实例失败 [镜像: $image | 可用区: $zone]${NC}" | tee -a "$LOG_FILE" >&2return 1fi# 更新统计信息((ZONE_INSTANCE_COUNT[$zone]++))((TOTAL_INSTANCES++))# 更新已使用镜像数if ! echo "${ZONE_IMAGE_COUNT[$zone]}" | grep -q "$image"; thenZONE_IMAGE_COUNT[$zone]+=" $image"fi
}#######################################
# 流程控制区
######################################## --------------------
# 安全确认机制
# --------------------
if [[ -t 0 ]]; thenecho -e "${YELLOW}警告:即将开始创建实例!${NC}" | tee -a "$LOG_FILE"read -p "是否继续?(y/N): " -n 1 confirmecho # 换行[[ "${confirm,,}" != "y" ]] && {echo -e "${YELLOW}操作已取消${NC}" | tee -a "$LOG_FILE"exit 0}
fi# --------------------
# 中断信号处理
# --------------------
trap 'echo -e "\n${YELLOW}捕获到中断信号,输出当前统计信息...${NC}" | tee -a "$LOG_FILE";for zone in "${AVAILABILITY_ZONES[@]}"; doecho -e "\n可用区 $zone 中:" | tee -a "$LOG_FILE"# 统计已使用镜像数(基于 ZONE_IMAGE_COUNT[$zone])used_images=$(echo "${ZONE_IMAGE_COUNT[$zone]}" | wc -w)echo -e " - 中断信号:已使用镜像数: $used_images" | tee -a "$LOG_FILE"echo -e " - 中断信号:已创建实例数: ${ZONE_INSTANCE_COUNT[$zone]}" | tee -a "$LOG_FILE"done;echo -e "\n${GREEN}中断信号:全局统计:总计创建实例数 = $TOTAL_INSTANCES${NC}" | tee -a "$LOG_FILE";exit 1' SIGINT#######################################
# 主逻辑区
#######################################echo -e "\n${GREEN}====== 开始创建实例 [时间: $(date +%T)]======${NC}" | tee -a "$LOG_FILE"
image_index=0# 遍历所有镜像
for image in $imagelist; do((image_index++))echo -e "\n${GREEN}[镜像进度] 第 $image_index 个镜像 ($image)${NC}" | tee -a "$LOG_FILE"# 遍历所有可用区与节点for zone in "${AVAILABILITY_ZONES[@]}"; doecho -e "${GREEN}检查可用区节点: $zone${NC}" | tee -a "$LOG_FILE"# 检查所有可用区实例总数限制while [ $(get_total_instances_all_zones) -ge $MAX_TOTAL_INSTANCES_ALL_ZONE ]; doecho -e "${YELLOW}等待:此时刻所有节点的实例总数已达上限 $MAX_TOTAL_INSTANCES_ALL_ZONE ,等待资源释放...${NC}" | tee -a "$LOG_FILE"sleep $SLEEP_TIMEdone# 检查镜像实例数量限制while [ $(get_instance_count "$image" "$zone") -ge $MAX_INSTANCES_per_Image_per_Zone ]; doecho -e "${YELLOW}等待:镜像 $image 在 $zone 的实例数已达上限 ($MAX_INSTANCES_per_Image_per_Zone)${NC}" | tee -a "$LOG_FILE"sleep $SLEEP_TIMEdone# 执行实例创建create_instance "$image" "$zone"done
done#######################################
# 最终统计输出
#######################################echo -e "\n${GREEN}====== 正常结束执行结果统计 ======${NC}" | tee -a "$LOG_FILE"
for zone in "${AVAILABILITY_ZONES[@]}"; doecho -e "\n${GREEN}可用区 [$zone] 统计:${NC}" | tee -a "$LOG_FILE"used_images=$(echo "${ZONE_IMAGE_COUNT[$zone]}" | wc -w)echo -e " - 使用镜像数: $used_images" | tee -a "$LOG_FILE"echo -e " - 创建实例数: ${ZONE_INSTANCE_COUNT[$zone]}" | tee -a "$LOG_FILE"
done
echo -e "\n${GREEN}最后统计:累计成功创建 $TOTAL_INSTANCES 个实例${NC}" | tee -a "$LOG_FILE"相关文章:
批量创建OpenStack实例
在Linux终端实现批量创建OpenStack实例,支持支持统计、并发创建、安全确认、重试机制、日志。 #!/bin/bash # # 增强版OpenStack实例创建脚本(修复日志功能) # 功能:支持统计、并发创建、安全确认、重试机制 # 更新日期…...
常用的 SQL 语句分类整理
以下是常用的 SQL 语句分类整理,覆盖数据查询、操作、表管理和高级功能,适用于大多数关系型数据库(如 MySQL、PostgreSQL、SQL Server): 目录 一、数据查询(DQL) 1. 基础查…...
驱动开发硬核特训 · Day 15:电源管理核心知识与实战解析
在嵌入式系统中,电源管理(Power Management)并不是“可选项”,而是实际部署中影响系统稳定性、功耗、安全性的重要一环。今天我们将以 Linux 电源管理框架 为基础,从理论结构、内核架构,再到典型驱动实战&a…...
【零基础】基于DeepSeek-R1与Qwen2.5Max的行业洞察自动化平台
自动生成行业报告,通过调用两个不同的大模型(DeepSeek 和 Qwen),完成从行业趋势分析到结构化报告生成的全过程。 完整代码:https://mp.weixin.qq.com/s/6pHi_aIDBcJKw1U61n1uUg 🧠 1. 整体目的与功能 该脚本实现了一个名为 ReportGenerator 的类,用于: 调用 DeepSe…...
Web前端 (CSS篇)
什么是CSS? css(Cascading Style Sheets)是层叠样式表或级联样式表,是一组设置规则,用于控制web页面外观。 为什么使用CSS? CSS 用于定义网页的样式,包括针对不同设备和屏幕尺寸的设计和布局。 CSS 实例 body {background-col…...
C 语言联合与枚举:自定义类型的核心解析
目录 1.联合体 1.1联合体的声明与创建 1.2联合体在内存中的存储 1.3相同成员的结构体与内存比较 1.4联合体内存空间大小的计算 1.5联合体的应用 2.枚举类型 2.1枚举变量的声明 2.2枚举变量的优点 2.3枚举的使用 上篇博客中,我们通过学习了解了C语言中一种自…...
基于Canal+Spring Boot+Kafka的MySQL数据变更实时监听实战指南
前期知识背景 binlog 什么是binlog 它记录了所有的DDL和DML(除 了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL 的二进制日志是事务安全型的。一般来说开启二进制日志大概会有1%的性能损耗。 binlog分类 MySQL Bi…...
MySQL运维三部曲初级篇:从零开始打造稳定高效的数据库环境
文章目录 一、服务器选型——给数据库一个舒适的家二、系统调优——打造高性能跑道三、MySQL配置——让数据库火力全开四、监控体系——数据库的体检中心五、备份恢复——数据安全的最后防线六、主从复制——数据同步的艺术七、安全加固——守护数据长城 引言:从小白…...
golang context源码
解析 context结构 Deadline:返回 context 的过期时间; Done:返回 context 中的 channel; Err:返回错误; Value:返回 context 中的对应 key 的值. type Context interface {Deadline() (deadl…...
【MySQL】MySQL的基础语法及其语句的介绍
1、基础语法 mysql -h【主机名】 -u【用户名】 -p //登录MySQL exit或quit; //退出MySQL show database; //查看MySQL下的所有数据库 use 【数据库名】; //进入数据库 show tables; //查看数据库下的所有表名 *MySQL的启动和关闭 &am…...
大模型应用开发自学笔记
理论学习地址: https://zh.d2l.ai/chapter_linear-networks/index.html autodl学术加速: source /etc/network_turboconda常见操作: 删除: conda remove --name myenv --all -y导出: conda env export > environment.yml…...
Spring能够有效地解决单例Bean之间的循环依赖问题
在Spring框架中,earlySingletonObjects和singletonObjects是两个与Bean实例化过程密切相关的概念,它们都存储在DefaultSingletonBeanRegistry类中。这两个概念主要用于Spring的依赖注入机制,特别是针对单例Bean的创建过程。 singletonObject…...
【计算机视觉】三维视觉项目 - Colmap二维图像重建三维场景
COLMAP 3D重建 项目概述项目功能项目运行方式1. 环境准备2. 编译 COLMAP3. 数据准备4. 运行 COLMAP 常见问题及解决方法1. **编译问题**2. **运行问题**3. **数据问题** 项目实战建议项目参考文献 项目概述 COLMAP 是一个开源的三维重建软件,专注于 Structure-from…...
Linux 离线部署 Docker 18.06.3 终极指南(附一键安装卸载脚本)
Linux 离线部署 Docker 18.06.3 终极指南(附一键安装/卸载脚本) 摘要:本文针对无外网环境的 Linux 服务器,提供基于二进制包的 Docker 18.06.3 离线安装全流程指南。包含自动化脚本设计、服务配置优化及安全卸载方案,…...
ALSA架构学习2(驱动MAX98357A)
1 前言和环境 之前其实写过两篇,一篇是讲ALSA,一篇是I2S。 ALSA架构学习1(框架)_alsa框架学习-CSDN博客 总线学习5--I2S_max98357接喇叭教程-CSDN博客 在ALSA那篇的结尾,也提了几个小练习。比如: ### 4…...
数据结构*集合框架顺序表-ArrayList
集合框架 常见的集合框架 什么是顺序表 顺序表是一种线性表数据结构,它借助一组连续的存储单元来依次存储线性表中的数据元素。一般情况下采用数组存储。 在数组上完成数据的增删查改。 自定义简易版的顺序表 代码展示: public interface IArray…...
VMware Workstation 保姆级 Linux(CentOS) 创建教程(附 iso)
文章目录 一、下载二、创建 一、下载 CentOS-7.9-x86_64-DVD-2009.iso 二、创建 VMware Workstation 保姆级安装教程(附安装包) VMware Workstation 保姆级安装教程(附安装包) VMware Workstation 保姆级安装教程(附安装包)...
51、项⽬中的权限管理怎么实现的
答:权限管理有三个很重要的模块; (1)⽤⼾模块:可以给⽤⼾分配不同的⻆⾊ (2)⻆⾊模块:可以授于⽤⼾不同的⻆⾊,不同的⻆⾊有不同权限 (3)权限模块:⽤于管理系统中的权限接⼝,为⻆⾊提供对…...
软考-信息系统项目管理师-2 信息技术发展
总结思维导图 云计算(掌握) (3)多租户和访问控制管理访问控制管理是云计算应用的核心问题之一云计算访问控制的研究主要集中在云计算访问控制模型、基于ABE密码体制的云计算访问控制、云中多租户及虚拟化访问控制研究云中多租户及虚拟化访问控制是云计算的典型特征。 大数据(…...
Spring Boot JPA 开发之Not an entity血案
项目状况介绍 项目环境 JDK 21Spring Boot 3.4.3Hibernate: 6.6.13.Final项目描述 因为是微服务架构,项目层级如下 project-parent project-com project-A … project-X 其中: project-parent定义依赖库的版本project-com 定义了一些公用的方法和配置,包括持久层的配置。…...
HTMLCSS实现轮播图效果
这段代码实现了一个具有自动轮播、手动切换功能的图片轮播图,并且配有指示器(小圆点)来显示当前图片位置。轮播图可通过左右箭头按钮进行手动切换,也能自动定时切换,当鼠标悬停在轮播图上时,自动轮播会暂停…...
嵌入式学习——opencv图像库编程
环境配置 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和图像处理库,广泛用于各种计算机视觉任务,如图像处理、视频分析、人脸识别、物体检测、机器学习等。它提供了丰富的函数和工具,用于处理…...
【每日八股】复习 MySQL Day1:事务
文章目录 复习 MySQL Day1:事务MySQL 事务的四大特性?并发事务会出现什么问题?MySQL 事务的隔离级别?不同事务隔离级别下会发生什么问题?MVCC 的实现原理?核心数据结构版本链构建示例可见性判断算法MVCC 可…...
java 设计模式之代理模式
简介 代理模式:使用代理类来增强目标类的功能。在代码结构上,代理对象持有目标对象,通过代理对象访问目标对象,这样可以在不改变目标对象的前提下增加额外的功能,如权限校验、缓存等 代理模式内部的角色:…...
外接键盘与笔记本命令键键位不同解决方案(MacOS)
文章目录 修改键位第一步:打开设置第二步:进入键盘快捷键第三步:修改修饰键设置第四步:调整键位第五步:保存设置tips ikbc c87键盘win键盘没反应的解决亲测的方法这是百度的答案标题常规组合键尝试:型号差…...
python爬虫复习
requests模块 爬虫的分类 通用爬虫:将一整张页面进行数据采集聚焦爬虫:可以将页面中局部或指定的数据进行采集 聚焦爬虫是需要建立在通用的基础上来实现 功能爬虫:基于selenium实现的浏览器自动化的操作分布式爬虫:使用分布式机群…...
kotlin知识体系(五) :Android 协程全解析,从作用域到异常处理的全面指南
1. 什么是协程 协程(Coroutine)是轻量级的线程,支持挂起和恢复,从而避免阻塞线程。 2. 协程的优势 协程通过结构化并发和简洁的语法,显著提升了异步编程的效率与代码质量。 2.1 资源占用低(一个线程可运行多个协程)…...
vscode stm32 variable uint32_t is not a type name 问题修复
问题 在使用vscodekeil开发stm32程序时,发现有时候vscode的自动补全功能失效,且problem窗口一直在报错。variable “uint32_t” is not a type name uint32_t 定义位置 uint32_t 实际是在D:/Keil_v5/ARM/ARMCC/include/stdint.h中定义的。将D:/Keil_v5…...
Formality:Bug记录
相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 本文记录博主在使用Synopsys的形式验证工具Formality中遇到的一个Bug。 Bug复现 情况一 // 例1 module dff (input clk, input d_in, output d_out …...
在ubuntu20.04+系统部署VUE及Django项目的过程记录——以腾讯云为例
目录 1. 需求2. 项目准备3. VUE CLI项目部署3.1 部署前的准备3.1.1 后端通信路由修改3.1.2 导航修改 3.2 构建项目3.3 配置nginx代理 4. 后端配置4.1 其他依赖项4.2 单次执行测试4.3 创建Systemd 服务文件4.4 配置 Nginx 作为反向代理 5. 其他注意事项 1. 需求 近期做一些简单…...
