終于開始 OpenStack 的介紹了。
本節(jié)將介紹 OpenStack 架構(gòu)和安裝。模塊的詳細功能將在后面的小節(jié)中介紹。
一、概念架構(gòu)(Conceptual Architecture)

1. 核心模塊說明
Nova: 管理計算資源,管理虛擬機的生命周期
Neutron:管理網(wǎng)絡(luò)資源,負(fù)責(zé)創(chuàng)建和管理 L2,L3 網(wǎng)絡(luò),為虛擬機提供虛擬網(wǎng)絡(luò)和物理網(wǎng)絡(luò)
Glance:管理虛擬機的啟動鏡像,Nova 創(chuàng)建虛擬機時將使用 Glance 提供的鏡像
Cinder:為虛擬機提供塊存儲服務(wù),Cinder 提供虛擬機的虛擬硬盤,一般作為數(shù)據(jù)盤
Keystone:為各種服務(wù)提供認(rèn)證和權(quán)限管理服務(wù)。OpenStack 的每個操作必須通過 Keystone 的審核
2. 可選服務(wù)
Swift:對象存儲服務(wù)
Ceilometer:提供 OpenStack 監(jiān)控和計量服務(wù),為報警、統(tǒng)計或計費提供數(shù)據(jù)
Horzon:Web 操作頁面
Ironic:是一個進行裸機部署安裝的模塊,可以很方便的對指定的一臺或多臺裸機,執(zhí)行硬盤 RAID、分區(qū)和格式化;安裝操作系統(tǒng)、驅(qū)動程序;安裝應(yīng)用程序的操作
Trove:為用戶提供的數(shù)據(jù)庫即服務(wù) (DBaaS)
Heat:Heat 是 OpenStack 提供的自動編排功能的組件,基于描述性的模板,來編排復(fù)合云應(yīng)用程序。
Sahara:為用戶提供簡單部署 Hadoop 集群的能力,比如通過簡單的配置:Hadoop 版本、集群結(jié)構(gòu)、節(jié)點硬件信息等。在用戶提供了這些參數(shù)后,Sahara 迅速把 Hadoop 集群部署起來。同時也支持集群的擴容和減容。
二、 邏輯架構(gòu)(Logical Architecture)

在邏輯架構(gòu)中可以看到每個服務(wù)由若干個組件組成。每個組件的詳細信息后面的章節(jié)會逐個介紹。
三、安裝OpenStack
我使用的是 OpenStack 的 DevStack 進行開發(fā)環(huán)境的部署。
DevStack 有豐富的選項讓我們能夠靈活的選擇和部署想要的 OpenStack 服務(wù)。
1. 部署拓?fù)?/h2>
-
控制節(jié)點(Controller Node)
管理 OpenStack,運行的服務(wù)有 Keystone、Glance、Horizon、Nove 和 Neutron 中管理相關(guān)的組件。
運行支持 OpenStack 的服務(wù),如:數(shù)據(jù)庫(MySQL)、消息隊列(RabbitMQ)和網(wǎng)絡(luò)時間服務(wù) NTP。
-
網(wǎng)絡(luò)節(jié)點(Network Node)
運行的服務(wù)為 Neutron 為 OpenStack 提供 L2 和 L3 網(wǎng)絡(luò)。包含虛擬機網(wǎng)絡(luò)、DHCP、路由、NAT 等。
控制節(jié)點(Controller Node)
管理 OpenStack,運行的服務(wù)有 Keystone、Glance、Horizon、Nove 和 Neutron 中管理相關(guān)的組件。
運行支持 OpenStack 的服務(wù),如:數(shù)據(jù)庫(MySQL)、消息隊列(RabbitMQ)和網(wǎng)絡(luò)時間服務(wù) NTP。
網(wǎng)絡(luò)節(jié)點(Network Node)
運行的服務(wù)為 Neutron 為 OpenStack 提供 L2 和 L3 網(wǎng)絡(luò)。包含虛擬機網(wǎng)絡(luò)、DHCP、路由、NAT 等。
邏輯上,OpenStack 至少包括下面幾類網(wǎng)絡(luò):
Management 網(wǎng)絡(luò)
用于節(jié)點之間的 message queue 內(nèi)部通信以及訪問 database 服務(wù),所有的節(jié)點都需要連接到 management 網(wǎng)絡(luò)。API 網(wǎng)絡(luò)
OpenStack 各組見通過該網(wǎng)絡(luò)向用戶暴露 API 服務(wù)。Keystone、Nova、Neutron、Glance、Cinder、Horizon 的 Endpoint 均配置在 API 網(wǎng)絡(luò)上。VM 網(wǎng)絡(luò)
VM 網(wǎng)絡(luò)也叫 Tenant 網(wǎng)絡(luò),用于 Instance 之間通訊。VM 網(wǎng)絡(luò)可以選擇的類型包括 local、flat、vlan、vxlan 和 gre。VM 網(wǎng)絡(luò)由 Neutron 配置和管理。External 網(wǎng)絡(luò)
External 網(wǎng)絡(luò)指的是 VM 網(wǎng)絡(luò)之外的網(wǎng)絡(luò),該網(wǎng)絡(luò)不由 Neutron 管理。Neutron 可以將 router 連接到 External 網(wǎng)絡(luò),為 Instance 提供可以訪問外部網(wǎng)絡(luò)的能力。
這幾類網(wǎng)絡(luò)只是邏輯上的劃分,物理實現(xiàn)上可以有非常大的自由度。我可以為每個網(wǎng)絡(luò)分配單獨的網(wǎng)卡,也可以多種網(wǎng)絡(luò)使用一個網(wǎng)卡。
-
存儲節(jié)點 (Storage Node)
提供塊存儲(Cinder)或?qū)ο蟠鎯Γ⊿wift)服務(wù)。
-
計算節(jié)點(Compute Node)
運行 Hypervisor (默認(rèn)使用KVM)服務(wù)。同時運行 Neuron 服務(wù)的 agent,為虛擬機提供網(wǎng)絡(luò)支持。
以上節(jié)點是從功能上進行的邏輯劃分,在實際中可以根據(jù)需求配置。
2. 開發(fā)環(huán)境
-
兩臺虛擬機
devstack-controller:控制節(jié)點 + 網(wǎng)絡(luò)節(jié)點 + 塊存儲節(jié)點 + 計算節(jié)點
devstack-compute:計算節(jié)點
拓?fù)鋱D如下:

