G019-OP-INS-RHEL-01 PackStack 安装 RedHat OpenStack

笛里谁知壮士心,沙头空照征人骨。这篇文章主要讲述G019-OP-INS-RHEL-01 PackStack 安装 RedHat OpenStack相关的知识,希望能为你提供帮助。
1 您需要了解

  • 因是红帽特定版本,故无法使用其他 Linux 版本进行替代
  • 系统及源版本:rhel-server-7.1-x86_64-dvd.iso RHEL7OSP-6.0-2015-02-23.2-x86_64.iso
  • 您可参考 G017-OS-LIN-RHEL-02 红帽 7.1 安装 一文进行操作系统安装
  • RHEL 7.1 图形化对于 AMD cpu 及某些硬件平台不兼容问题,可采用最小化安装方式来处理
  • 虚拟化平台版本 VMware Workstation 16.2.0
  • 环境需用到 3台 虚拟机,并为其配置静态 IP,具体规划请参考第 2 章环境规划
  • 本篇安装流程适用于 Server with GUIMinimal Install
  • 相关文章
  • G017-OS-LIN-RHEL-02 红帽 7.1 安装
  • G018-LIN-ASK-SOL-01 制作 Linux 虚拟机模板
2 环境规划
主机名 IP 网关 / DNS CPU / 内存 磁盘 角色 备注
controller 192.168.45.150 / 24 192.168.45.1 4核 16G 100 G 控制节点 必须开启虚拟化引擎
compute 192.168.45.151 / 24 192.168.45.1 4核 16G 100 G 计算节点 必须开启虚拟化引擎
ntp 192.168.45.152 / 24 192.168.45.1 2核 4G 50 G NTP时钟源 必须单独部署
3 环境配置 3.1 关闭 DNS 反向解析
[root@controller ~]# vim /etc/ssh/sshd_config [root@compute ~]# vim /etc/ssh/sshd_config [root@ntp ~]# vim /etc/ssh/sshd_config 查找行 #UseDNS yes,修改为 UseDNS no,保存退出并重启服务[root@controller ~]# systemctl restart sshd [root@compute ~]# systemctl restart sshd [root@ntp ~]# systemctl restart sshd

3.2 (仅 Minimal)配置本地YUM源
  • controller 控制节点
[root@controller ~]# mount /dev/cdrom /mnt/ [root@controller ~]# ls /mnt/ [root@controller ~]# rm -rf /etc/yum.repos.d/* [root@controller ~]# vim /etc/yum.repos.d/dvd.repo [root@controller ~]# cat /etc/yum.repos.d/dvd.repo [dvd] name = dvd baseurl = file:///mnt/ gpgcheck = 0 enabled = 1[root@controller ~]# yum repolist all

  • comopute 计算节点
[root@compute ~]# mount /dev/cdrom /mnt/ mount: /dev/sr0 is write-protected, mounting read-only [root@compute ~]# ls /mnt/ addonsEFIEULAGPLimagesisolinuxLiveOSmedia.repoPackagesrelease-notesrepodataRPM-GPG-KEY-redhat-betaRPM-GPG-KEY-redhat-releaseTRANS.TBL [root@compute ~]# rm -rf /etc/yum.repos.d/* [root@compute ~]# vim /etc/yum.repos.d/dvd.repo [root@compute ~]# cat /etc/yum.repos.d/dvd.repo [dvd] name = dvd baseurl = file:///mnt/ gpgcheck = 0 enabled = 1[root@compute ~]# yum repolist all

  • ntp 时钟源节点
[root@ntp ~]# mount /dev/cdrom /mnt/ mount: /dev/sr0 is write-protected, mounting read-only [root@ntp ~]# ls /mnt/ addonsEFIEULAGPLimagesisolinuxLiveOSmedia.repoPackagesrelease-notesrepodataRPM-GPG-KEY-redhat-betaRPM-GPG-KEY-redhat-releaseTRANS.TBL [root@ntp ~]# [root@ntp ~]# rm -rf /etc/yum.repos.d/* [root@ntp ~]# vim /etc/yum.repos.d/dvd.repo [root@ntp ~]# cat /etc/yum.repos.d/dvd.repo [dvd] name = dvd baseurl = file:///mnt/ gpgcheck = 0 enabled = 1[root@ntp ~]# yum repolist all

