openstack命令详解

openstack 是未来:它是 OpenStack 官方指定的统一命令行工具,所有新功能和新 API 都会优先在这里体现。

统一性:openstack 的命令结构和参数设置风格高度一致,记住了 create,就知道了 delete;记住了 server,就知道了 network。这种范式化的设计极大地降低了学习曲线。

功能强大:openstack 客户端不仅仅是简单命令的集合,它还支持处理其他客户端(如 cinder)难以实现的高级功能,如资源标签(--tag)、资源集(--all-projects等)。

首选工具:对于任何新项目的日常运维、自动化脚本编写和技术研究,都应该将 openstack 命令作为唯一且首选的工具。

下面,我们将按照不同的 OpenStack 服务模块,对 openstack 命令进行详细的、模块化的讲解。

openstack核心结构

命令模式如下:

bash 复制代码
openstack <服务名> <操作> [参数] [参数值]

<服务名>: 指定你要操作的是哪个 OpenStack 服务。例如:
    server (对应之前的 nova,管理虚拟机)
    network (对应之前的 neutron,管理网络)
    volume / volume v2 (对应之前的 cinder,管理块存储)
    image (对应之前的 glance,管理镜像)
    flavor (nova 的规格)
    security group (安全组)
    keypair (密钥对)
<操作>: 你想要执行的动作。常用的有:
    list: 列出资源
    show: 显示资源详情
    create: 创建资源
    delete: 删除资源
    add: 添加关联
    remove: 移除关联
    set: 设置资源属性
    unset: 取消某个属性

计算服务模块(server)

1. 创建虚拟机

这是启动新虚拟机的核心命令。

bash 复制代码
# 演示:创建一台虚拟机
openstack server create \
    --image "ubuntu-22.04-server" \      # 指定系统镜像
    --flavor "m1.medium" \                # 指定硬件规格
    --key-name "my-ssh-key" \             # 指定SSH密钥对
    --security-group "default" \          # 指定安全组
    --network "provider-net" \            # 指定网络
    --user-data-file /path/to/init.yaml \ # 指定cloud-init脚本文件
    my-compute-instance-01                # 虚拟机名称

常用参数详解 (--option value) 形式

  • --file <filename=filepath>: 指定要注入文件的路径和目标文件名,例如 --file /path/to/ssh-key.pub=authorized_keys。
  • --hint group=<server-group-name>: 将虚拟机放入指定的服务器组,用于亲和性/反亲和性调度。
  • --volume <volume-id>: (创建时)挂载一个已存在的云硬盘。
  • --availability-zone <zone-name>: 指定虚拟机所在可用区。

创建虚拟机的命令有点复杂,命令又很长,很多的操作命令。所以建议拆分成两部分,这样更容易创建出一个符合自己预期的虚拟机

bash 复制代码
# 创建一个作为系统盘的volume卷
openstack volume create \
    --image a70caee0-3055-4737-b5e7-074b22512a7b \
    --size 40 \
    --type volume_222 \
    Edge_20260321_maccrt02_SystemDisk
# 创建虚拟机
openstack server create \
    --flavor Edge_12U56G \
    --volume <volume-id> \  # 创建好的可以作为启动系统盘的volume卷的id
    --nic net-id=767c5153-ed3f-40ea-9327-7cf38cf5b009 \
    --hint Edge_hostgroup=true \
    Edge_20260321_maccrt02

上面的虚拟机创建好之后,就可以查看详情,得到IP地址以后,使用终端工具本地连接。

接下来是给虚拟机添加数据盘,例如:

bash 复制代码
# 创建一个空的云磁盘,注意选择磁盘类型
openstack volume create \
    --size 350 \
    --type volume_222 \
    Edge_20260321_maccrt01_1

# 查询volume
Host1-I0719-2U-Slot03:~ # openstack volume list | grep Edge_20260321_maccrt01_1
| 20aacd54-0dbc-4ddf-9bb9-078457d7a14e | Edge_20260321_maccrt01_1          | available |  350 
# 查询虚拟机server
Host1-I0719-2U-Slot03:~ # openstack server list | grep Edge_20260321_maccrt01
| 61c155e7-265d-4cd9-a5ce-c14ede84a311 | Edge_20260321_maccrt01 | ACTIVE  | GC_OM_174=8.7.174.170