-
虛擬機配置
devstack-controller:
CPU 1~2
Memory 8 GB
Disk 100 GB
NIC 3
System Ubuntu-16.04devstack-compute:
CPU 2~4+
Memory 8+ GB
Disk 100+ GB
NIC 2
System Ubuntu-16.04-
網(wǎng)絡(luò)規(guī)劃
devstack-controller:
eth0:內(nèi)部管理,如服務(wù)之間的通信問題??梢院屯獠烤W(wǎng)絡(luò)共用一個。
eth1:部署的虛擬機所使用的網(wǎng)絡(luò)。內(nèi)部私有網(wǎng)絡(luò)(Tenant Network)。
eth2:外部網(wǎng)絡(luò)(External Network)。
devstack-compute:
eth0:內(nèi)部管理用的管理網(wǎng)絡(luò)。
eth1:部署虛擬機使用的網(wǎng)絡(luò)。-
虛擬機網(wǎng)卡配置信息如下
devstack-controller:
/etc/network/interfaces配置文件
root@controller:~# vim /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto ens35
iface ens35 inet static
address 172.16.245.138
netmask 255.255.255.0
gateway 172.16.245.2
dns-nameservers 172.16.245.2
auto ens33
iface ens33 inet manual
auto ens34
iface ens34 inet manual
網(wǎng)卡信息
root@controller:~# ifconfig
ens33 Link encap:Ethernet HWaddr 00:0c:29:45:54:1b
inet6 addr: fe80::20c:29ff:fe45:541b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:45867 errors:0 dropped:0 overruns:0 frame:0
TX packets:119 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2758193 (2.7 MB) TX bytes:10194 (10.1 KB)
Interrupt:19 Base address:0x2000
ens34 Link encap:Ethernet HWaddr 00:0c:29:45:54:25
inet6 addr: fe80::20c:29ff:fe45:5425/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:1048 (1.0 KB)
Interrupt:16 Base address:0x2080
ens35 Link encap:Ethernet HWaddr 00:0c:29:45:54:2f
inet addr:172.16.245.138 Bcast:172.16.245.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe45:542f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:719810 errors:122 dropped:4 overruns:0 frame:0
TX packets:414852 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1022413200 (1.0 GB) TX bytes:30446706 (30.4 MB)
Interrupt:17 Base address:0x2400
- devstack-compute:
/etc/network/interfaces配置文件
root@compute:~# vim /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto ens33
iface ens33 inet static
address 172.16.245.140
netmask 255.255.255.0
gateway 172.16.245.2
dns-nameservers 172.16.245.2
auto ens34
iface ens34 inet manual
網(wǎng)卡信息
root@compute:~# ifconfig
ens33 Link encap:Ethernet HWaddr 00:0c:29:cd:cf:60
inet addr:172.16.245.140 Bcast:172.16.245.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fecd:cf60/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:201970 errors:81 dropped:81 overruns:0 frame:0
TX packets:105843 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:291109470 (291.1 MB) TX bytes:6866198 (6.8 MB)
Interrupt:19 Base address:0x2000
ens34 Link encap:Ethernet HWaddr 00:0c:29:cd:cf:6a
inet6 addr: fe80::20c:29ff:fecd:cf6a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:648 (648.0 B)
Interrupt:16 Base address:0x2080
3. 開始安裝
-
更新
apt-get
# apt-get update
# apt-get upgrade
:
apt-get的源建議不要修改,雖然會很慢。有些源內(nèi)容不完整,會有很多錯誤哦。
以下源我使用安裝的目前沒有報錯。/etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
-
安裝并且更新
pip
# apt-get install python-pip
# pip install --upgrade pip
# pip install -U os-testr
:如果pip版本很舊的話在安裝 DevStack 時會報錯
-
設(shè)定時區(qū)
設(shè)定時區(qū): Asia -> Shanghai -> OK
# dpkg-reconfigure tzdata
-
同步時間
安裝時間同步工具 ntpdate
# apt-get install ntpdate
與網(wǎng)絡(luò)服務(wù)器同步時間
# ntpdate cn.pool.ntp.org
查看是否成功
# date
-
安裝
git
# apt-get install git
-
創(chuàng)建stack用戶并設(shè)置權(quán)限
# sudo useradd -s /bin/bash -d /opt/stack -m stack
# echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
:因為stack賬戶會修改系統(tǒng)的權(quán)限,所以要給一個高級權(quán)限。
-
進入
stack賬戶
# su - stack
-
下載
devstack
為了方便將 devstack 放在 /opt/stack/ 目錄下
# cd /opt/stack
# git clone https://github.com/openstack-dev/devstack -b stable/ocata
devstack 有很多分支,可以去這里 https://git.openstack.org/cgit/openstack-dev/devstack 查看
-
配置 Devstack 編輯
local.conf文件 devstack-controller
目錄:/opt/stack/devstack/local.conf
內(nèi)容如下:
HOST_IP為控制節(jié)點內(nèi)部管理IP;
# Credentials相關(guān)服務(wù)的密碼
# Branches是安裝的版本(也就是分支名);
[[local|localrc]]
MULTI_HOST=true
GIT_BASE=http://git.trystack.cn
# management & api network
HOST_IP=172.16.245.138
LOGFILE=/opt/stack/logs/stack.sh.log
# Credentials
ADMIN_PASSWORD=admin
MYSQL_PASSWORD=admin
RABBIT_PASSWORD=admin
SERVICE_PASSWORD=admin
SERVICE_TOKEN=abcdefghijklmnopqrstuvwxyz
# enable neutron-ml2-vlan
disable_service n-net
enable_service q-svc,q-agt,q-dhcp,q-l3,q-meta,neutron,q-lbaas,q-fwaas,q-vpn
enable_plugin neutron-fwaas http://git.trystack.cn/openstack/neutron-fwaas.git
enable_plugin neutron-fwaas-dashboard http://git.trystack.cn/openstack/neutron-fwaas-dashboard.git
enable_plugin neutron-lbaas http://git.trystack.cn/openstack/neutron-lbaas.git
enable_plugin neutron-lbaas-dashboard http://git.trystack.cn/openstack/neutron-lbaas-dashboard.git
Q_AGENT=linuxbridge
ENABLE_TENANT_VLANS=True
TENANT_VLAN_RANGE=3001:4000
PHYSICAL_NETWORK=default
LOG_COLOR=True
LOGDIR=$DEST/logs
SCREEN_LOGDIR=$LOGDIR/screen
# Branches
# KEYSTONE_BRANCH=stable/ocata
# NOVA_BRANCH=stable/ocata
# NEUTRON_BRANCH=stable/ocata
# SWIFT_BRANCH=stable/ocata
# GLANCE_BRANCH=stable/ocata
# CINDER_BRANCH=stable/ocat
enable_service 服務(wù)介紹
| 服務(wù) | 介紹 |
|---|---|
| q-agt | Core Agent,包括 Linux Bridge Agent 和 Open vSwitch Agent |
| q-dhcp | dhcp agent |
| q-l3 | L3 Agent 提供 routing 服務(wù) |
| q-meta | Neutron Metadata Agent |
| q-lbaas | Load Balance Agent |
| q-fwaas | Firewall 服務(wù) |
| q-vpn | VPN Agent 提供 VPN as a Service |
- devstack-compute
目錄:/opt/stack/devstack/local.conf
內(nèi)容如下:
HOST_IP為計算節(jié)點內(nèi)部管理IP;
# Credentials相關(guān)服務(wù)的密碼
SERVICE_HOST為控制節(jié)點IP;
# Branches是安裝的版本(也就是分支名);
# vnc config為vnc 配置信息;
[[local|localrc]]
MULTI_HOST=true
GIT_BASE=http://git.trystack.cn
# management & api network
HOST_IP=172.16.245.140
# Credentials
ADMIN_PASSWORD=admin
MYSQL_PASSWORD=admin
RABBIT_PASSWORD=admin
SERVICE_PASSWORD=admin
SERVICE_TOKEN=abcdefghijklmnopqrstuvwxyz
# Service information
SERVICE_HOST=172.16.245.138
MYSQL_HOST=$SERVICE_HOST
RABBIT_HOST=$SERVICE_HOST
GLANCE_HOSTPORT=$SERVICE_HOST:9292
Q_HOST=$SERVICE_HOST
KEYSTONE_AUTH_HOST=$SERVICE_HOST
KEYSTONE_SERVICE_HOST=$SERVICE_HOST
CEILOMETER_BACKEND=mongodb
DATABASE_TYPE=mysql
ENABLED_SERVICES=n-cpu,q-agt,neutron
Q_AGENT=linuxbridge
ENABLE_TENANT_VLANS=True
TENANT_VLAN_RANGE=3001:4000
PHYSICAL_NETWORK=default
# vnc config
NOVA_VNC_ENABLED=True
NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_auto.html"
VNCSERVER_LISTEN=$HOST_IP
VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN
LOG_COLOR=True
LOGDIR=$DEST/logs
SCREEN_LOGDIR=$LOGDIR/screen
# Branches
# KEYSTONE_BRANCH=stable/ocata
# NOVA_BRANCH=stable/ocata
# NEUTRON_BRANCH=stable/ocata
# SWIFT_BRANCH=stable/ocata
# GLANCE_BRANCH=stable/ocata
# CINDER_BRANCH=stable/ocata
# use TryStack git mirror
GIT_BASE=http://git.trystack.cn
-
可以使用國內(nèi)源安裝 OpenStack
在 [[local|localrc]] 添加下面代碼即可,國內(nèi)源
GIT_BASE=http://git.trystack.cn
: 國內(nèi)源存在同步滯后,可能包不兼容或者下載某些包失敗問題,出現(xiàn)這種情況時只需要重新替換原來的鏡像源,然后重新運行
./stack.sh 即可。
-
部署其它 OpenStack 服務(wù)
使用 enable_plugin plugin_name [code repo] [branch] 即可如下
enable_plugin neutron-fwaas http://git.trystack.cn/openstack/neutron-fwaas.git
enable_plugin neutron-fwaas-dashboard http://git.trystack.cn/openstack/neutron-fwaas-dashboard.git
enable_plugin neutron-lbaas http://git.trystack.cn/openstack/neutron-lbaas.git
enable_plugin neutron-lbaas-dashboard http://git.trystack.cn/openstack/neutron-lbaas-dashboard.git
配置安裝防火墻和負(fù)載均衡服務(wù)。
-
開始安裝
# /opt/stack/devstack/stack.sh
時間超長等待即可。如果提示time out重新執(zhí)行就可以;
安裝成功后,如果重啟系統(tǒng),需要手動啟動OpenStack
# su stack
# screen -c stack-screenrc
關(guān)于 screen 后面有介紹。
-
控制節(jié)點安裝成功返回如下信息:
-
計算節(jié)點安裝成功返回如下信息:
-
訪問
-
登錄
用戶名:admin,我這里設(shè)置的密碼也是admin
http://172.16.245.138/dashboard
登錄頁面 -
確認(rèn)服務(wù)正常
系統(tǒng)信息