3.3 (仅 Minimal)安装所需包资源
  • controller / compute / ntp 分别执行
yum install -y lrzsz \\ vim \\ bash-completion \\ net-tools \\ openssl \\ openssl-devel \\ chrony.x86_64 \\ zip \\ unzip \\ ntpdate \\ telnet

  • 加载新的环境变量以实现自动补全
source /etc/profile.d/bash_completion.sh

3.4 IP及主机名
  • 将ip地址及对应主机名写入 hosts 文件
[root@controller ~]# vim /etc/hosts [root@controller ~]# cat /etc/hosts 127.0.0.1localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.45.150 controller 192.168.45.151 compute 192.168.45.152 ntp

  • 将文件拷贝至其 computentp 节点
[root@controller ~]# scp /etc/hosts root@compute:/etc/ [root@controller ~]# scp /etc/hosts root@ntp:/etc/

3.5 网络设置
  • controller / compute / ntp 分别执行
3.5.1 关闭防火墙
[root@controller ~]# systemctl stop firewalld.service [root@controller ~]# systemctl disable firewalld.service [root@compute ~]# systemctl stop firewalld.service [root@compute ~]# systemctl disable firewalld.service [root@ntp ~]# systemctl stop firewalld.service [root@ntp ~]# systemctl disable firewalld.service

3.5.2 关闭 NetworkManager
[root@controller ~]# systemctl stop NetworkManager.service [root@controller ~]# systemctl disable NetworkManager[root@compute ~]# systemctl stop NetworkManager.service [root@compute ~]# systemctl disable NetworkManager[root@ntp ~]# systemctl stop NetworkManager.service [root@ntp ~]# systemctl disable NetworkManager

3.5.3 关闭 SELinux
[root@controller ~]# setenforce 0 [root@controller ~]# vim /etc/selinux/config [root@controller ~]# cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: #enforcing - SELinux security policy is enforced. #permissive - SELinux prints warnings instead of enforcing. #disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: #targeted - Targeted processes are protected, #minimum - Modification of targeted policy. Only selected processes are protected. #mls - Multi Level Security protection. SELINUXTYPE=targeted [root@compute ~]# setenforce 0 [root@compute ~]# vim /etc/selinux/config [root@compute ~]# cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: #enforcing - SELinux security policy is enforced. #permissive - SELinux prints warnings instead of enforcing. #disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: #targeted - Targeted processes are protected, #minimum - Modification of targeted policy. Only selected processes are protected. #mls - Multi Level Security protection. SELINUXTYPE=targeted [root@ntp ~]# setenforce 0 [root@ntp ~]# vim /etc/selinux/config [root@ntp ~]# cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: #enforcing - SELinux security policy is enforced. #permissive - SELinux prints warnings instead of enforcing. #disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: #targeted - Targeted processes are protected, #minimum - Modification of targeted policy. Only selected processes are protected. #mls - Multi Level Security protection. SELINUXTYPE=targeted

3.6 NTP节点配置 OpenStack YUM 源
  • 创建目录并上传 iso
[root@ntp ~]# mkdir /iso_images [root@ntp ~]# ls -lathr /iso_images/ total 4.2G -rw-r--r--.1 root root 3.7G Oct 102021 rhel-server-7.1-x86_64-dvd.iso -rw-r--r--.1 root root 515M Oct 112021 RHEL7OSP-6.0-2015-02-23.2-x86_64.iso dr-xr-xr-x. 18 root root 4.0K May7 10:04 .. drwxr-xr-x.2 root root86 May7 10:07 .

  • 安装 httpd 并启动服务
[root@ntp ~]# yum install -y httpd [root@ntp ~]# systemctl start httpd [root@ntp ~]# systemctl enable httpd ln -s /usr/lib/systemd/system/httpd.service /etc/systemd/system/multi-user.target.wants/httpd.service [root@ntp ~]# systemctl status httpd

  • 创建目录并挂载源镜像
