批量创建OpenStack实例

news2026/2/12 15:06:57

在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" >&2
    exit 1
}

# --------------------
# 获取网络ID(不使用 awk)
# --------------------
fixnet=$(openstack network list -f value -c Name -c ID | grep -w "$NETWORK_NAME" | cut -d' ' -f2)
if [ -z "$fixnet" ]; then
    echo -e "${RED}错误:未找到网络 '$NETWORK_NAME'${NC}" | tee -a "$LOG_FILE" >&2
    exit 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" ]; then
    echo -e "${RED}错误:未找到可用镜像${NC}" | tee -a "$LOG_FILE" >&2
    exit 1
fi


#######################################
# 统计变量声明
#######################################
declare -A ZONE_IMAGE_COUNT            # 每个可用区已使用的镜像数量
declare -A ZONE_INSTANCE_COUNT         # 每个可用区已创建的实例数量
TOTAL_INSTANCES=0                      # 全局累计实例总数

# 初始化统计变量
for zone in "${AVAILABILITY_ZONES[@]}"; do
    ZONE_IMAGE_COUNT[$zone]=""
    ZONE_INSTANCE_COUNT[$zone]=0
done


#######################################
# 功能函数区
#######################################

# --------------------
# 函数:get_instance_count
# 用途:获取指定镜像在指定可用区的实例数量
# --------------------
get_instance_count() {
    local image=$1
    local zone=$2
    openstack 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=$1
    local zone=$2
    echo -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; then
        echo -e "${RED}错误:创建实例失败 [镜像: $image | 可用区: $zone]${NC}" | tee -a "$LOG_FILE" >&2
        return 1
    fi
    
    # 更新统计信息
    ((ZONE_INSTANCE_COUNT[$zone]++))
    ((TOTAL_INSTANCES++))
    
    # 更新已使用镜像数
    if ! echo "${ZONE_IMAGE_COUNT[$zone]}" | grep -q "$image"; then
        ZONE_IMAGE_COUNT[$zone]+=" $image"
    fi
}


#######################################
# 流程控制区
#######################################

# --------------------
# 安全确认机制
# --------------------
if [[ -t 0 ]]; then
    echo -e "${YELLOW}警告:即将开始创建实例!${NC}" | tee -a "$LOG_FILE"
    read -p "是否继续?(y/N): " -n 1 confirm
    echo  # 换行
    [[ "${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[@]}"; do
          echo -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[@]}"; do
        echo -e "${GREEN}检查可用区节点: $zone${NC}" | tee -a "$LOG_FILE"
        
        # 检查所有可用区实例总数限制
        while [ $(get_total_instances_all_zones) -ge $MAX_TOTAL_INSTANCES_ALL_ZONE ]; do
            echo -e "${YELLOW}等待:此时刻所有节点的实例总数已达上限 $MAX_TOTAL_INSTANCES_ALL_ZONE ,等待资源释放...${NC}" | tee -a "$LOG_FILE"
            sleep $SLEEP_TIME
        done
        
        # 检查镜像实例数量限制
        while [ $(get_instance_count "$image" "$zone") -ge $MAX_INSTANCES_per_Image_per_Zone ]; do
            echo -e "${YELLOW}等待:镜像 $image$zone 的实例数已达上限 ($MAX_INSTANCES_per_Image_per_Zone)${NC}" | tee -a "$LOG_FILE"
            sleep $SLEEP_TIME
        done
        
        # 执行实例创建
        create_instance "$image" "$zone"
    done
done


#######################################
# 最终统计输出
#######################################

echo -e "\n${GREEN}====== 正常结束执行结果统计 ======${NC}" | tee -a "$LOG_FILE"
for zone in "${AVAILABILITY_ZONES[@]}"; do
    echo -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"

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

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

相关文章

驱动开发硬核特训 · Day 15:电源管理核心知识与实战解析

在嵌入式系统中,电源管理(Power Management)并不是“可选项”,而是实际部署中影响系统稳定性、功耗、安全性的重要一环。今天我们将以 Linux 电源管理框架 为基础,从理论结构、内核架构,再到典型驱动实战&a…

【零基础】基于DeepSeek-R1与Qwen2.5Max的行业洞察自动化平台

自动生成行业报告,通过调用两个不同的大模型(DeepSeek 和 Qwen),完成从行业趋势分析到结构化报告生成的全过程。 完整代码:https://mp.weixin.qq.com/s/6pHi_aIDBcJKw1U61n1uUg 🧠 1. 整体目的与功能 该脚本实现了一个名为 ReportGenerator 的类,用于: 调用 DeepSe…

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配置——让数据库火力全开四、监控体系——数据库的体检中心五、备份恢复——数据安全的最后防线六、主从复制——数据同步的艺术七、安全加固——守护数据长城 引言:从小白…

【MySQL】MySQL的基础语法及其语句的介绍

1、基础语法 mysql -h【主机名】 -u【用户名】 -p //登录MySQL exit或quit; //退出MySQL show database; //查看MySQL下的所有数据库 use 【数据库名】; //进入数据库 show tables; //查看数据库下的所有表名 *MySQL的启动和关闭 &am…

【计算机视觉】三维视觉项目 - Colmap二维图像重建三维场景

COLMAP 3D重建 项目概述项目功能项目运行方式1. 环境准备2. 编译 COLMAP3. 数据准备4. 运行 COLMAP 常见问题及解决方法1. **编译问题**2. **运行问题**3. **数据问题** 项目实战建议项目参考文献 项目概述 COLMAP 是一个开源的三维重建软件,专注于 Structure-from…

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 保姆级安装教程(附安装包)

软考-信息系统项目管理师-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 可…

外接键盘与笔记本命令键键位不同解决方案(MacOS)

文章目录 修改键位第一步:打开设置第二步:进入键盘快捷键第三步:修改修饰键设置第四步:调整键位第五步:保存设置tips ikbc c87键盘win键盘没反应的解决亲测的方法这是百度的答案标题常规组合键尝试‌:型号差…

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 …

【java+Mysql】学生信息管理系统

学生信息管理系统是一种用于管理学生信息的软件系统,旨在提高学校管理效率和服务质量。本课程设计报告旨在介绍设计和实现学生信息管理系统的过程。报告首先分析了系统的需求,包括学生基本信息管理、成绩管理等功能。接着介绍了系统的设计方案&#xff0…