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 下的资源。