[root@ntp ~]# cd /var/www/html/ [root@ntp html]# mkdir dvd [root@ntp html]# mkdir openstack [root@ntp html]# ls dvdopenstack[root@ntp html]# vim /etc/fstab [root@ntp html]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Mon Oct 11 09:42:19 2021 # # Accessible filesystems, by reference, are maintained under /dev/disk # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=477f8276-f5d9-42bf-840e-a3427f1678e8 /xfsdefaults0 0 UUID=2f5ba703-2dfd-443a-8037-a9ea781d6d1e /bootxfsdefaults0 0 UUID=47406d37-7e5a-4109-bda9-daf53ba760b9 swapswapdefaults0 0 /iso_images/rhel-server-7.1-x86_64-dvd.iso/var/www/html/dvdiso9660 defaults0 0 /iso_images/RHEL7OSP-6.0-2015-02-23.2-x86_64.iso/var/www/html/openstack iso9660 defaults0 0[root@ntp html]# mount -a mount: /dev/loop0 is write-protected, mounting read-only mount: /dev/loop1 is write-protected, mounting read-only [root@ntp html]# df -Th FilesystemTypeSizeUsed Avail Use% Mounted on /dev/sda3xfs42G8.4G34G21% / devtmpfsdevtmpfs2.0G02.0G0% /dev tmpfstmpfs2.0G84K2.0G1% /dev/shm tmpfstmpfs2.0G8.9M2.0G1% /run tmpfstmpfs2.0G02.0G0% /sys/fs/cgroup /dev/sda1xfs497M105M393M22% /boot /dev/sr0iso96603.7G3.7G0 100% /mnt /dev/loop0iso96603.7G3.7G0 100% /var/www/html/dvd /dev/loop1iso9660515M515M0 100% /var/www/html/openstack[root@ntp html]# ls dvd/ addonsEFIEULAGPLimagesisolinuxLiveOSmedia.repoPackagesrelease-notesrepodataRPM-GPG-KEY-redhat-betaRPM-GPG-KEY-redhat-releaseTRANS.TBL [root@ntp html]# ls openstack/ RH7-RHOS-6.0RH7-RHOS-6.0-InstallerRHEL7-ErrataRHEL-7-RHSCL-1.2version.txt

  • 配置 openstack yum 源
[root@ntp ~]# rm -rf /etc/yum.repos.d/* [root@ntp ~]# vim /etc/yum.repos.d/openstack.repo [root@ntp ~]# cat /etc/yum.repos.d/openstack.repo [rheliso] name = rheliso baseurl = http://192.168.45.152/dvd/ gpgcheck = 0 enabled = 1[RH7-RHOS-6.0] name = RH7-RHOS-6.0 baseurl = http://192.168.45.152/openstack/RH7-RHOS-6.0 gpgcheck = 0 enabled = 1[RH7-RHOS-6.0-Installer] name = RH7-RHOS-6.0-Installer baseurl = http://192.168.45.152/openstack/RH7-RHOS-6.0-Installer gpgcheck = 0 enabled = 1[RHEL7-Errata] name = RHEL7-Errata baseurl = http://192.168.45.152/openstack/RHEL7-Errata gpgcheck = 0 enabled = 1[RHEL-7-RHSCL-1.2] name = RHEL-7-RHSCL-1.2 baseurl = http://192.168.45.152/openstack/RHEL-7-RHSCL-1.2 gpgcheck = 0 enabled = 1[root@ntp ~]# yum repolist all Loaded plugins: langpacks, product-id, subscription-manager This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. RH7-RHOS-6.0| 1.3 kB00:00:00 RH7-RHOS-6.0-Installer| 1.2 kB00:00:00 RHEL-7-RHSCL-1.2| 3.3 kB00:00:00 RHEL7-Errata| 2.9 kB00:00:00 rheliso| 4.1 kB00:00:00 (1/6): RH7-RHOS-6.0/primary| 117 kB00:00:00 (2/6): RH7-RHOS-6.0-Installer/primary|47 kB00:00:00 (3/6): RHEL7-Errata/primary_db|10 kB00:00:00 (4/6): RHEL-7-RHSCL-1.2/primary_db| 776 kB00:00:00 (5/6): rheliso/primary_db| 3.4 MB00:00:00 (6/6): rheliso/group_gz| 134 kB00:00:00 RH7-RHOS-6.0393/393 RH7-RHOS-6.0-Installer194/194 repo idrepo namestatus RH7-RHOS-6.0RH7-RHOS-6.0enabled:393 RH7-RHOS-6.0-InstallerRH7-RHOS-6.0-Installerenabled:194 RHEL-7-RHSCL-1.2RHEL-7-RHSCL-1.2enabled: 1,766 RHEL7-ErrataRHEL7-Errataenabled:11 rhelisorhelisoenabled: 4,371 repolist: 6,735

  • repo 文件拷贝至 controllercompute 节点
