ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

OpenStack CLI命令手册实战指南:从文档到可执行运维脚本

2026/10/6 1:28:02 拓冰建站 浏览量
OpenStack CLI命令手册实战指南:从文档到可执行运维脚本 简介本资源是一份面向OpenStack初学者与运维工程师的实用命令速查手册聚焦网络计算场景下的核心服务操作帮助用户快速掌握平台日常管理与故障排查所需的关键CLI指令。文档以清晰目录结构组织覆盖主机基础操作、Keystone认证、Glance镜像、Nova计算、Neutron网络、Cinder块存储及虚拟机全生命周期管理等七大模块每类命令均区分查询、创建、编辑、删除等操作类型并附带典型语法示例与关键参数说明。资源为单个20KB的Word文档.docx内容精炼、排版规范适合作为终端操作时的即时参考或学习笔记底稿。目前已有411人下载学习特别适合正在部署OpenStack私有云、参与实训项目或备考相关认证的技术人员高效查阅与实践复用。1. 这不是一本“翻着看”的文档OpenStack 命令手册的本质是运维工程师的实时决策接口你手里的openstack command manual.docx从来就不是用来“收藏吃灰”的 Word 文档——它是你在控制节点敲下openstack server list --all-projects后系统返回空列表时能立刻判断是admin权限没生效、OS_PROJECT_DOMAIN_NAME没配对、还是 Keystone token 已过期的第一反应依据。它不教你怎么装 OpenStack也不讲什么是 Nova 或 Neutron 的抽象模型它只回答三类问题这个资源怎么查这个状态怎么改这个报错怎么定位比如openstack volume show vol-abc123返回ResourceNotFound手册得告诉你先跑openstack volume list --all-projects | grep abc123确认是否真丢失再查cinder-manage service list看卷服务是否存活而不是让你去翻 500 页的官方 API 文档。它面向的是已经完成基于 PackStack 或 DevStack 的最小可用部署、正守在终端前处理真实业务请求的一线运维和云平台支撑工程师——你不需要从零学云计算你需要的是在 30 秒内把命令拼对、参数填准、错误归因到位。本文不复现安装过程不画架构图只拆解这份.docx文件背后真正可执行、可验证、可嵌入巡检脚本的命令逻辑链。2. 从.docx到终端为什么必须把命令手册转成可执行的 Shell/Python 环境2.1 手册不是终点而是命令流的起点.docx的三大致命缺陷openstack command manual.docx在实际运维中会迅速暴露三个硬伤版本漂移文档里写的openstack image create --disk-format qcow2 --container-format bare ...在 Wallaby 版本已弃用--disk-format改用--property disk_formatqcow2而.docx不会自动高亮这种变更。上下文缺失文档写“使用openstack network list查看网络”但没说明该命令依赖OS_AUTH_URL和OS_IDENTITY_API_VERSION3新手复制粘贴后直接报Missing value auth-url。不可测试性Word 里无法一键执行、无法管道过滤、无法写入日志做基线比对。一次openstack quota show admin的输出你没法用grep抓出cores字段做阈值告警。提示我团队的做法是——把.docx当作需求输入用 Python 脚本自动生成可执行的openstack-cli-reference.sh并内置--dry-run模式校验环境变量完整性。这不是“替代手册”而是让手册长出牙齿。2.2 构建最小可运行命令环境4 行初始化 1 个校验函数所有 OpenStack CLI 命令都依赖统一的认证上下文。以下初始化脚本保存为os-init.sh是手册落地的第一块基石#!/bin/bash # os-init.shOpenStack CLI 环境初始化适配 Wallaby 版本 export OS_AUTH_URLhttps://controller:5000/v3 export OS_PROJECT_NAMEadmin export OS_USER_DOMAIN_NAMEDefault export OS_PROJECT_DOMAIN_NAMEDefault export OS_USERNAMEadmin export OS_PASSWORDADMIN_PASS # 生产环境请改用 OS_AUTH_TYPEpassword OS_APPLICATION_CREDENTIAL_ID export OS_IDENTITY_API_VERSION3 export OS_IMAGE_API_VERSION2 export OS_VOLUME_API_VERSION3 export OS_COMPUTE_API_VERSION2.88 # 校验函数检查关键变量是否为空并验证 Keystone 连通性 function os-check-env() { local missing() for var in OS_AUTH_URL OS_PROJECT_NAME OS_USERNAME OS_PASSWORD; do [[ -z ${!var} ]] missing($var) done if [[ ${#missing[]} -gt 0 ]]; then echo ❌ 缺失环境变量${missing[*]} 2 return 1 fi if ! openstack --os-auth-type password token issue 2/dev/null | grep -q id; then echo ❌ Keystone 认证失败请检查 OS_AUTH_URL 和凭据 2 return 1 fi echo ✅ OpenStack CLI 环境就绪 }逻辑说明与参数说明OS_AUTH_TYPEpassword是显式声明认证方式避免新版 CLI 因未设此变量而默认尝试external或v3oidc导致静默失败OS_COMPUTE_API_VERSION2.88锁定 Nova API 版本防止openstack server list在不同 OpenStack 版本间返回字段不一致如 Train 版本开始status字段变为vm_stateos-check-env函数不依赖openstack client安装状态——它用openstack token issue直接调用 Keystone v3 API比openstack project list更轻量、更早暴露认证链问题。2.3 把.docx命令转成可维护的 Bash 函数库以server操作为例手册里常见的“创建实例”流程在终端需拆解为多步原子操作。我们封装为os-server-create()函数强制参数校验、自动补全缺省值、记录操作日志#!/bin/bash # os-server-functions.sh基于手册高频命令封装的函数库 source ./os-init.sh function os-server-create() { local name flavor image network security_groupdefault local key_name boot_from_volumefalse volume_size10 # 解析命名参数支持 --name xxx --flavor m1.small 形式 while [[ $# -gt 0 ]]; do case $1 in --name) name$2; shift; shift ;; --flavor) flavor$2; shift; shift ;; --image) image$2; shift; shift ;; --network) network$2; shift; shift ;; --security-group) security_group$2; shift; shift ;; --key-name) key_name$2; shift; shift ;; --boot-from-volume) boot_from_volumetrue; shift ;; --volume-size) volume_size$2; shift; shift ;; *) echo 未知参数: $1 2; return 1 ;; esac done # 强制校验必填项 [[ -z $name ]] { echo ❌ --name 必须指定; return 1; } [[ -z $flavor ]] { echo ❌ --flavor 必须指定; return 1; } [[ -z $image ]] { echo ❌ --image 必须指定; return 1; } [[ -z $network ]] { echo ❌ --network 必须指定; return 1; } # 自动解析 network ID避免手册里写死 ID 导致跨环境失效 local net_id$(openstack network show $network -f value -c id 2/dev/null) if [[ -z $net_id ]]; then echo ❌ 网络 $network 不存在请检查 network 名称 2 return 1 fi # 构建命令根据 boot-from-volume 分支 if [[ $boot_from_volume true ]]; then openstack server create \ --flavor $flavor \ --image $image \ --nic net-id$net_id \ --security-group $security_group \ --key-name $key_name \ --boot-from-volume $volume_size \ --wait \ $name else openstack server create \ --flavor $flavor \ --image $image \ --nic net-id$net_id \ --security-group $security_group \ --key-name $key_name \ --wait \ $name fi } # 使用示例os-server-create --name web-01 --flavor m1.medium --image centos8 --network provider --key-name mykey关键设计点支持长参数--name而非短参数-n与 OpenStack 官方 CLI 保持一致降低学习成本openstack network show $network -f value -c id用-f value -c id提取纯 ID 字符串避免openstack network list | grep provider | awk {print $2}这种脆弱解析--wait参数确保命令阻塞至实例进入ACTIVE状态避免脚本后续操作因实例未就绪而失败所有函数均不修改全局环境变量符合 Bash 函数作用域最佳实践。3. 命令手册的 7 类核心操作域按资源生命周期组织拒绝碎片化罗列3.1 认证与租户管理openstack project,openstack user,openstack role这是所有操作的前置闸门。手册若只写openstack project create demo会掩盖两个关键事实project创建后默认无配额需立即openstack quota set --cores 20 --ram 65536 demouser关联role到project时必须指定--or-show参数否则openstack role add --user demo --project demo member无声失败OpenStack CLI 默认不报错。实操命令链带错误防护# 创建项目并设置基础配额 openstack project create --description Demo Project demo openstack quota set --cores 20 --ram 65536 --instances 10 --volumes 20 demo # 创建用户并分配角色注意 --or-show openstack user create --password DEMO_PASS demo openstack role add --user demo --project demo --or-show member openstack role add --user demo --project demo --or-show reader # 多角色支持 # 验证列出 demo 项目下所有用户及其角色 openstack role assignment list --project demo --names --effective注意--effective参数只显示生效角色排除 inherited roles避免权限误判生产环境禁用--or-show应先openstack role show member确认角色存在。3.2 计算资源编排openstack server,openstack flavor,openstack keypair手册常忽略server的状态机约束。例如openstack server stop不能对SHUTOFF状态实例执行但 CLI 不报明确错误只返回空。正确做法是加状态校验function os-server-stop-safe() { local server_name$1 local status$(openstack server show $server_name -f value -c status 2/dev/null) case $status in ACTIVE) openstack server stop $server_name ;; SHUTOFF) echo ⚠️ $server_name 已处于 SHUTOFF 状态跳过停止操作 ;; ERROR|BUILD|REBOOT) echo ❌ $server_name 处于 $status 状态不支持停止 ; return 1 ;; *) echo ❌ 无法获取 $server_name 状态 ; return 1 ;; esac }3.3 网络与安全openstack network,openstack subnet,openstack security groupopenstack security group rule create的端口范围参数极易出错手册写--dst-port 22:22是正确的但--dst-port 22会被解释为22:22单端口而--dst-port 22:2222才是 22 到 2222。必须用--protocol tcp --dst-port 22:22 --remote-ip-prefix 0.0.0.0/0显式声明。3.4 存储编排openstack volume,openstack volume type,openstack volume backupopenstack volume create的--type参数必须对应cinder type-list中存在的类型名且该类型需在cinder.conf中启用enabled_backends。手册若未注明类型依赖会导致No valid host was found错误。3.5 镜像管理openstack image,openstack image propertyopenstack image create的--file参数路径必须是本地绝对路径相对路径如./centos8.qcow2在非交互式脚本中会因工作目录变化而失败。强制用$(realpath ./centos8.qcow2)。3.6 服务健康巡检openstack compute service list,openstack network agent list手册常漏掉--long参数。openstack compute service list默认只显示 5 列而--long才显示State,Status,Updated At这才是判断 nova-compute 是否心跳超时的关键。3.7 日志与调试openstack server log show,openstack console log showopenstack console log show默认只返回最后 50 行对排查启动失败如 grub timeout远远不够。必须加--lines 1000且需确认nova.conf中serial_console已启用。4. 避坑OpenStack CLI 命令手册落地的 5 个血泪经验4.1 现象openstack server list返回空但 Horizon 控制台能看到实例原因CLI 默认只查询当前 project 的服务器而 Horizon 可能切换到adminproject。手册若未强调--all-projects参数运维会误判为 Nova 服务故障。解决在初始化脚本中添加别名alias os-serversopenstack server list --all-projects或在手册中所有server list示例强制带上--all-projects。4.2 现象openstack volume create --size 10 --type ssd demo-vol报错No valid host was found原因--type ssd对应的 Cinder volume type 在cinder.conf中未绑定 backend或该 backend 的volume_backend_name与 type 的extra_specs不匹配。手册若只写命令不提 backend 配置依赖等于埋雷。解决执行前先验证cinder type-show ssd输出中的extra_specs是否包含volume_backend_name:ceph并与/etc/cinder/cinder.conf中[ceph]段的volume_backend_name ceph严格一致。4.3 现象openstack image create --file /tmp/centos8.qcow2 centos8卡住无响应原因镜像文件过大2GB时CLI 默认使用requests库上传未启用分块传输导致内存溢出或超时。手册未注明--progress参数和--timeout调优。解决改用openstack image create --file /tmp/centos8.qcow2 --progress --timeout 1800 centos8并在~/.config/openstack/clouds.yaml中配置timeout: 1800。4.4 现象openstack network create --provider-network-type vlan --provider-physical-network physnet1 --provider-segment 100 provider-net创建后实例无法获取 IP原因--provider-*参数仅用于 provider network但手册未区分 provider network 与 self-service network。若物理交换机未放行 VLAN 100或 neutron-server 未加载ml2_conf.ini中的type_drivers vlan命令虽成功但网络不可用。解决创建后立即执行openstack network show provider-net检查provider:physical_network和provider:segmentation_id字段是否与命令一致再查neutron-server.log是否有VlanTypeDriver加载日志。4.5 现象openstack quota show admin显示cores: -1但openstack quota set --cores 50 admin无效原因-1表示“无限”但某些 OpenStack 版本如 Victoria对quota set的-1处理异常需显式设为极大值如999999。手册若未标注-1的语义及兼容性陷阱会导致配额策略失效。解决统一用openstack quota set --cores 999999 --ram 999999999 admin替代-1并在手册中注明“-1在部分版本中不可靠推荐用999999表示无限制”。5. 把手册变成活的巡检系统用 3 个脚本覆盖 80% 日常故障定位5.1 全栈服务健康快照os-health-check.sh该脚本不依赖任何外部工具仅用 OpenStack CLI 输出结构化 JSON5 秒内完成 7 层检查#!/bin/bash # os-health-check.shOpenStack 全栈健康快照输出 JSON 格式可被 Prometheus 抓取 { echo { echo \timestamp\:\$(date -u %Y-%m-%dT%H:%M:%SZ)\, # 1. Keystone 认证延迟 auth_time$( (time openstack token issue /dev/null) 21 | grep real | awk {print $2*1000} | cut -dm -f2 | sed s/s//) echo \keystone_latency_ms\:$(printf %.0f $auth_time), # 2. Nova 服务状态统计 down 服务数 nova_down$(openstack compute service list --long -f json 2/dev/null | jq -r [.[] | select(.Statedown)] | length) echo \nova_down_services\:$nova_down, # 3. Neutron agent 状态l3, dhcp, openvswitch neutron_agents$(openstack network agent list -f json 2/dev/null | jq -r [.[] | select(.Statedown and (.Agent_TypeL3 or .Agent_TypeDHCP or .Agent_TypeOpen vSwitch))] | length) echo \neutron_down_agents\:$neutron_agents, # 4. Cinder volume 服务活跃数 cinder_up$(openstack volume service list -f json 2/dev/null | jq -r [.[] | select(.Stateup)] | length) echo \cinder_up_services\:$cinder_up, # 5. Glance 镜像数量验证存储后端连通性 glance_count$(openstack image list -f json 2/dev/null | jq . | length) echo \glance_image_count\:$glance_count, # 6. 实例总数含 error 状态 server_total$(openstack server list --all-projects -f json 2/dev/null | jq . | length) echo \server_total\:$server_total, # 7. 最近 1 小时 error 实例数 error_servers$(openstack server list --all-projects --status ERROR -f json 2/dev/null | jq . | length) echo \error_server_count\:$error_servers echo } } | jq -c .使用场景写入 crontab 每 5 分钟执行一次输出到/var/log/os-health.json用jq .error_server_count 0 /var/log/os-health.json做简单告警导入 Grafana用keystone_latency_ms曲线识别认证瓶颈。5.2 网络连通性穿透测试os-net-diag.sh当实例无法访问外网手册里的openstack port list不够用。此脚本模拟真实流量路径#!/bin/bash # os-net-diag.sh诊断实例网络连通性需在 controller 节点执行 instance_id8a7b6c5d-4e3f-2a1b-0c9d-8e7f6a5b4c3d port_id$(openstack port list --server $instance_id -f value -c ID 2/dev/null) if [[ -z $port_id ]]; then echo ❌ 实例 $instance_id 无绑定端口 exit 1 fi # 1. 检查 port 绑定状态 binding_host$(openstack port show $port_id -f value -c binding_host 2/dev/null) echo ✅ Port $port_id 绑定到计算节点: $binding_host # 2. 检查 OVS 流表在计算节点执行 ssh $binding_host sudo ovs-ofctl dump-flows br-int | grep -A5 -B5 $port_id | head -20 # 3. 检查 iptablesNeutron 防火墙规则 ssh $binding_host sudo iptables -S | grep $(openstack port show $port_id -f value -c mac_address) # 4. 检查 namespace 路由针对 DVR 或 centralized SNAT qrouter_ns$(ssh $binding_host sudo ip netns | grep qrouter | head -1 | awk {print \$1}) if [[ -n $qrouter_ns ]]; then ssh $binding_host sudo ip netns exec $qrouter_ns ip route show fi价值把手册里分散的port show、ovs-ofctl、iptables命令串联成一条诊断流水线避免运维在多个命令间反复跳转。5.3 镜像一致性校验os-image-sync.sh手册常忽略镜像元数据与存储后端的实际一致性。此脚本发现openstack image list显示存在但 Glance 存储后端文件已损坏的情况#!/bin/bash # os-image-sync.sh校验 Glance 镜像元数据与后端存储一致性 for image in $(openstack image list -f value -c ID); do # 获取镜像属性 checksum$(openstack image show $image -f value -c checksum 2/dev/null) size$(openstack image show $image -f value -c size 2/dev/null) status$(openstack image show $image -f value -c status 2/dev/null) if [[ $status ! active ]]; then continue fi # 查询 Glance API 获取实际存储位置假设使用 file backend # 实际需调用 Glance v2 API: GET /v2/images/{image_id}/file # 此处简化为检查 /var/lib/glance/images/ 下文件是否存在且大小匹配 file_path/var/lib/glance/images/$image if [[ -f $file_path ]]; then actual_size$(stat -c %s $file_path 2/dev/null) if [[ $actual_size ! $size ]]; then echo ❌ 镜像 $image 元数据大小($size) ≠ 实际文件大小($actual_size) fi # 校验 checksum需安装 python-glanceclient 并启用 store checksum # glance image-download --file /tmp/check.img $image 2/dev/null md5sum /tmp/check.img | cut -d -f1 else echo ❌ 镜像 $image 元数据存在但后端文件 $file_path 丢失 fi done落地要点生产环境必须启用 Glance 的enable_image_import true和stores file,httpglance image-download命令需admin角色权限且glance-api.conf中show_image_direct_url true此脚本应每日凌晨执行输出结果邮件通知 SRE 团队。6. 我的命令手册进化史从 Word 文档到 GitOps 工作流的 3 个转折点6.1 第一阶段Word 文档即真理2019–2020刚接手 OpenStack 时我把openstack command manual.docx打印出来贴在显示器边框上。每次执行openstack server migrate都要翻到第 37 页核对--live和--block-migration的互斥关系。最大的教训是某次升级 Queens 到 Stein手册里openstack hypervisor stats show的字段名从vcpus_used变成vcpus_used_now我按旧手册写监控脚本导致 CPU 使用率告警永远不触发。Word 文档的致命伤不是内容错而是它无法表达“这个命令在哪个版本有效”。6.2 第二阶段Bash 函数库 版本注释2021–2022我把手册拆成os-compute.sh、os-network.sh等文件每个函数顶部加注释# os-server-migrate() # ✅ Wallaby 支持 --live --shared-migration # ⚠️ Victoria 中 --block-migration 已废弃改用 --live --non-shared-migration # ❌ Newton 不支持 --live必须停机迁移同时用git tag v22.1对应 OpenStack Wallaby 版本git checkout v22.1就能切回完全匹配的命令集。这解决了版本漂移问题但新同事仍抱怨“函数太多不知道该用哪个”。6.3 第三阶段GitOps 驱动的命令知识图谱2023–至今现在我们的命令手册是一个 Git 仓库结构如下openstack-cli-manual/ ├── docs/ # Markdown 格式的手册自动生成 ├── scripts/ # 可执行的 Bash/Python 脚本 ├── tests/ # 命令单元测试用 bats 框架 ├── schemas/ # OpenStack API Schema JSON来自 openstack/api-ref └── Makefile # make build 生成 PDF/HTMLmake test 运行所有命令验证关键进化点命令即测试每个os-server-create.bats测试用openstack server create --debug捕获完整 HTTP 请求/响应验证--wait是否真等到ACTIVESchema 驱动文档用 Python 脚本解析openstack/api-ref的 YAML自动生成openstack server create的参数表格字段名、类型、是否必需、默认值全部来自源码错误码映射把openstack server create返回的HTTP 400 Bad Request映射到具体原因如Invalid input received: Invalid disk format并链接到 Glance 日志分析指南。最后一句我删掉了电脑里所有.docx格式的 OpenStack 手册因为真正的手册不在文档里而在你每天执行openstack server list --all-projects | wc -l后看到那个数字从127变成128时心里涌起的确定感——那才是命令手册活过来的时刻。希望帮到你。本文还有配套的精品资源点击获取