核心命令:openstack server add volume
openstack server add volume  --device vdb <server> <volume>
61c155e7-265d-4cd9-a5ce-c14ede84a311 20aacd54-0dbc-4ddf-9bb9-078457d7a14e
openstack server add volume  --device /dev/vdb 61c155e7-265d-4cd9-a5ce-c14ede84a311 20aacd54-0dbc-4ddf-9bb9-078457d7a14e
或者使用名称
openstack server add volume  --device /dev/vdb Edge_20260321_maccrt01 Edge_20260321_maccrt01_1

添加完成以后可以在虚拟机上查看结果,如下:

bash 复制代码
[root@edge-20260321-maccrt01 ~]# lsblk
NAME                     MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0                      7:0    0  100G  0 loop
└─docker-252:2-1920-pool 252:4    0  100G  0 dm
loop1                      7:1    0    2G  0 loop
└─docker-252:2-1920-pool 252:4    0  100G  0 dm
vda                      253:0    0   50G  0 disk
├─vda1                   253:1    0 1023M  0 part /boot
├─vda2                   253:2    0   14G  0 part /
└─vda3                   253:3    0   24G  0 part
  ├─sysos-var_log        252:0    0    4G  0 lvm  /var/log
  ├─sysos-var_tmp        252:1    0    4G  0 lvm  /tmp
  │                                               /var/tmp
  ├─sysos-var            252:2    0    8G  0 lvm  /var
  └─sysos-swap           252:3    0    8G  0 lvm  [SWAP]
vdb                      253:16   0  350G  0 disk

可以看到已经添加成功了

2. 控制虚拟机状态

用于虚拟机的日常运维。

bash 复制代码
# 关闭虚拟机
openstack server stop my-compute-instance-01
# 开启虚拟机
openstack server start my-compute-instance-01
# 正常重启虚拟机
openstack server reboot my-compute-instance-01
# 强制重启 (模拟物理机重启键)
openstack server reboot --hard my-compute-instance-01
# 强制关闭 (模拟断电)
openstack server stop --hard my-compute-instance-01
# 删除虚拟机 (确认后执行,无法恢复)
openstack server delete my-compute-instance-01

3. 管理浮动 IP

浮动 IP 是一个可以从互联网访问的公网 IP 地址。

bash 复制代码
# 1. 创建一个浮动IP,并分配给外部网络 (网络名称通常是 provider-net)
FLOATING_IP=$(openstack floating ip create -- floating IP pool for public access provider-net -f value -c floating_ip_address)
# 2. 关联这个浮动IP到虚拟机
openstack server add floating ip my-compute-instance-01$FLOATING_IP
# 3. 从虚拟机上移除浮动IP
openstack server remove floating ip my-compute-instance-01 $FLOATING_IP
# 4. 删除浮动IP (确保没有虚拟机在使用它)
openstack floating ip delete$FLOATING_IP

-f value -c floating_ip_address 是让命令只输出 IP 地址本身,方便存储到变量中。

4. 虚拟机应急模式

当虚拟机系统损坏无法启动时,可以使用紧急模式。该模式会用一个最小的系统启动,让你进入虚拟机修复原系统。

bash 复制代码
# 将虚拟机投入紧急模式
openstack server rescue my-compute-instance-01

# 之后你可以通过 VNC 控制台或救援模式网络接入并修复它
# 修复完成后,退出紧急模式
openstack server unrescue my-compute-instance-01

网络服务模块(network)

管理虚拟网络的各种资源。

1. 创建网络和子网

bash 复制代码
# 创建一个租户私有网络
openstack network create my-private-network

# 在该网络上创建一个子网
openstack subnet create \
    --subnet-range 192.168.100.0/24 \
    --network my-private-network \
    --dns-nameserver 8.8.8.8 \
    --allocation-pool start=192.168.100.10,end=192.168.100.200 \
    my-private-subnet

2. 创建路由器并关联外部网络

让私有网络能够访问外部网络。

bash 复制代码
# 创建路由器
openstack router create my-router

# 设置路由器的外部网关 (关联到provider-net)
openstack router set --external-gateway provider-net my-router

# 添加子网接口到路由器 (建立连接)
openstack router add subnet my-router my-private-subnet

存储服务模块(volume)

管理云硬盘(块存储)。

1. 创建卷

bash 复制代码
# 创建一个 100GB 的空卷
openstack volume create --size 100 my-empty-data-volume