[root@controller ~]# rm -rf /etc/yum.repos.d/* [root@controller ~]# scp root@ntp:/etc/yum.repos.d/openstack.repo /etc/yum.repos.d/ root@ntps password: openstack.repo100%5930.6KB/s00:00[root@controller ~]# ls /etc/yum.repos.d/ openstack.repo[root@compute ~]# rm -rf /etc/yum.repos.d/* [root@compute ~]# scp root@ntp:/etc/yum.repos.d/openstack.repo /etc/yum.repos.d/ The authenticity of host ntp (192.168.45.152) cant be established. ECDSA key fingerprint is e2:bf:1b:53:43:a0:75:9f:5f:69:66:90:d7:d4:ae:0c. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added ntp,192.168.45.152 (ECDSA) to the list of known hosts. root@ntps password: openstack.repo100%5930.6KB/s00:00 [root@compute ~]# ls /etc/yum.repos.d/ openstack.repo

3.7 配置 NTP 服务 3.7.1 配置 ntp 服务器端
  • ntp 节点配置服务器端
[root@ntp ~]# systemctl restart chronyd.service [root@ntp ~]# vim /etc/chrony.conf [root@ntp ~]# cat /etc/chrony.conf #server 0.rhel.pool.ntp.org iburst #server 1.rhel.pool.ntp.org iburst #server 2.rhel.pool.ntp.org iburst #server 3.rhel.pool.ntp.org iburst#allow 192.168/16 allow 192.168.45/24# Serve time even if not synchronized to any NTP server. local stratum 10[root@ntp ~]# systemctl restart chronyd.service

3.7.2 配置 ntp 客户端
  • controllercompute 节点配置客户端
[root@controller ~]# vim /etc/chrony.conf [root@controller ~]# cat /etc/chrony.conf #server 0.rhel.pool.ntp.org iburst #server 1.rhel.pool.ntp.org iburst #server 2.rhel.pool.ntp.org iburst server ntp iburst[root@controller ~]# systemctl restart chronyd.service [root@compute ~]# vim /etc/chrony.conf [root@compute ~]# cat /etc/chrony.conf #server 0.rhel.pool.ntp.org iburst #server 1.rhel.pool.ntp.org iburst #server 2.rhel.pool.ntp.org iburst server ntp iburst[root@compute ~]# systemctl restart chronyd.service

3.7.3 手工测试 ntp 同步
  • controllercompute 节点进行测试
[root@controller ~]# date Sat May7 11:18:25 CST 2022 [root@controller ~]# date -s "2018-01-01 12:00" Mon Jan1 12:00:00 CST 2018 [root@controller ~]# ntpdate ntp 7 May 11:18:58 ntpdate[36516]: step time server 192.168.45.152 offset 137114323.805103 sec [root@controller ~]# date Sat May7 11:19:34 CST 2022[root@compute ~]# date Sat May7 11:19:01 CST 2022 [root@compute ~]# date -s "2019-01-01 11:00:00" Tue Jan1 11:00:00 CST 2019 [root@compute ~]# ntpdate ntp 7 May 11:19:36 ntpdate[36536]: step time server 192.168.45.152 offset 105581963.931823 sec [root@compute ~]# date Sat May7 11:19:44 CST 2022

4 安装配置 4.1 控制节点安装 PackStack
[root@controller ~]# yum install -y openstack-packstack

