# openstack **Repository Path**: wchaowu/openstack ## Basic Information - **Project Name**: openstack - **Description**: open stack 复制实例shell脚本 - **Primary Language**: Shell - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-02 - **Last Updated**: 2026-01-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README curl -O https://gitee.com/wchaowu/openstack/raw/master/openstack_instance_clone.sh # OpenStack 实例复制 - 网络配置和一致性策略 本文档说明脚本的网络配置策略和配置驱动/项目一致性策略。 --- ## 核心策略 ### 1. 配置驱动和项目一致性 ✅ **配置驱动(Config Drive)** - ✅ **强制与源实例保持一致** - ✅ 源实例启用 → 新实例启用 - ✅ 源实例禁用 → 新实例禁用 - ✅ 无需手动指定,自动继承 - ✅ 确保实例行为一致 **项目(Project)** - ✅ 使用当前 OpenStack 认证环境的项目 - ✅ 通过切换 OpenStack RC 文件实现跨项目复制 - ✅ 确保资源配额和访问权限正确 ### 2. 网络配置策略 🌐 **只在明确指定时设置网络参数** 脚本遵循以下优先级: ``` 1. 用户指定的 Port ID (--port-id) ↓ 如果没有指定 2. 用户指定的固定 IP (-p/--fixed-ip) ↓ 如果没有指定 3. 用户指定的网络 (--networks) ↓ 如果没有指定 4. 使用源实例的网络,自动分配 IP ``` --- ## 详细说明 ### 场景 1: 基本复制(自动分配 IP) **命令:** ```bash ./openstack_instance_clone.sh -s web-server-01 -n web-server-02 ``` **行为:** - ✅ 使用源实例的网络 - ✅ OpenStack 自动分配可用的 IP 地址 - ✅ 配置驱动与源实例保持一致 - ✅ 使用当前项目 **输出:** ``` [复制配置摘要] 网络配置: 网络: private (继承) IP: 自动分配 配置驱动: 源: True 新: True (强制保持一致) ``` **适用场景:** - ✅ 不关心具体 IP 地址 - ✅ 同一网络内横向扩展 - ✅ 最简单、最常用的方式 --- ### 场景 2: 使用固定 IP **命令:** ```bash ./openstack_instance_clone.sh -s web-server-01 -n web-server-02 -p 192.168.1.100 ``` **行为:** - ✅ 使用源实例的网络(第一个网络) - ✅ 在该网络中分配指定的 IP: 192.168.1.100 - ✅ 如果源实例有多个网络,其他网络自动分配 IP - ✅ 配置驱动与源实例保持一致 **输出:** ``` [INFO] 使用固定 IP: 192.168.1.100 (网络: private) [复制配置摘要] 网络配置: 固定 IP: 192.168.1.100 (用户指定) 网络: private 配置驱动: 源: True 新: True (强制保持一致) ``` **适用场景:** - ✅ 需要特定的 IP 地址 - ✅ IP 地址有业务意义 - ✅ 需要预先配置 DNS 或防火墙规则 **注意事项:** - ⚠️ 确保 IP 地址未被使用 - ⚠️ IP 必须在子网的分配范围内 - ⚠️ 检查端口安全和 DHCP 设置 --- ### 场景 3: 使用预先创建的端口 **步骤 1:创建端口** ```bash # 创建带固定 IP 的端口 openstack port create \ --network private \ --fixed-ip subnet=private-subnet,ip-address=192.168.1.100 \ --security-group web-servers \ --security-group default \ web-server-02-port # 获取端口 ID PORT_ID=$(openstack port show web-server-02-port -f value -c id) ``` **步骤 2:使用端口创建实例** ```bash ./openstack_instance_clone.sh \ -s web-server-01 \ -n web-server-02 \ --port-id $PORT_ID ``` **行为:** - ✅ 使用指定的端口 - ✅ 端口中已配置的所有设置(IP、网络、安全组等)都会生效 - ✅ 配置驱动与源实例保持一致 - ✅ 可以预先配置复杂的网络设置 **输出:** ``` [INFO] 使用指定的端口 ID: a1b2c3d4-5678-90ab-cdef-123456789abc [复制配置摘要] 网络配置: 使用端口 ID: a1b2c3d4-5678-90ab-cdef-123456789abc (用户指定) 配置驱动: 源: True 新: True (强制保持一致) ``` **适用场景:** - ✅ 需要复杂的网络配置 - ✅ 需要多个固定 IP - ✅ 需要特定的安全组组合 - ✅ 需要 QoS 策略 - ✅ 需要端口级别的额外配置 **高级端口配置示例:** ```bash # 创建带多个固定 IP 的端口 openstack port create \ --network private \ --fixed-ip subnet=subnet-1,ip-address=192.168.1.100 \ --fixed-ip subnet=subnet-2,ip-address=10.0.0.100 \ --security-group web-servers \ --security-group monitoring \ --allowed-address-pair ip-address=192.168.1.200 \ --qos-policy high-priority \ multi-ip-port ``` --- ### 场景 4: 使用不同的网络 **命令:** ```bash ./openstack_instance_clone.sh \ -s web-server-01 \ -n web-server-02 \ --networks private-net,public-net ``` **行为:** - ✅ 连接到指定的网络 - ✅ 每个网络自动分配 IP - ✅ 不继承源实例的网络配置 - ✅ 配置驱动与源实例保持一致 **输出:** ``` [INFO] 使用指定的网络: private-net,public-net (自动分配 IP) [复制配置摘要] 网络配置: 网络: private-net,public-net (用户指定) IP: 自动分配 配置驱动: 源: True 新: True (强制保持一致) ``` **适用场景:** - ✅ 需要连接到不同的网络 - ✅ 跨项目复制时网络不同 - ✅ 网络架构调整 --- ### 场景 5: 跨项目复制 **步骤:** 1. **在源项目中查看源实例** ```bash # 使用源项目认证 source project-a-openrc.sh # 查看源实例详情 openstack server show web-server-01 # 记录必要信息 # - 网络名称 # - 镜像(如果是私有镜像,需要使用公共镜像替代) # - 配置类型 # - 安全组 ``` 2. **切换到目标项目** ```bash # 使用目标项目认证 source project-b-openrc.sh # 验证认证 openstack token issue ``` 3. **准备目标项目的资源** ```bash # 检查配额 openstack quota show # 检查网络可用性 openstack network list # 检查镜像可访问性 openstack image list | grep # 如果需要,创建安全组 openstack security group create web-servers openstack security group rule create web-servers --protocol tcp --dst-port 80:80 ``` 4. **执行复制** ```bash ./openstack_instance_clone.sh \ -s web-server-01 \ -n web-server-02 \ --networks target-project-network ``` **注意事项:** - ⚠️ 源实例的私有镜像在目标项目中不可访问,需要使用 `-i` 指定公共镜像 - ⚠️ 源实例的网络在目标项目中可能不可用,需要使用 `--networks` 指定 - ⚠️ 源实例的安全组在目标项目中不存在,需要预先创建或使用 `--security-groups` 指定 - ✅ 配置驱动设置会自动继承(与源实例保持一致) --- ## 配置驱动一致性 ### 为什么强制保持一致? 1. **行为一致性** - 源实例和新实例的初始化方式相同 - 避免因配置方式不同导致的问题 2. **网络配置可靠性** - 配置驱动影响网络配置的获取方式 - 保持一致确保网络配置正确应用 3. **元数据访问** - 配置驱动决定元数据的获取方式 - 一致性确保实例能正确获取所需信息 4. **故障排除简化** - 相同的配置方式便于问题定位 - 减少环境差异导致的问题 ### 配置驱动的影响 **源实例使用配置驱动(True):** ``` [INFO] 源实例配置驱动: True [INFO] 启用配置驱动(与源实例保持一致) 新实例行为: ✅ 从虚拟磁盘读取配置 ✅ 不依赖元数据服务 ✅ 适合隔离网络环境 ✅ 即使元数据服务不可达也能正常初始化 ``` **源实例不使用配置驱动(False):** ``` [INFO] 源实例配置驱动: False [INFO] 禁用配置驱动(与源实例保持一致) 新实例行为: ✅ 从元数据服务读取配置 ✅ 需要访问 169.254.169.254 ✅ 适合标准 OpenStack 环境 ✅ 支持动态元数据更新 ``` --- ## 项目一致性 ### 项目的作用 1. **资源配额** - 每个项目有独立的配额限制 - 实例、vCPU、内存、存储等 2. **资源可见性** - 网络、安全组、镜像等资源有项目级别的访问控制 - 私有资源只在所属项目中可见 3. **计费和成本分配** - 资源使用按项目统计 - 便于成本追踪和管理 ### 如何确定使用哪个项目? 脚本使用**当前 OpenStack 认证环境中的项目**: ```bash # 查看当前使用的项目 openstack token issue -f json | jq -r '.project_id' # 或查看环境变量 echo $OS_PROJECT_NAME echo $OS_PROJECT_ID ``` ### 切换项目 **方法 1:使用不同的 RC 文件** ```bash # 切换到项目 A source project-a-openrc.sh ./openstack_instance_clone.sh -s source-vm -n vm-in-project-a # 切换到项目 B source project-b-openrc.sh ./openstack_instance_clone.sh -s source-vm -n vm-in-project-b ``` **方法 2:临时设置环境变量** ```bash # 临时切换项目 export OS_PROJECT_NAME=project-b export OS_PROJECT_ID=project-b-id ./openstack_instance_clone.sh -s source-vm -n vm-in-project-b ``` **方法 3:使用 OpenStack CLI 指定** ```bash # 在命令中指定项目(仅适用于直接使用 openstack 命令) openstack --os-project-name project-b server list ``` --- ## 实际使用建议 ### ✅ 推荐做法 1. **简单场景:直接复制** ```bash ./openstack_instance_clone.sh -s source-vm -n new-vm ``` - 自动分配 IP - 继承所有配置 - 最简单可靠 2. **需要固定 IP:指定 IP** ```bash ./openstack_instance_clone.sh -s source-vm -n new-vm -p 192.168.1.100 ``` - 在源网络中分配指定 IP - 其他配置自动继承 3. **复杂网络需求:使用端口** ```bash # 预先创建和配置端口 openstack port create --network net --fixed-ip ip-address=IP my-port # 使用端口创建实例 ./openstack_instance_clone.sh -s source-vm -n new-vm --port-id ``` - 灵活配置网络 - 支持复杂场景 4. **跨项目复制:准备资源** ```bash # 切换到目标项目 source target-openrc.sh # 准备网络、镜像、安全组等 # 执行复制 ./openstack_instance_clone.sh -s source-vm -n new-vm --networks target-net ``` ### ⚠️ 注意事项 1. **IP 冲突检查** ```bash # 使用固定 IP 前检查是否已被使用 openstack port list --fixed-ip ip-address=192.168.1.100 ``` 2. **配额检查** ```bash # 复制前检查配额 openstack quota show openstack limits show --absolute ``` 3. **网络可达性** - 确保新实例所在网络有正确的路由配置 - 如果需要外部访问,确保有浮动 IP 或公网访问 4. **安全组规则** - 验证安全组规则是否允许必要的流量 - 跨项目复制时需要重新创建安全组规则 --- ## 总结 ### 核心原则 1. ✅ **配置驱动强制一致** - 与源实例保持完全相同 2. ✅ **项目使用当前环境** - 通过切换 RC 文件实现跨项目 3. ✅ **网络按需指定** - 只在明确需要时才指定网络参数 4. ✅ **自动分配优先** - 默认让 OpenStack 自动分配 IP ### 网络配置优先级 ``` Port ID > 固定 IP > 自定义网络 > 源实例网络(自动分配) ``` ### 最佳实践 - 🎯 大多数场景:不指定网络参数,使用自动分配 - 🎯 需要特定 IP:使用 `-p` 参数 - 🎯 复杂配置:预先创建端口,使用 `--port-id` - 🎯 跨项目:切换认证,准备资源,使用 `--networks` 这种设计确保了: - ✅ 简单场景简单操作 - ✅ 复杂场景灵活配置 - ✅ 行为可预测和一致 - ✅ 减少配置错误