# 从一个镜像创建一个 50GB 的系统盘
openstack volume create \
    --image a70caee0-3055-4737-b5e7-074b22512a7b \
    --size 50 \
    my-system-disk-from-image

# 从快照创建一个卷
openstack volume create \
    --snapshot-id snap-12345 \
    --size 80 \
    my-volume-from-snapshot

个人操作如下:

创建一个带有操作系统镜像数据的卷,后面用来作为虚拟机的系统盘,命令如下:

bash 复制代码
openstack volume create \
    --image a70caee0-3055-4737-b5e7-074b22512a7b \
    --size 50 \
    --type volume_222 \
    Edge_20260321_maccrt01_SystemDisk
# 注意
# --image不能写成--image-id,这个是旧命令nova boot的
# --type参数可以执行使用的磁盘类型

执行结果如下

bash 复制代码
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| attachments         | []                                   |
| availability_zone   | az1.dc1                              |
| bootable            | false                                |
| consistencygroup_id | None                                 |
| created_at          | 2026-03-21T08:09:20.217143           |
| description         | None                                 |
| encrypted           | False                                |
| id                  | 4360119e-6beb-4e33-9c9d-63301108ccb6 |
| migration_status    | None                                 |
| multiattach         | False                                |
| name                | Edge_20260321_maccrt01_SystemDisk    |
| properties          |                                      |
| replication_status  | None                                 |
| shareable           | False                                |
| size                | 50                                   |
| snapshot_id         | None                                 |
| source_volid        | None                                 |
| status              | creating                             |
| type                | volume_222                           |
| updated_at          | None                                 |
| user_id             | f7794be8538c421a96d49cbf63e8297a     |
+---------------------+--------------------------------------+

下面展示一下详情,发现bootable参数默认是true

bash 复制代码
...
| bootable                                   | true
...

如果不是的话可以执行如下命令设置作为启动系统盘:

bash 复制代码
# 将带有操作系统数据的云磁盘设置为可启动
openstack volume set --bootable Edge_20260321_maccrt01_SystemDisk

接下来的目的一般是创虚拟机,先查询一下规格的id,系统盘的id,主机组信息等,执行如下命令创建虚拟机:

bash 复制代码
# 查询自己想要设置的规格
Host1-I0719-2U-Slot03:~ # openstack flavor list | grep Edge_12
| 198ef143-c731-4afb-8fb6-ba1f394bb1ca | Edge_12U40G_X86
| 803bed13-6ed8-48d8-a759-d18ccc08bd2a | Edge_12U56G
# 查询网络信息
Host1-I0719-2U-Slot03:~ # openstack network list
+--------------------------------------+-------------------------
| ID                                   | Name                    
+--------------------------------------+-------------------------
| 014e8711-1abf-4fc6-9d6c-7bc1b939f724 | external_om             
| 0e7e9f55-0bd9-49ca-b904-d95b3e7e78fc | internal_base           
| 38ac2da1-992b-47e9-afba-bf13cb920023 | OP_External_176         
| 3f05ceff-fe67-4bde-81dd-be8e93561ace | GC_APPOM_170            
| 721a9d67-0bf3-4ec0-9dc3-29bc39833870 | OP_Service_175          
| 767c5153-ed3f-40ea-9327-7cf38cf5b009 | GC_OM_174               
| ab352644-db52-430e-86d3-0b9f114f0f04 | GC_Servcie_External_173 
| c98780d0-3a21-4e0a-a2dc-ba1c0b35cfa3 | OP_OM_85                
| dc95beb9-aac9-48d6-a0ef-b74f3d9b548b | GC_Extertal_171         
| e3419e8e-6d42-474d-8cfa-dd70afb30b53 | GC_Service_172          
| eb84deae-f4ce-4e94-9ca4-7383bcb2b5b3 | OP_APPOM_86             
| f11af4b4-4f53-4361-9409-4ed0ce2832f4 | OP_ServiceExternal_177  
+--------------------------------------+-------------------------
# 以使用GC_OM_174为例

# 创建虚拟机
openstack server create \
    --flavor Edge_12U56G \
    --volume 4360119e-6beb-4e33-9c9d-63301108ccb6 \
    --nic net-id=767c5153-ed3f-40ea-9327-7cf38cf5b009 \
    --hint Edge_hostgroup=true \
    Edge_20260321_maccrt01