4.2 生成应答文件
[root@controller ~]# packstack -h |grep ans --gen-answer-file=GEN_ANSWER_FILE Generate a template of an answer file, using this --answer-file=ANSWER_FILE answerfile will also be generated and should be used -o, --optionsPrint details on options available in answer file(rst second time with the same answer file and dont want[root@controller ~]# packstack --gen-answer-file=/root/cloudcs.txt

ERROR : Local IP address discovery failed. Please set nameserver correctly.

4.3 编辑应答文件
[root@controller ~]# vim cloudcs.txtCONFIG_NTP_SERVERS=192.168.45.152 CONFIG_CONTROLLER_HOST=192.168.45.150 CONFIG_COMPUTE_HOSTS=192.168.45.150,192.168.45.151 CONFIG_KEYSTONE_REGION=WuHan CONFIG_KEYSTONE_ADMIN_PW=redhat CONFIG_HORIZON_SSL=y CONFIG_PROVISION_DEMO=n

4.4 (仅 Server With GUI)重装 MariaDB
[root@controller ~]# yum remove -y mariadb [root@controller ~]# yum install -y mariadb mariadb-server

ERROR : Error appeared during Puppet run: 192.168.100.100_mariadb.pp Error: Execution of /usr/bin/rpm -e mariadb-server-5.5.41-2.el7_0.x86_64 returned 1: error: Failed dependencies

4.5 执行应答文件进行安装
[root@controller ~]# packstack --answer-file=/root/cloudcs.txt