-
刪除測試網(wǎng)絡(luò)
在部署完成時會自動創(chuàng)建幾個測試網(wǎng)絡(luò),為了一個干凈的環(huán)境刪掉即可
Admin -> 系統(tǒng) -> 路由
Admin -> 系統(tǒng) -> 網(wǎng)絡(luò)
把這兩個里面的內(nèi)容刪掉,就可以得到一個干凈的環(huán)境了。
三、可能遇到的錯誤
-
執(zhí)行
./stack.sh時1. If you wish to run this script anyway run with FORCE=yes
# FORCE=yes ./stack.sh
-
在執(zhí)行安裝前一定要把
pip升級,升級可能遇到的錯誤如下
Traceback (most recent call last):
File "/usr/bin/pip", line 9, in <module>
from pip import main
ImportError: cannot import name main
刪除 /usr/bin/pip, 然后重新軟連ln -s /usr/local/bin/pip /usr/bin/pip;
:這個操作切換到root用戶下執(zhí)行。
-
錯誤
Unable to locate package libsystemd-dev
ubuntu 16.04
# apt-get install libsystemd-dev
ubuntu 14.04
# apt-get install libsystemd-daemon-dev
-
加載不到模塊
openstack_auth
ImportError: No module named openstack_auth
解決辦法:
進入 root 用戶下,卸載 openstack_auth pip uninstall django_openstack_auth 。
然后升級 pip 到最新,我目前是 19.X。然后再用最新的 pip 重新安裝 pip install django_openstack_auth 然后就可以了。
蛋疼啊~~
-
執(zhí)行過程中需要重新執(zhí)行
如果安裝過程中某個包提示找不到,則需要重新執(zhí)行 ./stack.sh(如果有其他問題則需要先 ./unstack.sh)。在整個 devstack 安裝過程中會有很多次重新執(zhí)行 ./stack.sh。
-
安裝過程 pip 報錯
from pip._internal import main
修改/opt/stack/.local/bin/pip2.7
將 from pip._internal import main
改 from pip import main
-
安裝計算節(jié)點時報錯
Didn't find service registered by hostname after 120 seconds。
在計算節(jié)點的 local.conf 中添加placement-api.。如下
ENABLED_SERVICES=n-cpu,q-agt,neutron,placement-api
或者直接
enable_service placement-api
-
在創(chuàng)建 Instance 時使用 cirros 測試鏡像報錯,計算節(jié)點找不到硬盤。
Booting from Hard Disk...GRUB
修改計算節(jié)點 /etc/nova/nova.conf 中 virt_type=kvm 改為 virt_type=qemu 重啟 nova 服務(wù)即可
-
在創(chuàng)建 Instance 時使用 cirros 測試鏡像報錯,cpu x86-64錯誤時
This kernel requires an x86-64 CPU, but only detected an i686 CPU.
Unable to boot - please use a kernel appropriate for your CPU.
因為當(dāng)前計算節(jié)點的操作系統(tǒng)不是 x86-64 的系統(tǒng)。所以不能跑 x86-64 的鏡像。
四、screen工具的使用
1. 查看
stack@controller:~/devstack$ screen -ls
There is a screen on:
16041.stack (Saturday, February 23, 2019 06:56:47 CST) (Detached)
1 Socket in /var/run/screen/S-stack.
2. 進入
stack@controller:~/devstack$ screen -x 16041
或 screen -x stack 進入
可以看見 Terminal 最下方有一串白色的字符串,其中的每一個數(shù)字對應(yīng)一個子 screen 也就是一個 Openstack services 。 下圖:

