Openstack Grizzily版本已经相当完善,根据官方文档安装基本不存在什么问题,但是想快速测试了解Openstack功能的用户非常多,devstack的安装需要check最新的代码,时常碰到一些bug。这里记录一下我的单节点安装日志,尽量合并,优化一些项目以减少复杂性:
1.安装操作系统:Ubuntu12.04 LTS,打开ssh, 配置root,先更新一下apt source
2.对于12.04要加上grizzily的源:
echo deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-updates/grizzly main >> /etc/apt/sources.list.d/grizzly.list apt-get update apt-get install ubuntu-cloud-keyring python-software-properties software-properties-common python-keyring
3.更新系统
echo deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-updates/grizzly main >> /etc/apt/sources.list.d/grizzly.list apt-get update apt-get install ubuntu-cloud-keyring python-software-properties software-properties-common python-keyring
这次更新比较多,重启一下是个好习惯.
reboot
4.检查语言,如果是中文系统,请改成英文,这一步是可选的了,不过根据我的经验,写上LC_ALL比不写好。
vi /etc/default/locale LANG="en_US.UTF-8" LANGUAGE="en_US:en" LC_ALL="en_US.utf8"
5.配置IP:
# The primary network interface auto eth0 iface eth0 inet static address 10.51.166.16 netmask 255.255.255.0 network 10.51.166.0 gateway 10.51.166.1 # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 114.114.114.114 auto eth1 iface eth1 inet manual up ifconfig $IFACE 0.0.0.0 up up ip link set $IFACE promisc on down ip link set $IFACE promisc off down ifconfig $IFACE down
6.安装组件了,为了方便,一次将所有的包都装上,这里只列了一些关键包,根据依赖关系,其它的包应该都会自动装上:
apt-get install ntp mysql-server python-mysqldb python-sqlalchemy phpmyadmin rabbitmq-server keystone glance nova-novncproxy novnc nova-api nova-ajax-console-proxy nova-cert nova-conductor nova-consoleauth nova-doc nova-scheduler nova-compute-kvm cinder-api cinder-scheduler cinder-volume iscsitarget open-iscsi iscsitarget-dkms quantum-server python-quantumclient quantum-plugin-openvswitch quantum-plugin-openvswitch-agent quantum-dhcp-agent quantum-l3-agent quantum-lbaas-agent quantum-metadata-agent memcached libapache2-mod-wsgi openstack-dashboard
7. 配置本地环境变量
vi ~/novarc export OS_TENANT_NAME=admin export OS_TENANT_ID=30387eb46b624012bce5172ac77ab407 export OS_USERNAME=admin export OS_PASSWORD=password export OS_AUTH_URL="http://127.0.0.1:35357/v2.0" export OS_REGION_NAME=RegionOne export OS_IDENTITY_API_VERSION=2.0 export SERVICE_TOKEN=ADMIN export SERVICE_ENDPOINT="http://127.0.0.1:35357/v2.0" echo "source ~/novarc" >> ~/.bashrc
允许ip转发
sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
8.创建mysql数据库,一次创建所有的库,可以用http://10.51.166.16/phpmyadmin界面来创建:
keystone;glance;nova;cinder;quantum;
9.配置keystone
sed -i "s/sqlite:////var/lib/keystone/keystone.db/mysql://root:password@127.0.0.1/keystone/g" /etc/keystone/keystone.conf
restart keystone
初始化keystone数据库,创建表
keystone-manage db_sync
10.初始化keystone_db数据,创建用户和服务,这里使用一个脚本,粘到文件中运行,内容如下:
#!/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 HOST_IP=127.0.0.1 EXT_HOST_IP=$HOST_IP ADMIN_PASSWORD=${ADMIN_PASSWORD:-password} SERVICE_PASSWORD=${SERVICE_PASSWORD:-password} export SERVICE_TOKEN="ADMIN" export SERVICE_ENDPOINT="http://${HOST_IP}:35357/v2.0" SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-service} # MySQL definitions MYSQL_USER=root MYSQL_DATABASE=keystone MYSQL_HOST=$HOST_IP MYSQL_PASSWORD=password # Keystone definitions KEYSTONE_REGION=RegionOne #====================================== 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 SERVICE_USER=$(get_id keystone user-create --name=service --pass="$SERVICE_PASSWORD" --tenant-id $SERVICE_TENANT --email=service@domain.com) keystone user-role-add --tenant-id $SERVICE_TENANT --user-id $SERVICE_USER --role-id $ADMIN_ROLE #===========Service=========== 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' keystone service-create --name quantum --type network --description 'OpenStack Networking service' #============= 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 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' ;; network) keystone endpoint-create --region $KEYSTONE_REGION --service-id $2 --publicurl 'http://'"$EXT_HOST_IP"':9696/' --adminurl 'http://'"$HOST_IP"':9696/' --internalurl 'http://'"$HOST_IP"':9696/' ;; esac } for i in compute volume image object-store identity ec2 network; 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