美文网首页openstack安装
1 )一键安装 openstack P版(Pike) 到单机

1 )一键安装 openstack P版(Pike) 到单机

作者: 山大刀 | 来源:发表于2018-01-12 16:05 被阅读0次

    安装环境 CentOS 7.x , 8G 内存 ,虚拟机或物理机都可以,能上网。

    确认已安装了wget 和ntpdate

    # which wget && which ntpdate
    
    [root@opst-allinone yum.repos.d]# which wget && which ntpdate
    
        /usr/bin/wget
    
        /usr/sbin/ntpdate
    
    

    创建一键安装脚本openstack_install.sh。用vi 编辑器打开脚本,拷贝下列内容到该文件,保存。

    #!/bin/sh
    # openstack pike 单机 一键安装
    # 环境 centos 7.x.1708 x86_64
    # Myde by Elven
    
    [[ `uname -r` = *el7* ]] && { echo '开启安装openstack pike'; } || { echo '请在CentOS7.x 环境运行';exit; }
    
    ##########################################
    #参数
    
    #获取第一块网卡名、ip地址
    Net=`ip add|egrep global|awk '{ print $NF }'|head -n 1`
    IP=`ip add|grep global|awk -F'[ /]+' '{ print $3 }'|head -n 1`
    echo  "网卡名称:$Net"
    echo  "IP地址:  $IP"
    
    #参数
    DBPass=elven2017    #SQL root密码
    Node=controller     #节点名(controller不要改动)
    Netname=$Net        #网卡名称
    MyIP=$IP            #IP地址
    VncProxy=$IP        #VNC代理外网IP地址
    Imgdir=/data/glance #自定义glance镜像目录
    VHD=/data/nova      #自定义Nova实例路径
    Kvm=qemu            #QEMU或KVM ,KVM需要硬件支持
    
    ##########################################
    #1、设置
    
    echo  '关闭selinux、防火墙'
    systemctl stop firewalld.service
    systemctl disable firewalld.service
    firewall-cmd --state
    sed -i '/^SELINUX=.*/c SELINUX=disabled' /etc/selinux/config
    sed -i 's/^SELINUXTYPE=.*/SELINUXTYPE=disabled/g' /etc/selinux/config
    grep --color=auto '^SELINUX' /etc/selinux/config
    setenforce 0
    
    echo  '时间同步'
    /usr/sbin/ntpdate ntp6.aliyun.com 
    echo "*/3 * * * * /usr/sbin/ntpdate ntp6.aliyun.com  &> /dev/null" > /tmp/crontab
    crontab /tmp/crontab
    
    echo  '设置hostname'
    hostnamectl set-hostname $Node
    echo "$MyIP   $Node">>/etc/hosts
    #使用阿里源
    rm -f /etc/yum.repos.d/*
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    sed -i '/aliyuncs.com/d' /etc/yum.repos.d/*.repo #删除阿里内网地址
    echo  '自定义openstack源'
    wget -O /etc/yum.repos.d/Ali-pike.repo http://elven.vip/ks/openstack/Ali-pike.repo
    yum clean all && yum makecache #生成缓存
    
    ##########################################
    #2 安装
    
    function installrpm() 
    {
    echo  'OpenStack tools 安装'
    yum install -y python-openstackclient openstack-selinux \
      python2-PyMySQL openstack-utils 
    echo  'MariaDB安装'
    yum install mariadb mariadb-server mariadb-galera-server -y
    yum install expect -y
    echo  'RabbitMQ安装'
    yum install rabbitmq-server erlang socat -y
    echo  'Keystone安装'
    yum install -y openstack-keystone httpd mod_wsgi memcached python-memcached
    yum install apr apr-util -y
    echo  '安装Glance'
    yum install -y openstack-glance python-glance
    echo  '安装nova'
    yum install -y openstack-nova-api openstack-nova-conductor \
      openstack-nova-console openstack-nova-novncproxy \
      openstack-nova-scheduler openstack-nova-placement-api \
      openstack-nova-compute
    echo  '安装neutron'
    yum install -y openstack-neutron openstack-neutron-ml2 \
     openstack-neutron-linuxbridge python-neutronclient ebtables ipset
    echo  '安装dashboard'
    yum install openstack-dashboard -y
    }
    
    echo  '安装openstack'
    installrpm
    echo  '再次安装,防止下载失败'
    installrpm
    
    ##########################################
    #3、配置
    
    # #------------------#####################
    echo 'SQL数据库配置'
    cp /etc/my.cnf.d/openstack.cnf{,.bak}
    echo "#
    [mysqld]
    bind-address = 0.0.0.0
    default-storage-engine = innodb
    innodb_file_per_table
    max_connections = 4096
    collation-server = utf8_general_ci
    character-set-server = utf8
    #">/etc/my.cnf.d/openstack.cnf
    echo '启动数据库服务'
    systemctl enable mariadb.service
    systemctl start mariadb.service
    sleep 5
    netstat -antp|grep mysqld
    #mysql_secure_installation #初始化设置密码,自动交互
    [[ -f /usr/bin/expect ]] || { yum install expect -y; } #若没expect则安装
    /usr/bin/expect << EOF
    set timeout 30
    spawn mysql_secure_installation
    expect {
        "enter for none" { send "\r"; exp_continue}
        "Y/n" { send "Y\r" ; exp_continue}
        "password:" { send "$DBPass\r"; exp_continue}
        "new password:" { send "$DBPass\r"; exp_continue}
        "Y/n" { send "Y\r" ; exp_continue}
        eof { exit }
    }
    EOF
    #测试
    mysql -u root -p$DBPass -e "show databases;"
    [ $? = 0 ] || { echo "mariadb初始化失败";exit; }
    
    echo '创建数据库、用户授权'
    mysql -u root -p$DBPass -e "
    create database keystone;
    grant all privileges on keystone.* to 'keystone'@'localhost' identified by 'keystone';
    grant all privileges on keystone.* to 'keystone'@'%' identified by 'keystone';
    create database glance;
    grant all privileges on glance.* to 'glance'@'localhost' identified by 'glance';
    grant all privileges on glance.* to 'glance'@'%' identified by 'glance';
    
    create database nova;
    grant all privileges on nova.* to 'nova'@'localhost' identified by 'nova';
    grant all privileges on nova.* to 'nova'@'%' identified by 'nova';
    create database nova_api;
    grant all privileges on nova_api.* to 'nova'@'localhost' identified by 'nova';
    grant all privileges on nova_api.* to 'nova'@'%' identified by 'nova';
    create database nova_cell0;
    grant all privileges on nova_cell0.* to 'nova'@'localhost' identified by 'nova';
    grant all privileges on nova_cell0.* to 'nova'@'%' identified by 'nova';
    
    create database neutron;
    grant all privileges on neutron.* to 'neutron'@'localhost' identified by 'neutron';
    grant all privileges on neutron.* to 'neutron'@'%' identified by 'neutron';
    
    flush privileges;
    select user,host from mysql.user;
    show databases;
    "
    #
    # #------------------#####################
    echo 'RabbitMQ配置'
    echo 'NODENAME=rabbit@controller'>/etc/rabbitmq/rabbitmq-env.conf
    systemctl enable rabbitmq-server.service
    systemctl start rabbitmq-server.service
    sleep 3
    rabbitmq-plugins enable rabbitmq_management  #启动web插件端口15672
    sleep 6
    ##########
    #rabbit创建用户及密码
    rabbitmqctl  add_user admin admin
    rabbitmqctl  set_user_tags admin administrator
    rabbitmqctl add_user openstack openstack 
    rabbitmqctl set_permissions openstack ".*" ".*" ".*" 
    rabbitmqctl  set_user_tags openstack administrator
    systemctl restart rabbitmq-server.service
    sleep 3
    netstat -antp|grep '5672'
    [[ `rabbitmqctl list_users|grep openstack|wc -l` = 1 ]] || {
        echo 'rabbit创建用户失败'; 
        echo 'rabbit创建用户失败,请手动执行命令创建用户'>>./error.install.log; }
    
    
    # #------------------#####################
    #Keystone
    #memcached启动
    cp /etc/sysconfig/memcached{,.bak}
    systemctl enable memcached.service
    systemctl start memcached.service
    netstat -antp|grep 11211
    
    echo  'Keystone 配置'
    cp /etc/keystone/keystone.conf{,.bak}  #备份默认配置
    Keys=$(openssl rand -hex 10)  #生成随机密码
    echo $Keys
    echo "kestone  $Keys">/root/openstack.log
    echo "
    [DEFAULT]
    admin_token = $Keys
    verbose = true
    [database]
    connection = mysql+pymysql://keystone:keystone@controller/keystone
    [token]
    provider = fernet
    driver = memcache
    [memcache]
    servers = controller:11211
    ">/etc/keystone/keystone.conf
    
    #初始化身份认证服务的数据库
    su -s /bin/sh -c "keystone-manage db_sync" keystone
    #检查表是否创建成功
    mysql -h controller -ukeystone -pkeystone -e "use keystone;show tables;"
    #初始化密钥存储库
    keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
    keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
    #设置admin用户(管理用户)和密码
    keystone-manage bootstrap --bootstrap-password admin \
      --bootstrap-admin-url http://controller:35357/v3/ \
      --bootstrap-internal-url http://controller:5000/v3/ \
      --bootstrap-public-url http://controller:5000/v3/ \
      --bootstrap-region-id RegionOne
    
    #apache配置
    cp /etc/httpd/conf/httpd.conf{,.bak}
    echo "ServerName controller">>/etc/httpd/conf/httpd.conf
    ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
    
    #Apache HTTP 启动并设置开机自启动
    systemctl enable httpd.service
    systemctl restart httpd.service
    sleep 3
    netstat -antp|egrep ':5000|:35357|:80'
    
    #创建 OpenStack 客户端环境脚本
    #admin环境脚本
    echo "
    export OS_PROJECT_DOMAIN_NAME=default
    export OS_USER_DOMAIN_NAME=default 
    export OS_PROJECT_NAME=admin 
    export OS_USERNAME=admin
    export OS_PASSWORD=admin
    export OS_AUTH_URL=http://controller:35357/v3
    export OS_IDENTITY_API_VERSION=3
    export OS_IMAGE_API_VERSION=2
    ">./admin-openstack.sh
    #测试脚本是否生效
    source ./admin-openstack.sh
    openstack token issue
    
    #创建service项目,创建glance,nova,neutron用户,并授权
    openstack project create --domain default --description "Service Project" service
    openstack user create --domain default --password=glance glance
    openstack role add --project service --user glance admin
    openstack user create --domain default --password=nova nova
    openstack role add --project service --user nova admin
    openstack user create --domain default --password=neutron neutron
    openstack role add --project service --user neutron admin
    
    #创建demo项目(普通用户密码及角色)
    openstack project create --domain default --description "Demo Project" demo
    openstack user create --domain default --password=demo demo
    openstack role create user
    openstack role add --project demo --user demo user
    #demo环境脚本
    echo "
    export OS_PROJECT_DOMAIN_NAME=default
    export OS_USER_DOMAIN_NAME=default
    export OS_PROJECT_NAME=demo
    export OS_USERNAME=demo
    export OS_PASSWORD=demo
    export OS_AUTH_URL=http://controller:5000/v3
    export OS_IDENTITY_API_VERSION=3
    export OS_IMAGE_API_VERSION=2
    ">./demo-openstack.sh
    #测试脚本是否生效
    source ./demo-openstack.sh
    openstack token issue
    
    # #------------------#####################
    echo 'Glance镜像服务'
    # keystone上服务注册 ,创建glance服务实体,API端点(公有、私有、admin)
    source ./admin-openstack.sh || { echo "加载前面设置的admin-openstack.sh环境变量脚本";exit; }
    openstack service create --name glance --description "OpenStack Image" image
    openstack endpoint create --region RegionOne image public http://controller:9292
    openstack endpoint create --region RegionOne image internal http://controller:9292
    openstack endpoint create --region RegionOne image admin http://controller:9292
    
    cp /etc/glance/glance-api.conf{,.bak}
    cp /etc/glance/glance-registry.conf{,.bak}
    # images默认/var/lib/glance/images/
    #Imgdir=/data/glance
    mkdir -p $Imgdir
    chown glance:nobody $Imgdir
    echo "镜像目录: $Imgdir"
    echo "#
    [database]
    connection = mysql+pymysql://glance:glance@controller/glance
    [keystone_authtoken]
    auth_uri = http://controller:5000/v3
    auth_url = http://controller:35357/v3
    memcached_servers = controller:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = glance
    password = glance
    [paste_deploy]
    flavor = keystone
    [glance_store]
    stores = file,http
    default_store = file
    filesystem_store_datadir = $Imgdir
    #">/etc/glance/glance-api.conf
    #
    echo "#
    [database]
    connection = mysql+pymysql://glance:glance@controller/glance
    [keystone_authtoken]
    auth_uri = http://controller:5000/v3
    auth_url = http://controller:35357/v3
    memcached_servers = controller:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = glance
    password = glance
    [paste_deploy]
    flavor = keystone
    #">/etc/glance/glance-registry.conf
    
    #同步数据库,检查数据库
    su -s /bin/sh -c "glance-manage db_sync" glance
    mysql -h controller -u glance -pglance -e "use glance;show tables;"
    
    #启动服务并设置开机自启动
    systemctl enable openstack-glance-api openstack-glance-registry
    systemctl start openstack-glance-api openstack-glance-registry
    netstat -antp|egrep '9292|9191' #检测服务端口
    
    # #------------------#####################
    #创建Nova数据库、用户、认证,前面已设置
    source ./admin-openstack.sh
    
    # keystone上服务注册 ,创建nova用户、服务、API
    # nova用户前面已建
    openstack service create --name nova --description "OpenStack Compute" compute
    openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1
    openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1
    openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1
    #创建placement用户、服务、API
    openstack user create --domain default --password=placement placement
    openstack role add --project service --user placement admin
    openstack service create --name placement --description "Placement API" placement
    openstack endpoint create --region RegionOne placement public http://controller:8778
    openstack endpoint create --region RegionOne placement internal http://controller:8778
    openstack endpoint create --region RegionOne placement admin http://controller:8778
    
    mkdir -p $VHD
    chown -R nova:nova $VHD
    echo 'nova配置'
    echo '#
    [DEFAULT]
    instances_path='$VHD'
    enabled_apis = osapi_compute,metadata
    transport_url = rabbit://openstack:openstack@controller
    my_ip = '$MyIP'
    use_neutron = True
    firewall_driver = nova.virt.firewall.NoopFirewallDriver
    osapi_compute_listen_port=8774
    
    [api_database]
    connection = mysql+pymysql://nova:nova@controller/nova_api
    [database]
    connection = mysql+pymysql://nova:nova@controller/nova
    
    [api]
    auth_strategy = keystone
    [keystone_authtoken]
    auth_uri = http://controller:5000
    auth_url = http://controller:35357
    memcached_servers = controller:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = nova
    password = nova
    
    [vnc]
    enabled = true
    vncserver_listen = $my_ip
    vncserver_proxyclient_address = $my_ip
    novncproxy_base_url = http://'$VncProxy':6080/vnc_auto.html
    
    [glance]
    api_servers = http://controller:9292
    [oslo_concurrency]
    lock_path = /var/lib/nova/tmp
    
    [placement]
    os_region_name = RegionOne
    project_domain_name = Default
    project_name = service
    auth_type = password
    user_domain_name = Default
    auth_url = http://controller:35357/v3
    username = placement
    password = placement
    
    [scheduler]
    discover_hosts_in_cells_interval = 300
    
    [libvirt]
    virt_type = '$Kvm'
    #'>/etc/nova/nova.conf
    
    echo "
    
    #Placement API
    <Directory /usr/bin>
       <IfVersion >= 2.4>
          Require all granted
       </IfVersion>
       <IfVersion < 2.4>
          Order allow,deny
          Allow from all
       </IfVersion>
    </Directory>
    ">>/etc/httpd/conf.d/00-nova-placement-api.conf
    systemctl restart httpd
    sleep 5
    
    #同步数据库
    su -s /bin/sh -c "nova-manage api_db sync" nova
    su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
    su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
    su -s /bin/sh -c "nova-manage db sync" nova
    
    #检测数据
    nova-manage cell_v2 list_cells
    mysql -h controller -u nova -pnova -e "use nova_api;show tables;"
    mysql -h controller -u nova -pnova -e "use nova;show tables;" 
    mysql -h controller -u nova -pnova -e "use nova_cell0;show tables;"
    # #------------------#####################
    
    echo 'Neutron服务'
    source ./admin-openstack.sh 
    # 创建Neutron服务实体,API端点
    openstack service create --name neutron --description "OpenStack Networking" network
    openstack endpoint create --region RegionOne network public http://controller:9696
    openstack endpoint create --region RegionOne network internal http://controller:9696
    openstack endpoint create --region RegionOne network admin http://controller:9696
    
    #Neutron 备份配置
    cp /etc/neutron/neutron.conf{,.bak2}
    cp /etc/neutron/plugins/ml2/ml2_conf.ini{,.bak}
    ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
    cp /etc/neutron/plugins/ml2/linuxbridge_agent.ini{,.bak}
    cp /etc/neutron/dhcp_agent.ini{,.bak}
    cp /etc/neutron/metadata_agent.ini{,.bak}
    cp /etc/neutron/l3_agent.ini{,.bak}
    
    #配置
    echo '
    #
    [neutron]
    url = http://controller:9696
    auth_url = http://controller:35357
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    region_name = RegionOne
    project_name = service
    username = neutron
    password = neutron
    service_metadata_proxy = true
    metadata_proxy_shared_secret = metadata
    #'>>/etc/nova/nova.conf
    #
    echo '
    [DEFAULT]
    nova_metadata_ip = controller
    metadata_proxy_shared_secret = metadata
    #'>/etc/neutron/metadata_agent.ini
    #
    echo '#
    [ml2]
    tenant_network_types = 
    type_drivers = vlan,flat
    mechanism_drivers = linuxbridge
    extension_drivers = port_security
    [ml2_type_flat]
    flat_networks = provider
    [securitygroup]
    enable_ipset = True
    #'>/etc/neutron/plugins/ml2/ml2_conf.ini
    echo '#
    [linux_bridge]
    physical_interface_mappings = provider:'$Netname'
    [vxlan]
    enable_vxlan = false
    
    [agent]
    prevent_arp_spoofing = True
    [securitygroup]
    firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
    enable_security_group = True
    #'>/etc/neutron/plugins/ml2/linuxbridge_agent.ini
    #
    echo '#
    [DEFAULT]
    interface_driver = linuxbridge
    dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
    enable_isolated_metadata = true
    #'>/etc/neutron/dhcp_agent.ini
    #
    echo '
    [DEFAULT]
    core_plugin = ml2
    service_plugins = router
    allow_overlapping_ips = true
    transport_url = rabbit://openstack:openstack@controller
    auth_strategy = keystone
    notify_nova_on_port_status_changes = true
    notify_nova_on_port_data_changes = true
    
    [keystone_authtoken]
    auth_uri = http://controller:5000
    auth_url = http://controller:35357
    memcached_servers = controller:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = neutron
    password = neutron
    
    [nova]
    auth_url = http://controller:35357
    auth_type = password
    project_domain_id = default
    user_domain_id = default
    region_name = RegionOne
    project_name = service
    username = nova
    password = nova
    
    [database]
    connection = mysql://neutron:neutron@controller:3306/neutron
    
    [oslo_concurrency]
    lock_path = /var/lib/neutron/tmp 
    #'>/etc/neutron/neutron.conf
    #
    echo '
    [DEFAULT]
    interface_driver = linuxbridge
    #'>/etc/neutron/l3_agent.ini
    #
    #同步数据库
    su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \
      --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
    #检测数据
    mysql -h controller -u neutron -pneutron -e "use neutron;show tables;" 
    
    # #------------------#####################
    #dashboard
    
    echo '配置openstack Web'
    cp /etc/openstack-dashboard/local_settings{,.bak}
    Setfiles=/etc/openstack-dashboard/local_settings
    sed -i 's#_member_#user#g' $Setfiles
    sed -i 's#OPENSTACK_HOST = "127.0.0.1"#OPENSTACK_HOST = "controller"#' $Setfiles
    ##允许所有主机访问#
    sed -i "/ALLOWED_HOSTS/cALLOWED_HOSTS = ['*', ]" $Setfiles
    #去掉memcached注释#
    sed -in '153,158s/#//' $Setfiles 
    sed -in '160,164s/.*/#&/' $Setfiles
    sed -i 's#UTC#Asia/Shanghai#g' $Setfiles
    sed -i 's#%s:5000/v2.0#%s:5000/v3#' $Setfiles
    sed -i '/ULTIDOMAIN_SUPPORT/cOPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True' $Setfiles
    sed -i "s@^#OPENSTACK_KEYSTONE_DEFAULT@OPENSTACK_KEYSTONE_DEFAULT@" $Setfiles
    echo '
    #set
    OPENSTACK_API_VERSIONS = {
        "identity": 3,
        "image": 2,
        "volume": 2,
    }
    #'>>$Setfiles
    systemctl restart httpd
    sleep 5
    
    ##########################################
    
    echo '启动服务'
    #Apache 
    systemctl enable httpd.service
    #systemctl restart httpd haproxy
    #netstat -antp|egrep 'httpd'
    
    #glance服务
    systemctl enable openstack-glance-api openstack-glance-registry
    systemctl restart openstack-glance-api openstack-glance-registry
    
    #nova服务
     systemctl enable openstack-nova-api.service \
      openstack-nova-consoleauth.service openstack-nova-scheduler.service \
      openstack-nova-conductor.service openstack-nova-novncproxy.service \
      libvirtd.service openstack-nova-compute.service
    #启动
    systemctl start openstack-nova-api.service \
      openstack-nova-consoleauth.service openstack-nova-scheduler.service \
      openstack-nova-conductor.service openstack-nova-novncproxy.service \
      libvirtd.service openstack-nova-compute.service
    
    #neutron服务
    systemctl enable neutron-server.service \
      neutron-linuxbridge-agent.service neutron-dhcp-agent.service \
      neutron-metadata-agent.service neutron-l3-agent.service
    systemctl start neutron-server.service \
      neutron-linuxbridge-agent.service neutron-dhcp-agent.service \
      neutron-metadata-agent.service neutron-l3-agent.service
    
    ##########################################
    #cheack
    
    echo "查看节点"
    source ./admin-openstack.sh 
    openstack compute service list
    openstack network agent list
    
    ##########################################
    #end
    
    echo '
    安装完毕!
    数据库root密码 '$DBPass'
    
    登录Web管理 http://'$MyIP'/dashboard
    域   default
    用户 admin
    密码 admin
    推荐 火狐浏览器
    '
    ##########################################
    # #在线安装
    # yum install -y wget && wget -O pike.install.sh \
    #   http://elven.vip/ks/openstack/pike.install.sh && sh pike.install.sh
    

    赋予执行权限并执行,安装过程大概半个小时。

    [root@opst-allinone ~]# chmod 755 openstack_install.sh && ./openstack_install.sh
    

    本脚本原作者 Elven 子隐 , 本人亲自 验证安装没问题。稍作修改放在这里。

    相关文章

      网友评论

        本文标题:1 )一键安装 openstack P版(Pike) 到单机

        本文链接:https://www.haomeiwen.com/subject/kkpfoxtx.html