+-------------------------------------+-----------------------
| Field                               | Value                 
+-------------------------------------+-----------------------
| OS-DCF:diskConfig                   | MANUAL                
| OS-EXT-AZ:availability_zone         | az1.dc1               
| OS-EXT-SRV-ATTR:host                | None                  
| OS-EXT-SRV-ATTR:hypervisor_hostname | None                  
| OS-EXT-SRV-ATTR:instance_name       | instance-00002503     
| OS-EXT-STS:power_state              | NOSTATE               
| OS-EXT-STS:task_state               | scheduling            
| OS-EXT-STS:vm_state                 | building              
| OS-SRV-USG:launched_at              | None                  
| OS-SRV-USG:terminated_at            | None                  
| accessIPv4                          |                       
| accessIPv6                          |                       
| addresses                           |                       
| adminPass                           | None                  
| config_drive                        |                       
| created                             | 2026-03-21T09:00:20Z  
| flavor                              | Edge_12U56G (803bed13-
| hostId                              |                       
| id                                  | 61c155e7-265d-4cd9-a5c
| image                               |                       
| key_name                            | None                  
| name                                | Edge_20260321_maccrt01
| progress                            | 0                     
| project_id                          | 6f0898eb96654d6cb6af87
| properties                          |                       
| security_groups                     | name='default'        
| status                              | BUILD                 
| updated                             | 2026-03-21T09:00:20Z  
| user_id                             | f7794be8538c421a96d49c
| volumes_attached                    |                       
+-------------------------------------+-----------------------

2. 管理卷

bash 复制代码
# 列出所有卷
openstack volume list

# 查看某个卷的详情
openstack volume show my-system-disk-from-image

# 删除一个卷
openstack volume delete my-empty-data-volume

3. 管理快照

bash 复制代码
# 从一个正在使用的卷上创建快照
openstack volume snapshot create \
    --volume my-system-disk-from-image \
    --name backup-2023-10-27

# 列出所有快照
openstack volume snapshot list

镜像服务模块(image)

管理虚拟机镜像。

1. 上传镜像

bash 复制代码
可以从 OpenStack 格式的镜像文件(如 .qcow2, .raw)等上传镜像。
# 示例:从本地文件上传一个镜像文件
# --disk-format 指定镜像格式
# --container-format 指定容器格式 (bare, ovf, etc)
# --public 指定为公共镜像
# --min-disk 指定运行该镜像所需的最小磁盘大小
# --min-ram 指定运行该镜像所需的最小内存大小
openstack image create \
    --file /path/to/my-image.qcow2 \
    --disk-format qcow2 \
    --container-format bare \
    --public \
    --min-disk 20 \
    --min-ram 2048 \
    my-custom-image

基础资源和安全管理

1. 密钥对

bash 复制代码
# 添加一个新的SSH密钥对
openstack keypair add --public-key-file ~/.ssh/id_rsa.pub my-key-pair

# 列出所有密钥对
openstack keypair list

# 删除一个密钥对
openstack keypair delete my-key-pair

# 注意:--public-key-file 后面跟的是公钥文件的路径。

2. 安全组

安全组是虚拟机的虚拟防火墙。

bash 复制代码
# 列出所有安全组 (默认属于当前项目)
openstack security group list

# 创建一个新的安全组
openstack security group create --description "For web servers" web-sg

# 给安全组添加规则 (允许SSH访问)
openstack security group rule create --protocol tcp --dst-port 22:22 web-sg

# 给安全组添加规则 (允许HTTP访问)
openstack security group rule create --protocol tcp --dst-port 80:80 web-sg

# 给安全组添加规则 (允许ICMP, 用于Ping)
openstack security group rule create --protocol icmp web-sg

# 移除规则
openstack security group rule delete <rule_id>

3. 规格

bash 复制代码
# 列出所有可用的虚拟机规格
openstack flavor list

辅助和全局命令

1. 查看当前身份信息

显示你当前的认证凭证(Token)、项目 ID、用户名等,便于确认你当前是以哪个身份在操作。

bash 复制代码
openstack token issue

2. 项目管理 (管理员)

注意:这些命令通常只有管理员才能执行。

bash 复制代码
# 列出所有项目
openstack project list

# 创建新项目
openstack project create \
    --domain <domain-name> \
    --description "My new project" \
    new-project-name

3. 用户管理 (管理员)

bash 复制代码
# 列出所有用户
openstack user list

FAQ

1、怎么切换到执行的项目下创建虚拟机呢?

bash 复制代码
好的,这个问题非常经典,是 OpenStack 日常运维中的核心操作之一:如何在多个项目(租户)之间切换执行操作。

您当前的输出显示,您正在操作的项目是 dc_system_dc1:

bash
OS_PROJECT_NAME=dc_system_dc1
而您想要切换到 Service_VPC 项目(其 ID 为 8b2826629dd0402283d5d2b23bb58cd0)。

核心方法:使用 openstack project set 命令
这是在当前命令行会话中切换项目的标准方法。它会修改您的环境变量,使后续的 openstack 命令都自动在新指定的项目下执行。

命令格式
bash
openstack project set --project <目标项目的ID或名称> <目标项目的名称>
--project <ID|名称>:指定您想要切换到的目标项目,可以通过ID也可以通过名称指定。
<名称>:命令的最后一个参数,明确指出您要设置成哪个项目。
操作步骤
步骤 1:使用项目名称执行切换

这是最直观的方法,通过 Service_VPC 这个名称来切换。

bash
openstack project set --project Service_VPC Service_VPC
命令执行后不会有任何输出,这是一个正常的特征。

步骤 2:验证切换是否成功

再次查看当前的环境变量,如果切换成功,OS_PROJECT_NAME 的值就会变成 Service_VPC。

bash
echo ${OS_PROJECT_NAME}
预期输出:

Service_VPC
或者,更完整一点,用 OpenStack 官方推荐的方式查看当前令牌信息:

bash
openstack token issue
在输出结果的 Project Name 栏,您会看到 Service_VPC。

为什么需要这样做?
让我们来理解一下背后的原理。

环境变量:当您第一次通过 openstack CLI 登录 OpenStack 时,CLI 会将您的认证信息(如用户名、密码、项目、域等)保存在一系列以 OS_ 开头的环境变量中。

作用域:这些环境变量的作用域是当前终端/Shell 会话。您打开一个新的终端,这些变量就必须重新设置(通常通过执行 source 脚本)。

命令的上下文:当您运行 openstack server create 或 openstack volume list 这样需要操作资源的命令时,OpenStack CLI 会读取这些 OS_ 环境变量,从而知道您是以哪个身份(哪个项目下的哪个用户)去执行操作的。

openstack project set 命令的原理,就是直接修改了内存 OS_PROJECT_NAME 这个环境变量的值。因此,它是一条瞬时生效的"隐身衣",让您看起来仿佛直接登录到了 Service_VPC 项目下,而您实际上依然是通过同一个认证凭证在操作。

总结与最佳实践
核心命令:openstack project set --project <项目名称> <项目名称>
效果:无缝切换当前终端的操作,项目所有后续 openstack 命令都在新项目下生效。
验证:使用 echo ${OS_PROJECT_NAME} 或 openstack token issue 来确认当前项目。
重要提示:这个切换只在当前终端会话内有效。如果您关闭了终端,这些修改会丢失。下次需要操作 Service_VPC 项目时,需要重新执行一遍这个切换命令。
现在,您就可以在这个终端里,安心地创建属于 Service_VPC 项目的云硬盘、网络和虚拟机了,而不用担心会误操作到 dc_system_dc1 下的资源。
相关推荐
哈里谢顿5 天前
某云平台开发面试总结
openstack
xy1230620 天前
OpenStack Train 部署实战(三)控制节点--keystone服务
centos·openstack
哈里谢顿22 天前
云计算基础架构工程师面试终极准备指南(OpenStack 背景专属)
openstack
哈里谢顿22 天前
云计算基础架构工程师”面试通关 Checklist
openstack
yenggd25 天前
openstack一键安装及原理网络原理
网络·openstack
哈里谢顿1 个月前
Ironic 心跳机制深度解析:裸金属节点状态同步的生命线(2026 实战指南)
openstack
哈里谢顿1 个月前
Ironic Python Agent(IPA)深度解析:裸金属部署的“大脑”(2026 实战指南)
openstack
哈里谢顿1 个月前
Ironic 深度解析:OpenStack 裸金属管理的核心流程详解(2026 实战指南)
openstack
广州中轴线1 个月前
OpenStack on Kubernetes 生产部署实战(十三)
容器·kubernetes·openstack