3. 退出 ctrl + a + d
4. 切換子screen
-
ctrl + a + p:切換到上一個 screen -
ctrl + a + n:切換到下一個 screen -
ctrl + a + a:返回上一個 screen -
ctrl + a + 等一秒 + shift + '(單引號): 顯示所有的子 screen 的列表 -
ctrl + a + 數(shù)字: 切換到數(shù)字所對應(yīng)的子screen中,當(dāng)需切換至10以上的子 -
ctrl+a+'(單引號)切換10以上時使用, 屏幕下出現(xiàn)Switch to window: + 數(shù)字。 -
ctrl + a + ?:幫助,同樣ctrl+a按一會兒松開后在按shift + ? -
ctrl + [:開始滾動模式 ,然后可以使用上下左右鍵滾屏 -
ctrl + ]:退出滾動模式
5. 第一次出現(xiàn)問題 Cannot open your terminal '/dev/pts/0' - please check.
# script /dev/null
5. 退出和重啟任務(wù)
-
ctrl + c:終止一個 screen - 進入希望 Restart 的 Openstack Services 的 screen 中,然后輸入
ctrl + c結(jié)束這個進程,輸入↑并重新執(zhí)行上一條指令。
以上就是本節(jié)全部內(nèi)容。
下一節(jié)將介紹 Keystone、Glance 模塊



