基本是参考STACKLAB.ORG的文档,不过他们的文档有些小问题,好像很久也没更新,我按我安装时的更正错误了
我是这几天装过,我下面的步骤是没问题的
参考来源:http://wiki.stacklab.org/doku.php?id=stacklab:documentation:install-openstack-folsom-with-nova-network
你可以依照你的IP,在下面的文档中修改IP即可。
本文介绍了如何安装OpenStack Folsom版,因为在Foslom版本中,Quantum还不成熟,所以使用nova-network。
nova-network使用FlatDHCP+Multihost模式,每个服务器装两块网卡。eth0用于public network和manage network,eth1用于vm network。
节点名 | 角色 | eth0 | eth1 | 运行的服务 |
---|---|---|---|---|
control-01 | 控制节点 | 192.168.56.101 | | keystone、glance、cinder、nova-api、nova-scheduler |
compute-01 | 计算节点 | 192.168.56.111 | | nova-compute、nova-network、nova-api-metadata |
compute-02 | 计算节点 | 192.168.56.112 | | nova-compute、nova-network、nova-api-metadata |
compute-03 | 计算节点 | 192.168.56.113 | | nova-compute、nova-network、nova-api-metadata |
该环境中规划了 256个fixed_ip,网段是 10.0.0.0/24。还规划了128个floating_ip,网段是 192.168.56.128/25 。
所有节点
操作系统
使用的是 ubuntu-12.04.1-server-amd64 , 下载地址为
电信网:163镜像站:http://mirrors.163.com/ubuntu-releases/12.04.1/ubuntu-12.04.1-server-amd64.iso
教育网:清华镜像站 : http://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases//precise/ubuntu-12.04.1-server-amd64.iso
网络设置
修改/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 auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet static #你的机器的IP地址 address 192.168.56.101 netmask 255.255.255.0 gateway 192.168.56.1 dns-nameservers 8.8.8.8 auto eth1 iface eth1 inet manual up ifconfig eth1 up
源
直接执行下面命令:
wget http://mirrors.163.com/.help/sources.list.precise
mv /etc/apt/sources.list /etc/apt/sources.list_copy
mv sources.list.precise /etc/apt/sources.list
cat >>/etc/apt/sources.list<<EOF
deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-proposed/folsom main
deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-updates/folsom main
EOF
更新操作:
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5EDB1B62EC4926EA
apt-get update
hostname设置
修改/etc/hostname(不同节点的hostname不一样) :
#cat /etc/hostname control-01
修改/etc/hosts,添加上:
192.168.56.101 control-01 192.168.56.111 compute-01 192.168.56.112 compute-02 192.168.56.113 compute-03
mysql和rabbitmq
安装mysql,设置mysql的密码是”root”:
#apt-get install mysql-server python-mysqldb
配置mysql可以接受来自任何节点的请求:
#sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf #service mysql restart
安装rebbitmq:
#apt-get install rabbitmq-server
NTP
安装NTP:
#apt-get install ntp #sed -i 's/server ntp.ubuntu.com/server ntp.ubuntu.com\nserver 127.127.1.0\nfudge 127.127.1.0 stratum 10/g' /etc/ntp.conf #service ntp restart
其他
控制节点
安装OpenStack组件
#os_keystone="keystone python-keystone python-keystoneclient" #os_glance="glance glance-api python-glanceclient glance-common" #os_nova="nova-api nova-cert nova-common nova-scheduler python-nova python-novaclient nova-consoleauth novnc nova-novncproxy " #os_horizon="apache2 libapache2-mod-wsgi openstack-dashboard memcached python-memcache" #os_cinder="cinder-api cinder-scheduler cinder-volume iscsitarget open-iscsi iscsitarget-dkms python-cinderclient" #apt-get install $os_keystone $os_glance $os_nova $os_horizon $os_cinder
各个服务的数据库
需要给keystone、nova、cinder、glance创建数据,设置权限。这里简单的设置所有数据库的用户名和密码都是'openstack',当然你也可以设置为其他字符串。
#mysql -uroot -proot mysql> CREATE DATABASE keystone; mysql> CREATE DATABASE nova; mysql> CREATE DATABASE cinder; mysql> CREATE DATABASE glance; mysql> GRANT ALL ON keystone.* TO openstack@'%' IDENTIFIED BY 'openstack'; mysql> GRANT ALL ON nova.* TO openstack@'%' IDENTIFIED BY 'openstack'; mysql> GRANT ALL ON cinder.* TO openstack@'%' IDENTIFIED BY 'openstack'; mysql> GRANT ALL ON glance.* TO openstack@'%' IDENTIFIED BY 'openstack'; mysql> GRANT ALL ON keystone.* TO openstack@'192.168.56.101' IDENTIFIED BY 'openstack'; mysql> GRANT ALL ON nova.* TO openstack@'192.168.56.101' IDENTIFIED BY 'openstack'; mysql> GRANT ALL ON nova.* TO openstack@'192.168.56.111' IDENTIFIED BY 'openstack'; mysql> GRANT ALL ON nova.* TO openstack@'192.168.56.112' IDENTIFIED BY 'openstack'; mysql> GRANT ALL ON nova.* TO openstack@'192.168.56.113' IDENTIFIED BY 'openstack'; mysql> GRANT ALL ON cinder.* TO openstack@'192.168.56.101' IDENTIFIED BY 'openstack'; mysql> GRANT ALL ON glance.* TO openstack@'192.168.56.101' IDENTIFIED BY 'openstack';
keystone
修改 /etc/keystone/keystone.conf配置,以便能够访问数据库:
connection = mysql://openstack:openstack@192.168.56.101/keystone
重启服务器,并初始化数据库:
#service keystone restart #keystone-manage db_sync
执行keystone_basic.sh脚本,创建基本的user、tenant、role。keystone_basic.sh脚本如下所示:
#!/bin/sh # # Keystone basic configuration # Mainly inspired by https://github.com/openstack/keystone/blob/master/tools/sample_data.sh # Modified by Bilel Msekni / Institut Telecom # # Support: openstack@lists.launchpad.net # License: Apache Software License (ASL) 2.0 # #节点的IP地址 HOST_IP=192.168.56.101 ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin_pass} SERVICE_PASSWORD=${SERVICE_PASSWORD:-service_pass} export SERVICE_TOKEN="ADMIN" export SERVICE_ENDPOINT="http://${HOST_IP}:35357/v2.0" SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-service} get_id () { echo `$@ | awk '/ id / { print $4 }'` } # Tenants ADMIN_TENANT=$(get_id keystone tenant-create --name=admin) SERVICE_TENANT=$(get_id keystone tenant-create --name=$SERVICE_TENANT_NAME) # Users ADMIN_USER=$(get_id keystone user-create --name=admin --pass="$ADMIN_PASSWORD" --email=admin@domain.com) # Roles ADMIN_ROLE=$(get_id keystone role-create --name=admin) KEYSTONEADMIN_ROLE=$(get_id keystone role-create --name=KeystoneAdmin) KEYSTONESERVICE_ROLE=$(get_id keystone role-create --name=KeystoneServiceAdmin) # Add Roles to Users in Tenants keystone user-role-add --user-id $ADMIN_USER --role-id $ADMIN_ROLE --tenant-id $ADMIN_TENANT keystone user-role-add --user-id $ADMIN_USER --role-id $KEYSTONEADMIN_ROLE --tenant-id $ADMIN_TENANT keystone user-role-add --user-id $ADMIN_USER --role-id $KEYSTONESERVICE_ROLE --tenant-id $ADMIN_TENANT # The Member role is used by Horizon and Swift MEMBER_ROLE=$(get_id keystone role-create --name=Member) # Configure service users/roles NOVA_USER=$(get_id keystone user-create --name=nova --pass="$SERVICE_PASSWORD" --tenant-id $SERVICE_TENANT --email=nova@domain.com) keystone user-role-add --tenant-id $SERVICE_TENANT --user-id $NOVA_USER --role-id $ADMIN_ROLE GLANCE_USER=$(get_id keystone user-create --name=glance --pass="$SERVICE_PASSWORD" --tenant-id $SERVICE_TENANT --email=glance@domain.com) keystone user-role-add --tenant-id $SERVICE_TENANT --user-id $GLANCE_USER --role-id $ADMIN_ROLE CINDER_USER=$(get_id keystone user-create --name=cinder --pass="$SERVICE_PASSWORD" --tenant-id $SERVICE_TENANT --email=cinder@domain.com) keystone user-role-add --tenant-id $SERVICE_TENANT --user-id $CINDER_USER --role-id $ADMIN_ROLE
执行 keystone_endpoints_basic.sh脚本,创建endpoints。keystone_endpoints_basic.sh脚本如下所示:
#!/bin/sh # # Keystone basic Endpoints # Mainly inspired by https://github.com/openstack/keystone/blob/master/tools/sample_data.sh # Modified by Bilel Msekni / Institut Telecom # # Support: openstack@lists.launchpad.net # License: Apache Software License (ASL) 2.0 # # Host address #节点的manage network的IP地址 HOST_IP=192.168.56.101 #节点的public network的IP地址 EXT_HOST_IP=192.168.56.101 # MySQL definitions MYSQL_USER=root MYSQL_DATABASE=keystone MYSQL_HOST=$HOST_IP MYSQL_PASSWORD=root
# Keystone definitions KEYSTONE_REGION=RegionOne export SERVICE_TOKEN=ADMIN export SERVICE_ENDPOINT="http://${HOST_IP}:35357/v2.0" while getopts "u:D:p:m:K:R:E:T:vh" opt; do case $opt in u) MYSQL_USER=$OPTARG ;; D) MYSQL_DATABASE=$OPTARG ;; p) MYSQL_PASSWORD=$OPTARG ;; m) MYSQL_HOST=$OPTARG ;; K) MASTER=$OPTARG ;; R) KEYSTONE_REGION=$OPTARG ;; E) export SERVICE_ENDPOINT=$OPTARG ;; T) export SERVICE_TOKEN=$OPTARG ;; v) set -x ;; h) cat <<EOF Usage: $0 [-m mysql_hostname] [-u mysql_username] [-D mysql_database] [-p mysql_password] [-K keystone_master ] [ -R keystone_region ] [ -E keystone_endpoint_url ] [ -T keystone_token ] Add -v for verbose mode, -h to display this message. EOF exit 0 ;; \?) echo "Unknown option -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument" >&2 exit 1 ;; esac done if [ -z "$KEYSTONE_REGION" ]; then echo "Keystone region not set. Please set with -R option or set KEYSTONE_REGION variable." >&2 missing_args="true" fi if [ -z "$SERVICE_TOKEN" ]; then echo "Keystone service token not set. Please set with -T option or set SERVICE_TOKEN variable." >&2 missing_args="true" fi if [ -z "$SERVICE_ENDPOINT" ]; then echo "Keystone service endpoint not set. Please set with -E option or set SERVICE_ENDPOINT variable." >&2 missing_args="true" fi if [ -z "$MYSQL_PASSWORD" ]; then echo "MySQL password not set. Please set with -p option or set MYSQL_PASSWORD variable." >&2 missing_args="true" fi if [ -n "$missing_args" ]; then exit 1 fi keystone service-create --name nova --type compute --description 'OpenStack Compute Service' keystone service-create --name cinder --type volume --description 'OpenStack Volume Service' keystone service-create --name glance --type image --description 'OpenStack Image Service' keystone service-create --name keystone --type identity --description 'OpenStack Identity' keystone service-create --name ec2 --type ec2 --description 'OpenStack EC2 service' create_endpoint () { case $1 in compute) keystone endpoint-create --region $KEYSTONE_REGION --service-id $2 --publicurl 'http://'"$EXT_HOST_IP"':8774/v2/$(tenant_id)s' --adminurl 'http://'"$HOST_IP"':8774/v2/$(tenant_id)s' --internalurl 'http://'"$HOST_IP"':8774/v2/$(tenant_id)s' ;; volume) keystone endpoint-create --region $KEYSTONE_REGION --service-id $2 --publicurl 'http://'"$EXT_HOST_IP"':8776/v1/$(tenant_id)s' --adminurl 'http://'"$HOST_IP"':8776/v1/$(tenant_id)s' --internalurl 'http://'"$HOST_IP"':8776/v1/$(tenant_id)s' ;; image) keystone endpoint-create --region $KEYSTONE_REGION --service-id $2 --publicurl 'http://'"$EXT_HOST_IP"':9292/v2' --adminurl 'http://'"$HOST_IP"':9292/v2' --internalurl 'http://'"$HOST_IP"':9292/v2' ;; identity) keystone endpoint-create --region $KEYSTONE_REGION --service-id $2 --publicurl 'http://'"$EXT_HOST_IP"':5000/v2.0' --adminurl 'http://'"$HOST_IP"':35357/v2.0' --internalurl 'http://'"$HOST_IP"':5000/v2.0' ;; ec2) keystone endpoint-create --region $KEYSTONE_REGION --service-id $2 --publicurl 'http://'"$EXT_HOST_IP"':8773/services/Cloud' --adminurl 'http://'"$HOST_IP"':8773/services/Admin' --internalurl 'http://'"$HOST_IP"':8773/services/Cloud' ;; esac } for i in compute volume image object-store identity ec2; do id=`mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE" -ss -e "SELECT id FROM service WHERE type='"$i"';"` || exit 1 create_endpoint $i $id done
填写openrc文件:
# cat openrc export OS_TENANT_NAME=admin export OS_USERNAME=admin export OS_PASSWORD=admin_pass export OS_AUTH_URL="http://192.168.56.101:5000/v2.0/"
加载环境变量:
#source openrc
测试keystone:
# keystone user-list +----------------------------------+--------+---------+-------------------+ | id | name | enabled | email | +----------------------------------+--------+---------+-------------------+ | 4fa0ecb0979c46928d0d9e6a11965ca5 | glance | True | glance@domain.com | | 7e10d7dfe68c437abda3a29da9550415 | nova | True | nova@domain.com | | abeb9e73069640debd8d4e2de4fee2cb | admin | True | admin@domain.com | | d5146f2348f14406a84984e353e8ff7a | cinder | True | cinder@domain.com | +----------------------------------+--------+---------+-------------------+
glance
更新glance的配置文件 /etc/glance/glance-api-paste.ini :
[filter:authtoken] paste.filter_factory = keystone.middleware.auth_token:filter_factory auth_host = 192.168.56.101 auth_port = 35357 auth_protocol = http admin_tenant_name = service admin_user = glance admin_password = service_pass
更新glance的配置文件 /etc/glance/glance-registry-paste.ini :
[filter:authtoken] paste.filter_factory = keystone.middleware.auth_token:filter_factory auth_host = 192.168.56.101 auth_port = 35357 auth_protocol = http admin_tenant_name = service admin_user = glance admin_password = service_pass
更新 /etc/glance/glance-api.conf :
sql_connection = mysql://openstack:openstack@192.168.56.101/glance [paste_deploy] flavor = keystone
更新 /etc/glance/glance-registry.conf :
sql_connection = mysql://openstack:openstack@192.168.56.101/glance [paste_deploy] flavor = keystone
重启服务:
#service glance-api restart; service glance-registry restart
同步数据库:
#glance-manage db_sync
重启服务:
#service glance-api restart; service glance-registry restart
上传镜像:
#wget https://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-x86_64-disk.img #source openrc #glance image-create --name myFirstImage --is-public true --container-format bare --disk-format qcow2 < cirros-0.3.0-x86_64-disk.img
测试glance:
#glance image-list
cinder
配置iscsitarget:
#sed -i 's/false/true/g' /etc/default/iscsitarget
重启服务iscsitarget:
#service iscsitarget start #service open-iscsi start
更新配置 /etc/cinder/api-paste.ini:
[filter:authtoken] paste.filter_factory = keystone.middleware.auth_token:filter_factory service_protocol = http service_host = 192.168.56.101 service_port = 5000 auth_host = 192.168.56.101 auth_port = 35357 auth_protocol = http admin_tenant_name = service admin_user = cinder admin_password = service_pass
更新配置 /etc/cinder/cinder.conf :
[DEFAULT] rootwrap_config=/etc/cinder/rootwrap.conf sql_connection = mysql://openstack:openstack@192.168.56.101/cinder api_paste_confg = /etc/cinder/api-paste.ini iscsi_helper=ietadm volume_name_template = volume-%s volume_group = cinder-volumes verbose = True auth_strategy = keystone #osapi_volume_listen_port=5900
同步数据库:
#cinder-manage db sync
创建一个测试用的volumegroup:
# mkdir -p /opt/data/cinder # cd /opt/data/cinder/ # truncate -s 2G vgfile # losetup -f --show vgfile /dev/loop0 # vgcreate cinder-volumes /dev/loop0 No physical volume label read from /dev/loop0 Writing physical volume data to disk "/dev/loop0" Physical volume "/dev/loop0" successfully created Volume group "cinder-volumes" successfully created
重启服务:
#cd /etc/init.d/; for i in $( ls cinder-* ); do service $i restart; done
nova
修改配置/etc/nova/api-paste.ini:
[filter:authtoken] paste.filter_factory = keystone.middleware.auth_token:filter_factory auth_host = 192.168.56.101 auth_port = 35357 auth_protocol = http admin_tenant_name = service admin_user = nova admin_password = service_pass signing_dirname = /tmp/keystone-signing-nova
修改配置 /etc/nova/nova.conf:
[DEFAULT] # LOGS/STATE verbose=True logdir=/var/log/nova state_path=/var/lib/nova lock_path=/run/lock/nova # AUTHENTICATION auth_strategy=keystone # SCHEDULER scheduler_driver=nova.scheduler.multi.MultiScheduler compute_scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler # CINDER volume_api_class=nova.volume.cinder.API # DATABASE sql_connection=mysql://openstack:openstack@192.168.56.101/nova # COMPUTE #假如节点不支持kvm,则填写qemu(一般是使用虚拟机安装openstack时) libvirt_type=kvm libvirt_use_virtio_for_bridges=True start_guests_on_host_boot=True resume_guests_state_on_host_boot=True api_paste_config=/etc/nova/api-paste.ini allow_admin_api=True use_deprecated_auth=False nova_url=http://192.168.56.101:8774/v1.1/ root_helper=sudo nova-rootwrap /etc/nova/rootwrap.conf # APIS ec2_host=192.168.56.101 ec2_url=http://192.168.56.101:8773/services/Cloud keystone_ec2_url=http://192.168.56.101:5000/v2.0/ec2tokens s3_host=192.168.56.101 cc_host=192.168.56.101 metadata_host=192.168.56.101 enabled_apis=ec2,osapi_compute,metadata # RABBITMQ rabbit_host=192.168.56.101 # GLANCE image_service=nova.image.glance.GlanceImageService glance_api_servers=192.168.56.101:9292 # NETWORK network_manager=nova.network.manager.FlatDHCPManager force_dhcp_release=True dhcpbridge_flagfile=/etc/nova/nova.conf dhcpbridge=/usr/bin/nova-dhcpbridge firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver public_interface=eth0 flat_interface=eth1 flat_network_bridge=br100 fixed_range=10.0.0.0/24 network_size=256 flat_injected=False connection_type=libvirt multi_host=True # NOVNC CONSOLE novnc_enabled=True novncproxy_base_url=http://192.168.56.101:6080/vnc_auto.html vncserver_proxyclient_address=192.168.56.101 vncserver_listen=192.168.56.101
修改sudoers文件,在/etc/sudoers添加上:
#Paste this line anywhere you like: nova ALL=(ALL) NOPASSWD:ALL
同步数据库:
#nova-manage db sync
重启nova服务:
#for i in nova-api nova-cert nova-consoleauth nova-novncproxy nova-scheduler; do service $i restart; done
检查服务状态:
#nova-manage service list
创建fixed_ip:
#nova-manage network create private --fixed_range_v4=10.0.0.0/24 --num_networks=1 --bridge=br100 --bridge_interface=eth1 --network_size=256 --multi_host=T
创建floating_ip:
#nova-manage floating create 192.168.56.128/25
计算节点
安装OpenStack组件
#os_nova="nova-common python-nova python-novaclient nova-compute nova-network nova-api-metadata " #os_other=" kvm libvirt-bin pm-utils bridge-utils" #apt-get install $os_nova $other
nova
编辑 /etc/nova/nova.conf文件(假设在节点compute-01上,ip地址是192.168.56.111):
[DEFAULT] # LOGS/STATE verbose=True logdir=/var/log/nova state_path=/var/lib/nova lock_path=/run/lock/nova # AUTHENTICATION auth_strategy=keystone # SCHEDULER scheduler_driver=nova.scheduler.multi.MultiScheduler compute_scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler # CINDER volume_api_class=nova.volume.cinder.API # DATABASE sql_connection=mysql://openstack:openstack@192.168.56.101/nova # COMPUTE libvirt_type=qemu libvirt_use_virtio_for_bridges=True start_guests_on_host_boot=True resume_guests_state_on_host_boot=True api_paste_config=/etc/nova/api-paste.ini allow_admin_api=True use_deprecated_auth=False nova_url=http://192.168.56.101:8774/v1.1/ root_helper=sudo nova-rootwrap /etc/nova/rootwrap.conf # APIS ec2_host=192.168.56.101 ec2_url=http://192.168.56.101:8773/services/Cloud keystone_ec2_url=http://192.168.56.101:5000/v2.0/ec2tokens s3_host=192.168.56.101 cc_host=192.168.56.101 #每个metadata_host的ip都要和节点的ip一样 metadata_host=192.168.56.111 metadata_listen=0.0.0.0 enabled_apis=metadata # RABBITMQ rabbit_host=192.168.56.101 # GLANCE image_service=nova.image.glance.GlanceImageService glance_api_servers=192.168.56.101:9292 # NETWORK network_manager=nova.network.manager.FlatDHCPManager force_dhcp_release=True dhcpbridge_flagfile=/etc/nova/nova.conf dhcpbridge=/usr/bin/nova-dhcpbridge firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver public_interface=eth0 flat_interface=eth1 flat_network_bridge=br100 fixed_range=10.0.0.0/24 network_size=256 flat_injected=False connection_type=libvirt multi_host=True # NOVNC CONSOLE novnc_enabled=True novncproxy_base_url=http://192.168.56.101:6080/vnc_auto.html #vncserver_proxyclient_address和vncserver_listen的ip要和节点ip一样 vncserver_proxyclient_address=192.168.56.111 vncserver_listen=192.168.56.111
修改/etc/nova/nova-compute.conf的配置:
[DEFAULT] #假如节点不支持kvm,则填写qemu(一般是使用虚拟机安装openstack时) libvirt_type=kvm
启动服务:
#for i in nova-api-metadata nova-compute nova-network; do service $i restart; done
其他计算节点
其他计算节点按照同样的方法部署。
访问OpenStack DashBoard
修改定制界面(可选):
#/usr/share/openstack-dashboard/openstack_dashboard/settings.py ==> 加模块,.换模板
etc/openstack-dashboard/local_settings.py. ==>web site brand SITE_BRANDING = 'OpenStack Dashboard'
#/usr/share/openstack-dashboard/openstack-dashboard/dashboard/static/dashboard/img/logo.png.
#/usr/share/openstack-dashboard/openstack-dashboard/dashboard/static/dashboard/css/9xxx set image
#/usr/share/openstack-dashboard/openstack-dashboard/locale/ ==》language
vi /etc/apache2/sites-available/default
打开default文件后,在default文件顶端加入:
ServerName 127.0.0.1
在控制节点上重启apache和memcached:
#service apache2 restart; service memcached restart
访问 http://192.168.56.101/horizon ,用户名和密码是 admin 和 admin_pass 。
评:F版只是G版的一个测试版,其中的cinder-volume真的只是个试验品,挂载不到实例是正常的,不要伤心。
模板要换成官方原板,不要用ubuntu的,它的有点小问题。
/usr/share/openstack-dashboard/openstack_dashboard/settings.py ==> 、.换模板 有一个try and catch,中间是ubuntu template,这一个try and catch几行注释掉就行了,