[root@controller ~]# packstack --answer-file=/root/cloudcs.txt Welcome to the Packstack setup utilityThe installation log file is available at: /var/tmp/packstack/20220507-114402-Uer_2L/openstack-setup.logInstalling: Clean Up[ DONE ] root@192.168.45.150s password: root@192.168.45.151s password: Setting up ssh keys[ DONE ] Discovering hosts details[ DONE ] Adding pre install manifest entries[ DONE ] Installing time synchronization via NTP[ DONE ] Preparing servers[ DONE ] Adding AMQP manifest entries[ DONE ] Adding MariaDB manifest entries[ DONE ] Adding Keystone manifest entries[ DONE ] Adding Glance Keystone manifest entries[ DONE ] Adding Glance manifest entries[ DONE ] Adding Cinder Keystone manifest entries[ DONE ] Checking if the Cinder server has a cinder-volumes vg[ DONE ] Adding Cinder manifest entries[ DONE ] Adding Nova API manifest entries[ DONE ] Adding Nova Keystone manifest entries[ DONE ] Adding Nova Cert manifest entries[ DONE ] Adding Nova Conductor manifest entries[ DONE ] Creating ssh keys for Nova migration[ DONE ] Gathering ssh host keys for Nova migration[ DONE ] Adding Nova Compute manifest entries[ DONE ] Adding Nova Scheduler manifest entries[ DONE ] Adding Nova VNC Proxy manifest entries[ DONE ] Adding OpenStack Network-related Nova manifest entries[ DONE ] Adding Nova Common manifest entries[ DONE ] Adding Neutron API manifest entries[ DONE ] Adding Neutron Keystone manifest entries[ DONE ] Adding Neutron L3 manifest entries[ DONE ] Adding Neutron L2 Agent manifest entries[ DONE ] Adding Neutron DHCP Agent manifest entries[ DONE ] Adding Neutron LBaaS Agent manifest entries[ DONE ] Adding Neutron Metering Agent manifest entries[ DONE ] Adding Neutron Metadata Agent manifest entries[ DONE ] Checking if NetworkManager is enabled and running[ DONE ] Adding OpenStack Client manifest entries[ DONE ] Adding Horizon manifest entries[ DONE ] Adding Swift Keystone manifest entries[ DONE ] Adding Swift builder manifest entries[ DONE ] Adding Swift proxy manifest entries[ DONE ] Adding Swift storage manifest entries[ DONE ] Adding Swift common manifest entries[ DONE ] Adding MongoDB manifest entries[ DONE ] Adding Redis manifest entries[ DONE ] Adding Ceilometer manifest entries[ DONE ] Adding Ceilometer Keystone manifest entries[ DONE ] Adding Nagios server manifest entries[ DONE ] Adding Nagios host manifest entries[ DONE ] Adding post install manifest entries[ DONE ] Installing Dependencies[ DONE ] Copying Puppet modules and manifests[ DONE ] Applying 192.168.45.150_prescript.pp Applying 192.168.45.151_prescript.pp 192.168.45.151_prescript.pp:[ DONE ] 192.168.45.150_prescript.pp:[ DONE ] Applying 192.168.45.150_chrony.pp Applying 192.168.45.151_chrony.pp 192.168.45.150_chrony.pp:[ DONE ] 192.168.45.151_chrony.pp:[ DONE ] Applying 192.168.45.150_amqp.pp Applying 192.168.45.150_mariadb.pp 192.168.45.150_amqp.pp:[ DONE ] 192.168.45.150_mariadb.pp:[ DONE ] Applying 192.168.45.150_keystone.pp Applying 192.168.45.150_glance.pp Applying 192.168.45.150_cinder.pp 192.168.45.150_keystone.pp:[ DONE ] 192.168.45.150_glance.pp:[ DONE ] 192.168.45.150_cinder.pp:[ DONE ] Applying 192.168.45.150_api_nova.pp 192.168.45.150_api_nova.pp:[ DONE ] Applying 192.168.45.150_nova.pp Applying 192.168.45.151_nova.pp 192.168.45.150_nova.pp:[ DONE ] 192.168.45.151_nova.pp:[ DONE ] Applying 192.168.45.150_neutron.pp Applying 192.168.45.151_neutron.pp 192.168.45.151_neutron.pp:[ DONE ] 192.168.45.150_neutron.pp:[ DONE ] Applying 192.168.45.150_osclient.pp Applying 192.168.45.150_horizon.pp 192.168.45.150_osclient.pp:[ DONE ] 192.168.45.150_horizon.pp:[ DONE ] Applying 192.168.45.150_ring_swift.pp 192.168.45.150_ring_swift.pp:[ DONE ] Applying 192.168.45.150_swift.pp 192.168.45.150_swift.pp:[ DONE ] Applying 192.168.45.150_mongodb.pp Applying 192.168.45.150_redis.pp 192.168.45.150_mongodb.pp:[ DONE ] 192.168.45.150_redis.pp:[ DONE ] Applying 192.168.45.150_ceilometer.pp 192.168.45.150_ceilometer.pp:[ DONE ] Applying 192.168.45.150_nagios.pp Applying 192.168.45.150_nagios_nrpe.pp Applying 192.168.45.151_nagios_nrpe.pp 192.168.45.151_nagios_nrpe.pp:[ DONE ] 192.168.45.150_nagios.pp:[ DONE ] 192.168.45.150_nagios_nrpe.pp:[ DONE ] Applying 192.168.45.150_postscript.pp Applying 192.168.45.151_postscript.pp 192.168.45.150_postscript.pp:[ DONE ] 192.168.45.151_postscript.pp:[ DONE ] Applying Puppet manifests[ DONE ] Finalizing[ DONE ] **** Installation completed successfully ******Additional information: * File /root/keystonerc_admin has been created on OpenStack client host 192.168.45.150. To use the command line tools you need to source the file. * NOTE : A certificate was generated to be used for ssl, You should change the ssl certificate configured in /etc/httpd/conf.d/ssl.conf on 192.168.45.150 to use a CA signed cert. * To access the OpenStack Dashboard browse to https://192.168.45.150/dashboard . Please, find your login credentials stored in the keystonerc_admin in your home directory. * To use Nagios, browse to http://192.168.45.150/nagios username: nagiosadmin, password: 916ff844dfc64eb1 * The installation log file is available at: /var/tmp/packstack/20220507-114402-Uer_2L/openstack-setup.log * The generated manifests are available at: /var/tmp/packstack/20220507-114402-Uer_2L/manifests

5 完成安装
  • 登录
G019-OP-INS-RHEL-01 PackStack 安装 RedHat OpenStack

文章图片

【G019-OP-INS-RHEL-01 PackStack 安装 RedHat OpenStack】
G019-OP-INS-RHEL-01 PackStack 安装 RedHat OpenStack

文章图片

  • END

    推荐阅读