如何快速部署openstack快速部署环境

如何快速部署OpenStack环境——devstack项目
每次只要提到部署OpenStack都是一件非常复杂的事情,当然很多人都会提及使用devstack来快速部署Openstack,一般我们都用Devstack部署开发环境,它可以实现在一台机器上部署一个独立版本同时包含主体组件的Openstack环境,一直以来我都没有试过,这两天一直在适用,最大的感受就是虽然确实很傻瓜,但是经常会遇到莫名的问题。
Devstack采用自动化源码安装,用户只需要下载响应的分支(版本)脚本,修改相关的配置文件,就可以实现自动化安装,自动化解决依赖关系,非常方面。
一般都是在本机的虚拟机环境下进行测试VM WorkStation
这里面需要注意,用户可以选择Workstation的两种网络模式,必须可以实现连接外网。
1、桥接模式 (缺点,由于桥接模式直接连接宿主机所在的局域网络,所以相关虚拟机可能占用已有的IP资源)
2、NAT(既可以实现连接外网,又可以自己共享一个Ip段供虚拟机IP使用,推荐使用)
3、由于OpenStack需要获得一个固定的连接IP,而不建议使用DHCP,所以上述不勾选DHCP,而且在虚拟机固定相关的IP地址。
4、我使用的虚拟机OS为Ubuntu 14.04 LTS,设置固定IP
root@controller:~# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
iface lo inet loopback
# The primary network interface
iface eth0 inet static
address 192.168.27.128
netmask 255.255.255.0
gateway 192.168.27.2
network 192.168.27.0
broadcast 192.168.27.255
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 114.114.114.114
5、设置apt源,由于你可能安装最新版本的Openstack,所以建议将源修改为国内ubuntu的官方源
root@controller:~# cat /etc/apt/sources.list
deb http://cn./ubuntu/ trusty main restricted universe multiverse
deb http://cn./ubuntu/ trusty-security main restricted universe multiverse
deb http://cn./ubuntu/ trusty-updates main restricted universe multiverse
deb http://cn./ubuntu/ trusty-proposed main restricted universe multiverse
deb http://cn./ubuntu/ trusty-backports main restricted universe multiverse
设置之后更新一下 apt-get update
6、安装git并下载devstack相关版本
apt-get install git
下载devstack相关的mitaka(最新版本)
git clone /openstack-dev/devstack.git -b stable/mitaka
直接通过工具脚本创建stack用户(目前不支持root用户运行stack.sh)
cd /home/devstack/tools/
./create-stack-user.sh
修改devstack目录权限
chown -R stack:stack /home/devstack
chmod 777 /dev/pts/0
切换stack用户
cd /home/devstack
7、进入/home/devstack目录下,我们可以看到有如下文件
stack@controller:/home/devstack$ ll
drwxr-xr-x 17 stack stack 4096 Jul 12 12:46 ./
drwxr-xr-x 4 root root 4096 Jul 12 10:03 ../
drwxr-xr-x 9 stack stack 4096 Jul 12 12:46 accrc/
-rwxr-xr-x 1 stack stack 3306 Jul 12 10:03 clean.sh*
drwxr-xr-x 2 stack stack 4096 Jul 12 10:03 data/
drwxr-xr-x 3 stack stack 4096 Jul 12 10:03 doc/
drwxr-xr-x 2 stack stack 4096 Jul 12 10:03 driver_certs/
-rw-r--r-- 1 stack stack 923 Jul 12 10:03 exerciserc
drwxr-xr-x 2 stack stack 4096 Jul 12 10:03 exercises/
-rwxr-xr-x 1 stack stack 1974 Jul 12 10:03 exercise.sh*
drwxr-xr-x 2 stack stack 4096 Jul 12 10:03 extras.d/
drwxr-xr-x 9 stack stack 4096 Jul 12 10:51 files/
-rw-r--r-- 1 stack stack 24769 Jul 12 10:03 functions
-rw-r--r-- 1 stack stack 73963 Jul 12 10:03 functions-common
-rw-r--r-- 1 stack stack 3774 Jul 12 10:03 FUTURE.rst
drwxr-xr-x 2 stack stack 4096 Jul 12 10:03 gate/
drwxr-xr-x 8 stack stack 4096 Jul 12 10:03 .git/
-rw-r--r-- 1 stack stack 330 Jul 12 10:03 .gitignore
-rw-r--r-- 1 stack stack 109 Jul 12 10:03 .gitreview
-rw-r--r-- 1 stack stack 14888 Jul 12 10:03 HACKING.rst
drwxr-xr-x 2 stack stack 4096 Jul 12 10:03 inc/
drwxr-xr-x 8 stack stack 4096 Jul 12 10:03 lib/
-rw-r--r-- 1 stack stack 10143 Jul 12 10:03 LICENSE
-rw-rw-r-- 1 stack stack 1726 Jul 12 11:34 local.conf
-rw-r--r-- 1 stack stack 1738 Jul 12 12:32 .localrc.auto
-rw-r--r-- 1 stack stack 340 Jul 12 10:03 .mailmap
-rw-r--r-- 1 stack stack 1506 Jul 12 10:03 MAINTAINERS.rst
-rw-r--r-- 1 stack stack 2489 Jul 12 10:03 Makefile
-rw-r--r-- 1 stack stack 3822 Jul 12 10:03 openrc
drwxr-xr-x 2 stack stack 4096 Jul 12 10:03 pkg/
-rw-r--r-- 1 stack stack 40 Jul 12 12:35 .prereqs
-rw-r--r-- 1 stack stack 3795 Jul 12 10:03 README.md
-rwxr-xr-x 1 stack stack 1188 Jul 12 10:03 run_tests.sh*
drwxr-xr-x 2 stack stack 4096 Jul 12 10:03 samples/
-rw-r--r-- 1 stack stack 481 Jul 12 10:03 setup.cfg
-rwxr-xr-x 1 stack stack 781 Jul 12 10:03 setup.py*
-rw-r--r-- 1 stack stack 672 Jul 12 12:46 .stackenv
-rw-r--r-- 1 stack stack 33564 Jul 12 10:03 stackrc
-rw-r--r-- 1 stack stack 4908 Jul 12 12:45 stack-screenrc
-rwxr-xr-x 1 stack stack 40292 Jul 12 10:03 stack.sh*
drwxr-xr-x 2 stack stack 4096 Jul 12 10:03 tests/
drwxr-xr-x 4 stack stack 4096 Jul 12 10:03 tools/
-rw-r--r-- 1 stack stack 1644 Jul 12 10:03 tox.ini
-rwxr-xr-x 1 stack stack 4204 Jul 12 10:03 unstack.sh*
-rw-r--r-- 1 stack stack 396 Jul 12 12:38 userrc_early
stack.sh #自动化部署的入口;判断是否存在localrc文件; 否,进入交互模式; 是,进入配置模式(如果需要输入输入stack.sh需要的参数,如:数据库的密码、Rabbit MQ的密码、Service TOKEN 等)localrc #配置文件;传入stack.sh的参数;nova部署在哪个节点,用户名密码是什么openrc #环境变量脚本;在执行openstack命令时要导入一些环境变量 如:export OS_USERNAME = adminunstack.sh #卸载脚本lib #每个服务的自动化安装脚本;通常存放nova,swift等自动化安装脚本,手动安装时执行的所有命令;每一个openstack服务对应一个文件
8、一般情况下,我们需要在该目录创建一个local.conf文件,这里面可以设置我们相关信息:
例如git的源地址设置,Host IP设置,外部网络和私有网络的IP段设置,安装组件的选择及版本,相关密码设置,日志路径设置等。
[[local|localrc]]
# use TryStack git mirror
NOVNC_REPO=/kanaka/noVNC.git
SPICE_REPO=/git/spice/spice-html5.git
#OFFLINE=True
RECLONE=True
# Define images to be automatically downloaded during the DevStack built process.
DOWNLOAD_DEFAULT_IMAGES=False
IMAGE_URLS=&/cirros/cirros-0.3.4-x86_64-disk.img&
HOST_IP=192.168.27.128
# Credentials
DATABASE_PASSWORD=pass
ADMIN_PASSWORD=pass
SERVICE_PASSWORD=pass
SERVICE_TOKEN=pass
RABBIT_PASSWORD=pass
HORIZON_BRANCH=stable/mitaka
KEYSTONE_BRANCH=stable/mitaka
NOVA_BRANCH=stable/mitaka
NEUTRON_BRANCH=stable/mitaka
GLANCE_BRANCH=stable/mitaka
CINDER_BRANCH=stable/mitaka
KEYSTONE_TOKEN_FORMAT=UUID
HEAT_BRANCH=stable/mitaka
enable_service h-eng h-api h-api-cfn h-api-cw
SWIFT_BRANCH=stable/mitaka
ENABLED_SERVICES+=,s-proxy,s-object,s-container,s-account
SWIFT_REPLICAS=1
SWIFT_HASH=e
# Enabling Neutron (network) Service
disable_service n-net
enable_service q-svc
enable_service q-agt
enable_service q-dhcp
enable_service q-l3
enable_service q-meta
enable_service q-metering
enable_service neutron
## Neutron options
Q_USE_SECGROUP=True
FLOATING_RANGE=&192.168.27.0/24&
FIXED_RANGE=&10.0.0.0/24&
Q_FLOATING_ALLOCATION_POOL=start=192.168.27.102,end=192.168.27.110
PUBLIC_NETWORK_GATEWAY=&192.168.27.2&
Q_L3_ENABLED=True
PUBLIC_INTERFACE=eth0
Q_USE_PROVIDERNET_FOR_PUBLIC=True
OVS_PHYSICAL_BRIDGE=br-ex
PUBLIC_BRIDGE=br-ex
OVS_BRIDGE_MAPPINGS=public:br-ex
# #VLAN configuration.
Q_PLUGIN=ml2
ENABLE_TENANT_VLANS=True
LOGFILE=/opt/stack/logs/stack.sh.log
VERBOSE=True
LOG_COLOR=True
SCREEN_LOGDIR=/opt/stack/logs
9、接下来只需要在stack用户下,执行./stack.sh即可
安装完毕的效果
安装时间估计20分钟,在安装之前也看了不少博客介绍,devstack安装可能不会一遍成功,果不出所料,我也是碰了N个坑才得以完成。
问题1:在安装过程中经常出现如下错误
+functions-common:apt_get:1122 return 0
+tools/install_pip.sh:main:127 install_get_pip
+tools/install_pip.sh:install_get_pip:49 [[ -r /home/stack/devstack/files/get-pip.py ]]
+tools/install_pip.sh:install_get_pip:66 [[ ! -r /home/stack/devstack/files/get-pip.py ]]
+tools/install_pip.sh:install_get_pip:69 local timecond=
+tools/install_pip.sh:install_get_pip:70 [[ -r /home/stack/devstack/files/get-pip.py ]]
+tools/install_pip.sh:install_get_pip:74 curl -f &retry 6 &retry-delay 5 -o /home/stack/devstack/files/get-pip.py https://bootstrap.pypa.io/get-pip.py
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 88k 0 0 :03:54 0:03:54 &:&:& 23270
+tools/install_pip.sh:install_get_pip:77 touch /home/stack/devstack/files/get-pip.py.downloaded
+tools/install_pip.sh:install_get_pip:79 sudo -H -E python /home/stack/devstack/files/get-pip.py -c /home/stack/devstack/tools/cap-pip.txt
Collecting pip!=8 (from -c /home/stack/devstack/tools/cap-pip.txt (line 1))
/tmp/tmpfip0Vp/pip.zip/pip/_vendor/requests/packages/urllib3/util/ssl_.py:318: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.
/tmp/tmpfip0Vp/pip.zip/pip/_vendor/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
Downloading pip-8.1.2-py2.py3-none-any.whl (1.2MB)
24% |####### | 296kB 4.7kB/s eta 0:03:11Exception:
Traceback (most recent call last):
File &/tmp/tmpfip0Vp/pip.zip/pip/basecommand.py&, line 215, in main
status = self.run(options, args)
File &/tmp/tmpfip0Vp/pip.zip/pip/commands/install.py&, line 299, in run
requirement_set.prepare_files(finder)
File &/tmp/tmpfip0Vp/pip.zip/pip/req/req_set.py&, line 370, in prepare_files
ignore_dependencies=self.ignore_dependencies))
File &/tmp/tmpfip0Vp/pip.zip/pip/req/req_set.py&, line 587, in _prepare_file
session=self.session, hashes=hashes)
File &/tmp/tmpfip0Vp/pip.zip/pip/download.py&, line 810, in unpack_url
hashes=hashes
File &/tmp/tmpfip0Vp/pip.zip/pip/download.py&, line 649, in unpack_http_url
File &/tmp/tmpfip0Vp/pip.zip/pip/download.py&, line 871, in _download_http_url
_download_url(resp, link, content_file, hashes)
File &/tmp/tmpfip0Vp/pip.zip/pip/download.py&, line 595, in _download_url
hashes.check_against_chunks(downloaded_chunks)
File &/tmp/tmpfip0Vp/pip.zip/pip/utils/hashes.py&, line 46, in check_against_chunks
for chunk in chunks:
File &/tmp/tmpfip0Vp/pip.zip/pip/download.py&, line 563, in written_chunks
for chunk in chunks:
File &/tmp/tmpfip0Vp/pip.zip/pip/utils/ui.py&, line 139, in iter
for x in it:
File &/tmp/tmpfip0Vp/pip.zip/pip/download.py&, line 552, in resp_read
decode_content=False):
File &/tmp/tmpfip0Vp/pip.zip/pip/_vendor/requests/packages/urllib3/response.py&, line 353, in stream
data = self.read(amt=amt, decode_content=decode_content)
File &/tmp/tmpfip0Vp/pip.zip/pip/_vendor/requests/packages/urllib3/response.py&, line 320, in read
flush_decoder = True
File &/usr/lib/python2.7/contextlib.py&, line 35, in __exit__
self.gen.throw(type, value, traceback)
File &/tmp/tmpfip0Vp/pip.zip/pip/_vendor/requests/packages/urllib3/response.py&, line 242, in _error_catcher
raise ReadTimeoutError(self._pool, None, &Read timed out.&)
ReadTimeoutError: HTTPSConnectionPool(host=&pypi.python.org&, port=443): Read timed out.
解决:这是由于默认devstack在使用pip下载django框架,由于国外的源不稳定,经常会出现超时情况,所以建议使用国内的源,例如使用豆瓣源。
1、在root用户根目录创建.pip文件夹(前面有一个&.&)
2、进入.pip文件夹里创建pip.conf文件,输入以下内容即可
trusted-host =
index-url = /simple
问题2:该过程我没有记录,不过我印象中出现的错误无法解析
解决:这个问题好解决,直接ping 获得相关域名的IP地址,然后进入/etc/hosts,添加域名与IP的对应关系即可。
问题3:在demo租户创建的虚拟机,设置浮动IP,无法ping通。
解决:这个是我个人的低级错误,没有留意demo组合的安全组,设置ICMP和SSH既可以ping通和SSH链接了。
如何实现重启devstack后,还能正常访问openstack?
1、如果你是物理机,在/home/devstack文件下面有一个stack-screenrc
stack@controller:/home/devstack$ screen -c stack-screenrc
Cannot open your terminal '/dev/pts/33' - please check.
出现该问题,切换root用户 chmod 777 /dev/pts/33后重新执行
2、如果你是虚拟机,你会连虚拟机的IP都无法连接。
因为eth0 桥接到br-ex 上面去了,而重启后br-ex 没有ip 配置,把eth0 从 br-ex 上去掉,或者手动通过ifconfig 给 br-ex 配置ip ,都可以解决问题。
当然,你也可以通过VMwork Station 创建一个快照,每次开启只需要恢复到该快照就可以了,不然你会连虚拟机的IP都无法连接上。
还有一种方式,就是将你的虚拟机创建双网卡,将控制网络和外部网络分开管理,也可以解决该问题。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'怎样用一台机器简单搭建openstack环境?本机配置_电脑吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,747,356贴子:
怎样用一台机器简单搭建openstack环境?本机配置收藏
怎样用一台机器简单搭建openstack环境?本机配置是32位的win7系统,用虚拟机安装了32位的centos系统
电脑网络维护专为企业的IT运维,先免费体验,满意再签约,全国超20个城市覆盖,.七大认证,十三个授权
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
Dandelion:OpenStack云平台的快速部署机制
下载积分:923
内容提示:Dandelion:OpenStack云平台的快速部署机制
文档格式:PDF|
浏览次数:2|
上传日期: 23:44:29|
文档星级:
该用户还上传了这些文档
Dandelion:OpenStack云平台的快速部署机制
官方公共微信如何快速部署openstack_百度知道10分钟安装OpenStack | UnitedStack有云
深度博文的激烈碰撞
有云博客沉淀了有云工程师们的智慧,碰撞着相互学习进步,感受不一样的有云文化,展示不一样的有云风采。
OpenStack初学者的苦恼
OpenStack由一套组件构成,安装门槛非常高。虽然有DevStack/RDO/Puppet/Chef/Salt这些自动化安装工具,但这些工具只是方便了熟悉OpenStack的工程师,很多初学者仍然倍受安装门槛的折磨。
为了降低OpenStack学习曲线,我们制作了DevStack镜像,只需要一键执行,就可以安装最新的OpenStack,然后你就可以开始尽情研究OpenStack了,让你信心满满。
OpenStack最低配置要求
OpenStack需要管理网络和虚拟机网络,所以推荐使用双网卡,下面是安装OpenStack的环境要求:
操作系统: Ubuntu/CentOS
硬盘: 20GB
网络: 双网卡
在进行安装OpenStack之前,你在UOS得有一个账号,现在就送10元钱,足够你体验一天了。
配置UOS环境
为了满足OpenStack安装的最低要求,我们需要配置双网卡环境,主要步骤是:
创建路由器
创建一个路由器,命名为 dev-route,并开启公网网关。
创建一个私有网络,命名为 dev-network。
创建两个子网
创建第1个子网,命名为 public-subnet,选择 dev-network 私有网络,设置网络地址为 192.168.0.0/24。
创建第2个子网,命名为 flat-subnet,选择 dev-network 私有网络,设置网络地址为 172.16.0.0/24。
设置第1个子网 public-subnet 与路由器 dev-route 相关联。
创建UOS虚拟机
创建一台虚拟机(使用 DevStack 镜像),叫做 ustack, 使用“4核CPU,8GB内存”配置,选择私有网络 public-subnet (虚拟机的第1块网卡eth0跟该子网相连接)。
给虚拟机的虚拟机网卡命名为 public-interface。
创建另外一个虚拟网卡,跟子网 flat-subnet 相连接,给这个虚拟网卡命名为 flat-interface。把虚拟网卡 flat-interface 绑定到虚拟机ustack上。
这样,这台虚拟机就有两块网卡:
public-interface,跟public-subnet相连
eht1:flat-interface,跟flat-subnet相连
使用VNC登录虚拟机,查看网卡信息。
现在查看一下网络拓扑图是否正确,我们要保证网卡eth0能够连接公网。
eth0 -& public-interface -& public-subnet -& dev-route -& Public Network
创建公网IP
创建一个公网IP,绑定到虚拟机ustack上的 public-interface 网卡上。
我们尝试在自己的电脑上ping公网IP,但是却ping不通,这是为什么呢?这肯定不是UOS的问题,而是Ubuntu系统的设计造成的,这种情况只会在多网卡时才会出现。
# ping 42.62.73.241
当Ubuntu系统发现两块网卡时,会自动设置默认路由走第2块网卡(这是个糟糕的设计),但是我们是把公网IP绑定到第1块网卡上,所以导致无法ping通。解决办法是使用VNC登录虚拟机,然后使用route命令查看并设置虚拟机的路由规则。
先删除旧的默认路由
#route del default gw 172.16.0.1
添加新的默认路由
#route add default gw 192.168.0.1
再次在自己电脑上ping公网IP,直到ping通为止。
修改安全组规则
修改虚拟机安全组中下行规则,增加 TCP 6080端口(用于OpenStack的VNC访问)。
登录虚拟机
使用root用户登录虚拟机,并给stack用户设置密码。
尝试使用stack用户登录虚拟机,验证设置是否正确。
双网卡环境已经配置好了,下面我们可以开始配置DevStack。
配置DevStack
我们已经在你的虚拟机上安装了DevStack,你只需要稍微修改一下配置文件localrc。
# ssh stack@42.62.73.241
stack@ustack:~$
stack@ustack:~$ cd ~/devstack
stack@ustack:~/devstack$
stack@ustack:~/devstack$ vim localrc
修改 localrc 中的 HOST_IP 和 NOVNCPROXY_URL 的值。
FLOATING_RANGE=192.168.100.224/27
FIXED_RANGE=10.10.10.0/24
FIXED_NETWORK_SIZE=256
ADMIN_PASSWORD=root
MYSQL_PASSWORD=root
PULIC_INTERFACE=eth0
FLAT_INTERFACE=eth1
RABBIT_PASSWORD=root
SERVICE_TOKEN=root
SERVICE_PASSWORD=root
HOST_IP=192.168.0.4
#设置为你虚拟机第1块网卡的固定IP地址
NOVNCPROXY_URL="http://42.62.73.241:6080/vnc_auto.html"
#42.62.73.241是你虚拟机的公网IP地址
OFFLINE=True
# 一定要加上,防止更新devstack
RECLONE=False
# 一定要加上,防止更新devstack
一键安装OpenStack
在虚拟机中的 /home/devstack/ 目录下执行stack.sh脚本,大概需要5分钟左右,你可以休息一下。
./stack.sh
5分钟之后,你会看到下面的输出。
恭喜你已经成功安装最新版的OpenStack, 你现在可以使用浏览器登录 http://{你的公网IP地址}/,就可以登录OpenStack Dashboard,然后使用admin账号登录(密码是root)。
快速体验OpenStack
让我们体验一下 OpenStack in OpenStack 和 VM in VM ?
在界面上创建虚拟机
使用VNC登录OpenStack虚拟机
使用SSH登录OpenStack虚拟机
首先你得先登录UOS虚拟机,然后再登录OpenStack虚拟机。
使用命令行操作OpenStack
你UOS虚拟机上,先导入环境变量(souce openrc admin demo),然后使用命令行工具操作OpenStack。
得益于UOS的SDN和分布式存储,让网络规划如此方便,让虚拟机操作如此快捷。从上可以看出,我们可以在培训领域广泛使用UOS,提高教学效率,降低成本。
我们将及时回复您
400-898-5401
北京市海淀区东北旺西路8号中关村软件广场4号楼C座101
Copyright (C) 2016
优思得云计算科技(北京)有限公司
Copyright (C)2016 优思得云计算科技(北京)有限公司 UnitedStack Inc. All Rights Reserved.

我要回帖

更多关于 openstack 安装部署 的文章

 

随机推荐