Controller Node を構成します。
パッケージのアップデートを行います。
$ sudo apt-get -y update
$ sudo apt-get -y upgrade
$ sudo apt-get -y dist-upgrade
$ sudo apt-get -y autoremove
ネットワークの設定を行います。
$ sudo vim /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.56.2
netmask 255.255.255.0
network 192.168.56.0
broadcast 192.168.56.255
auto eth1
iface eth1 inet static
address 192.168.1.2
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
auto eth2
iface eth2 inet dhcp
$ sudo /etc/init.d/networking restart
MySQL Server をインストールします。
MySQL Server インストール時に root ユーザのパスワードを求められます。ここでは「y7u8i9YUI」を設定したものとして以降の設定を行います。
$ sudo apt-get -y install mysql-server python-mysqldb
外部からデータベースに接続できるよう、値を変更します。
その他、必要に応じて、skip-name-resolve やキャッシュ設定などを行います。
$ sudo sed -i -e "s/\(^bind-address.*= \).*/\10.0.0.0/" /etc/mysql/my.cnf
$ sudo service mysql restart
後でデータベースを作成しても良いですが、面倒なのでここで一気に作成します。
Nova のデータベースは latin1 で作成していますが、初期化時に UTF-8 に変更されます。
$ mysql -uroot -p
mysql> DROP DATABASE test;
mysql> CREATE DATABASE IF NOT EXISTS cinder;
mysql> CREATE DATABASE IF NOT EXISTS glance CHARACTER SET utf8;
mysql> CREATE DATABASE IF NOT EXISTS keystone CHARACTER SET utf8;
mysql> CREATE DATABASE IF NOT EXISTS nova CHARACTER SET latin1;
mysql> CREATE DATABASE IF NOT EXISTS quantum CHARACTER SET utf8;
mysql> GRANT ALL PRIVILEGES ON nova.* TO nova@localhost IDENTIFIED BY 'y7u8i9YUI';
mysql> GRANT ALL PRIVILEGES ON glance.* TO glance@localhost IDENTIFIED BY 'y7u8i9YUI';
mysql> GRANT ALL PRIVILEGES ON keystone.* TO keystone@localhost IDENTIFIED BY 'y7u8i9YUI';
mysql> GRANT ALL PRIVILEGES ON cinder.* TO cinder@localhost IDENTIFIED BY 'y7u8i9YUI';
mysql> GRANT ALL PRIVILEGES ON quantum.* TO quantum@localhost IDENTIFIED BY 'y7u8i9YUI';
mysql> GRANT ALL PRIVILEGES ON nova.* TO nova@'%' IDENTIFIED BY 'y7u8i9YUI';
mysql> GRANT ALL PRIVILEGES ON glance.* TO glance@'%' IDENTIFIED BY 'y7u8i9YUI';
mysql> GRANT ALL PRIVILEGES ON keystone.* TO keystone@'%' IDENTIFIED BY 'y7u8i9YUI';
mysql> GRANT ALL PRIVILEGES ON cinder.* TO cinder@'%' IDENTIFIED BY 'y7u8i9YUI';
mysql> GRANT ALL PRIVILEGES ON quantum.* TO quantum@'%' IDENTIFIED BY 'y7u8i9YUI';
mysql> exit
RabbitMQ Server は起動時、自身のホスト名で名前解決が行えないとエラーになります。
事前に /etc/hosts などを編集するなどして、名前解決が行えるようにしておいてください。
$ sudo apt-get -y install rabbitmq-server
今回は設定しませんが、RabbitMQ Server の設定を行う場合は以下のように設定します。
$ sudo rabbitmqctl add_vhost /nova
$ sudo rabbitmqctl add_user nova y7u8i9YUI
$ sudo rabbitmqctl set_permissions -p /nova nova ".*" ".*" ".*"
$ sudo rabbitmqctl add_vhost /glance
$ sudo rabbitmqctl add_user glance y7u8i9YUI
$ sudo rabbitmqctl set_permissions -p /glance glance ".*" ".*" ".*"
$ sudo rabbitmqctl add_vhost /cinder
$ sudo rabbitmqctl add_user cinder y7u8i9YUI
$ sudo rabbitmqctl set_permissions -p /cinder cinder ".*" ".*" ".*"
$ sudo rabbitmqctl add_vhost /quantum
$ sudo rabbitmqctl add_user quantum y7u8i9YUI
$ sudo rabbitmqctl set_permissions -p /quantum quantum ".*" ".*" ".*"
$ sudo rabbitmqctl delete_user guest
$ sudo rabbitmqctl list_users
$ sudo rabbitmqctl list_vhosts
$ sudo rabbitmqctl list_permissions
$ sudo rabbitmqctl list_user_permissions nova
$ sudo rabbitmqctl list_user_permissions glance
各ノードの時刻がずれているとサービスが起動しません。時刻同期のため、NTP を使用します。
$ sudo apt-get -y install ntp
時刻同期先に任意のサーバを指定し、NTP を再起動します。
その他ネットワーク関連パッケージ等のインストール及び設定を行います。
$ sudo apt-get -y install vlan bridge-utils
$ sudo vim /etc/sysctl.conf
net.ipv4.ip_forward を 1 に設定
$ sudo sysctl -w net.ipv4.ip_forward=1
認証サービス Keystone をインストールします。
$ sudo apt-get -y install keystone
今回は、admin_token と connection を設定します。
$ sudo vim /etc/keystone/keystone.conf
admin_token = 999888777666 # ホントは複雑なものが良い
connection = mysql://keystone:y7u8i9YUI@127.0.0.1/keystone
$ sudo service keystone restart
以下のスクリプト(DevStackからパク(ry )を使用して、Keystone に認証情報等を登録します。
ここでは以下の情報が登録されます。
$ vim ~/keystone_data.sh
#!/bin/bash
# --------
# Defaults
# --------
ADMIN_PASSWORD=${ADMIN_PASSWORD:-"y7u8i9YUI"}
SERVICE_PASSWORD=${SERVICE_PASSWORD:-$ADMIN_PASSWORD}
export SERVICE_TOKEN=${SERVICE_TOKEN:-"999888777666"}
export SERVICE_ENDPOINT=${SERVICE_ENDPOINT:-"http://192.168.56.2:35357/v2.0"}
SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-"service"}
SERVICE_EXT_HOST=192.168.56.2
SERVICE_HOST=192.168.1.2
function 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)
DEMO_TENANT=$(get_id keystone tenant-create --name=demo)
# Users
# -----
ADMIN_USER=$(get_id keystone user-create --name=admin --pass="$ADMIN_PASSWORD" --email=admin@example.com)
DEMO_USER=$(get_id keystone user-create --name=demo --pass="$ADMIN_PASSWORD" --email=demo@example.com)
NOVA_USER=$(get_id keystone user-create --name=nova --pass="$SERVICE_PASSWORD" --tenant_id $SERVICE_TENANT --email=nova@example.com)
GLANCE_USER=$(get_id keystone user-create --name=glance --pass="$SERVICE_PASSWORD" --tenant_id $SERVICE_TENANT --email=glance@example.com)
QUANTUM_USER=$(get_id keystone user-create --name=quantum --pass="$SERVICE_PASSWORD" --tenant_id $SERVICE_TENANT --email=quantum@example.com)
CINDER_USER=$(get_id keystone user-create --name=cinder --pass="$SERVICE_PASSWORD" --tenant_id $SERVICE_TENANT --email=cinder@example.com)
# Roles
# -----
ADMIN_ROLE=$(get_id keystone role-create --name=admin)
MEMBER_ROLE=$(get_id keystone role-create --name=Member)
# 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 $ADMIN_ROLE --tenant_id $DEMO_TENANT
keystone user-role-add --user_id $DEMO_USER --role_id $MEMBER_ROLE --tenant_id $DEMO_TENANT
keystone user-role-add --user_id $NOVA_USER --role_id $ADMIN_ROLE --tenant_id $SERVICE_TENANT
keystone user-role-add --user_id $GLANCE_USER --role_id $ADMIN_ROLE --tenant_id $SERVICE_TENANT
keystone user-role-add --user_id $QUANTUM_USER --role_id $ADMIN_ROLE --tenant_id $SERVICE_TENANT
keystone user-role-add --user_id $CINDER_USER --role_id $ADMIN_ROLE --tenant_id $SERVICE_TENANT
# Services
# --------
KEYSTONE_SERVICE=$(get_id keystone service-create --name=keystone --type=identity --description="Keystone Identity Service")
NOVA_SERVICE=$(get_id keystone service-create --name=nova --type=compute --description="Nova Compute Service")
GLANCE_SERVICE=$(get_id keystone service-create --name=glance --type=image --description="Glance Image Service")
QUANTUM_SERVICE=$(get_id keystone service-create --name=quantum --type=network --description="Quantum Service")
EC2_SERVICE=$(get_id keystone service-create --name=ec2 --type=ec2 --description="EC2 Compatibility Layer")
CINDER_SERVICE=$(get_id keystone service-create --name=cinder --type=volume --description="Cinder Service")
#
# Endpoint
#
# KeyStone
keystone endpoint-create \
--region RegionOne \
--service_id $KEYSTONE_SERVICE \
--publicurl "http://$SERVICE_EXT_HOST:\$(public_port)s/v2.0" \
--adminurl "http://$SERVICE_HOST:\$(admin_port)s/v2.0" \
--internalurl "http://$SERVICE_HOST:\$(public_port)s/v2.0"
# Nova
keystone endpoint-create \
--region RegionOne \
--service_id $NOVA_SERVICE \
--publicurl "http://$SERVICE_EXT_HOST:\$(compute_port)s/v2/\$(tenant_id)s" \
--adminurl "http://$SERVICE_HOST:\$(compute_port)s/v2/\$(tenant_id)s" \
--internalurl "http://$SERVICE_HOST:\$(compute_port)s/v2/\$(tenant_id)s"
# Glance
keystone endpoint-create \
--region RegionOne \
--service_id $GLANCE_SERVICE \
--publicurl "http://$SERVICE_EXT_HOST:9292" \
--adminurl "http://$SERVICE_HOST:9292" \
--internalurl "http://$SERVICE_HOST:9292"
keystone endpoint-create \
--region RegionOne \
--service_id $QUANTUM_SERVICE \
--publicurl "http://$SERVICE_EXT_HOST:9696/" \
--adminurl "http://$SERVICE_HOST:9696/" \
--internalurl "http://$SERVICE_HOST:9696/"
# EC2
keystone endpoint-create \
--region RegionOne \
--service_id $EC2_SERVICE \
--publicurl "http://$SERVICE_EXT_HOST:8773/services/Cloud" \
--adminurl "http://$SERVICE_HOST:8773/services/Admin" \
--internalurl "http://$SERVICE_HOST:8773/services/Cloud"
keystone endpoint-create \
--region RegionOne \
--service_id $CINDER_SERVICE \
--publicurl "http://$SERVICE_EXT_HOST:8776/v1/\$(tenant_id)s" \
--adminurl "http://$SERVICE_HOST:8776/v1/\$(tenant_id)s" \
--internalurl "http://$SERVICE_HOST:8776/v1/\$(tenant_id)s"
$ chmod 755 ~/keystone_data.sh
$ ~/keystone_data.sh
各種コマンドを利用するため、以下の環境変数を設定します。
OS_TENANT_ID の値は事前に確認するか、OS_TENANT_ID 以外の環境変数設定後に確認します。
・事前に demoテナント の ID を控える場合
$ keystone --endpoint http://192.168.56.2:35357/v2.0 --token 999888777666 tenant-list | grep demo
・OS_TENANT_ID 以外の環境変数設定後に demoテナント の ID を控える場合
$ . ~/openrc && keystone tenant-list | grep demo
$ vim ~/openrc
export SERVICE_TOKEN=999888777666
export SERVICE_ENDPOINT=http://192.168.56.2:35357/v2.0
export OS_NO_CACHE=True
export OS_AUTH_USER=glance
export OS_AUTH_KEY=y7u8i9YUI
export OS_AUTH_TENANT=service
export OS_STRATEGY=keystone
export OS_AUTH_STRATEGY=keystone
export OS_AUTH_URL=http://192.168.56.2:5000/v2.0
export OS_TENANT_NAME=demo
export OS_TENANT_ID=d68c460105a0434ca0264e1c1e5545c3 # <-- ここにさっきの値を設定
export OS_USERNAME=demo
export OS_PASSWORD=y7u8i9YUI
export OS_REGION_NAME=RegionOne
環境変数を読み込み Keystone の動作を確認します。
$ . ~/openrc
$ keystone tenant-list
+----------------------------------+---------+---------+
| id | name | enabled |
+----------------------------------+---------+---------+
| a36c7b79483e4f78a4bd65f1a585d962 | service | True |
| c2b50fbf7d3a4295bff0181c1d356897 | admin | True |
| d68c460105a0434ca0264e1c1e5545c3 | demo | True |
+----------------------------------+---------+---------+
$ curl http://192.168.1.2:35357/v2.0/endpoints -H 'x-auth-token: 999888777666' | python -mjson.tool
{
"endpoints": [
{
"adminurl": "http://192.168.1.2:9696/",
"id": "31194ff880ec4e1ea45325e64f9c4d91",
"internalurl": "http://192.168.1.2:9696/",
"publicurl": "http://192.168.56.2:9696/",
"region": "RegionOne",
"service_id": "0ec055f9c8214cb8888b1227f0bb28db"
},
{
"adminurl": "http://192.168.1.2:8773/services/Admin",
"id": "7cd73d9418034e1cac1ede81be9c713f",
"internalurl": "http://192.168.1.2:8773/services/Cloud",
"publicurl": "http://192.168.56.2:8773/services/Cloud",
"region": "RegionOne",
"service_id": "35b8355deb51447d9480cf25c2cec44c"
},
{
"adminurl": "http://192.168.1.2:$(admin_port)s/v2.0",
"id": "985cf9dcccdc4f708a69df74bea9c99d",
"internalurl": "http://192.168.1.2:$(public_port)s/v2.0",
"publicurl": "http://192.168.56.2:$(public_port)s/v2.0",
"region": "RegionOne",
"service_id": "aa6eef48d17c4a2e96a69f986a8221a7"
},
{
"adminurl": "http://192.168.1.2:9292",
"id": "d6d512eb82e04c4d95569a28c39a962e",
"internalurl": "http://192.168.1.2:9292",
"publicurl": "http://192.168.56.2:9292",
"region": "RegionOne",
"service_id": "96f06db6ba8749f5bcfabd501ffaf440"
},
{
"adminurl": "http://192.168.1.2:8776/v1/$(tenant_id)s",
"id": "d7bec1fd8c014e148ca3881a5a242d82",
"internalurl": "http://192.168.1.2:8776/v1/$(tenant_id)s",
"publicurl": "http://192.168.56.2:8776/v1/$(tenant_id)s",
"region": "RegionOne",
"service_id": "34c3393042a84c3fa39ac8cec6c00d8a"
},
{
"adminurl": "http://192.168.1.2:$(compute_port)s/v2/$(tenant_id)s",
"id": "f06765f1d9d04c2a900f8f0a2216bb7f",
"internalurl": "http://192.168.1.2:$(compute_port)s/v2/$(tenant_id)s",
"publicurl": "http://192.168.56.2:$(compute_port)s/v2/$(tenant_id)s",
"region": "RegionOne",
"service_id": "e65762b5121a46589b25411994d872af"
}
]
}
イメージ管理サービス Glance をインストールします。
$ sudo apt-get -y install glance
データベースおよびKeystone連携の設定を行います。
$ sudo vim /etc/glance/glance-api.conf
verbose = True
debug = True
sql_connection = mysql://glance:y7u8i9YUI@127.0.0.1/glance
[keystone_authtoken]
auth_host = 192.168.1.2
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = glance
admin_password = y7u8i9YUI
[paste_deploy]
flavor=keystone
データベースおよびKeystone連携の設定を行います。
$ sudo vim /etc/glance/glance-registry.conf
verbose = True
debug = True
sql_connection = mysql://glance:y7u8i9YUI@127.0.0.1/glance
[keystone_authtoken]
auth_host = 192.168.1.2
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = glance
admin_password = y7u8i9YUI
[paste_deploy]
flavor=keystone
Glance サービスを再起動し、データベースを初期化します。
$ sudo service glance-api restart
$ sudo service glance-registry restart
$ sudo glance-manage db_sync
CirrOS などのイメージを登録します。
(CirrOS)
$ wget https://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-x86_64-disk.img -P /tmp
$ glance image-create --name myFirstImage --is-public true --container-format bare --disk-format qcow2 < /tmp/cirros-0.3.0-x86_64-disk.img
(Ubuntu 12.04)
$ wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img -P /tmp
$ glance image-create --name "Ubutnu 12.04" --is-public=true --container-format=ovf --disk-format=qcow2 < /tmp/precise-server-cloudimg-amd64-disk1.img
(確認)
$ glance image-list
ボリューム管理サービス Cinder をインストールします。
$ sudo apt-get -y install cinder-api cinder-scheduler cinder-volume iscsitarget open-iscsi iscsitarget-dkms python-cinderclient
iSCSI の設定を行います。
$ sudo sed -i 's/false/true/g' /etc/default/iscsitarget
$ sudo service iscsitarget start
$ sudo service open-iscsi start
Keystone 連携用設定を行います。
$ sudo vim /etc/cinder/api-paste.ini
[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
service_protocol = http
service_host = 192.168.1.2
service_port = 5000
auth_host = 192.168.1.2
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = cinder
admin_password = y7u8i9YUI
Cinder の設定を行います。未割当のLVがある場合は VG 名を volume_group に設定することでターゲットとして利用できます。
$ sudo vim /etc/cinder/cinder.conf
[DEFAULT]
rootwrap_config=/etc/cinder/rootwrap.conf
sql_connection = mysql://cinder:y7u8i9YUI@127.0.0.1/cinder
api_paste_confg = /etc/cinder/api-paste.ini
iscsi_helper=ietadm
volume_name_template = volume-%s
volume_group = stack
verbose = True
auth_strategy = keystone
#osapi_volume_listen_port=5900
Cinder データベースを初期化しサービスを再起動ます。
$ sudo cinder-manage db sync
$ sudo service cinder-api restart
$ sudo service cinder-scheduler restart
$ sudo service cinder-volume restart
ネットワーク管理担当 Quantum をインストールします。今回は Open vSwitch と連携します。
$ sudo apt-get -y install quantum-server quantum-plugin-openvswitch
ここでは、接続先データベースの指定 と OVSセクションを編集します。
$ sudo vim /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini
[DATABASE]
sql_connection = mysql://quantum:y7u8i9YUI@127.0.0.1/quantum
[OVS]
tenant_network_type = gre
tunnel_id_ranges = 1:1000
enable_tunneling = True
Keystone 連携用設定を行います。
$ sudo vim /etc/quantum/api-paste.ini
[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
auth_host = 192.168.1.2
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = quantum
admin_password = y7u8i9YUI
仮想マシン管理サービス Nova から nova-compute 以外をインストールします。nova-compute は Compute Node で動作させます。
$ sudo apt-get install -y nova-api nova-cert novnc nova-consoleauth nova-scheduler nova-novncproxy
Keystone 連携用設定を行います。
$ sudo vim /etc/nova/api-paste.ini
[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
auth_host = 192.168.1.2
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = nova
admin_password = y7u8i9YUI
signing_dirname = /tmp/keystone-signing-nova
Nova の基本設定を行います。パk(ry
$ sudo vim /etc/nova/nova.conf
[DEFAULT]
logdir=/var/log/nova
state_path=/var/lib/nova
lock_path=/run/lock/nova
verbose=True
api_paste_config=/etc/nova/api-paste.ini
scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler
s3_host=192.168.1.2
ec2_host=192.168.1.2
ec2_dmz_host=192.168.1.2
rabbit_host=192.168.1.2
cc_host=192.168.1.2
dmz_cidr=169.254.169.254/32
metadata_host=192.168.1.2
metadata_listen=0.0.0.0
nova_url=http://192.168.1.2:8774/v1.1/
sql_connection=mysql://nova:y7u8i9YUI@127.0.0.1/nova
ec2_url=http://192.168.1.2:8773/services/Cloud
root_helper=sudo nova-rootwrap /etc/nova/rootwrap.conf
# Auth
use_deprecated_auth=false
auth_strategy=keystone
keystone_ec2_url=http://192.168.1.2:5000/v2.0/ec2tokens
# Imaging service
glance_api_servers=192.168.1.2:9292
image_service=nova.image.glance.GlanceImageService
# Vnc configuration
novnc_enabled=true
novncproxy_base_url=http://192.168.56.2:6080/vnc_auto.html
novncproxy_port=6080
vncserver_proxyclient_address=192.168.56.2
vncserver_listen=0.0.0.0
# Network settings
network_api_class=nova.network.quantumv2.api.API
quantum_url=http://192.168.1.2:9696
quantum_auth_strategy=keystone
quantum_admin_tenant_name=service
quantum_admin_username=quantum
quantum_admin_password=y7u8i9YUI
quantum_admin_auth_url=http://192.168.1.2:35357/v2.0
libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver
linuxnet_interface_driver=nova.network.linux_net.LinuxOVSInterfaceDriver
firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver
# Compute #
compute_driver=libvirt.LibvirtDriver
# Cinder #
volume_api_class=nova.volume.cinder.API
osapi_volume_listen_port=5900
Nova データベース 初期化後、各種 Nova サービスを再起動します。
$ for NOVA in `ls /etc/init.d/nov*` ; do sudo $NOVA restart ; done
$ sudo nova-manage service list
Binary Host Zone Status State Updated_At
nova-cert srv nova enabled :-) 2013-02-15 02:35:14
nova-consoleauth srv nova enabled :-) 2013-02-15 02:35:14
nova-scheduler srv nova enabled :-) 2013-02-15 02:35:14
WebGUI、Horizon をインストールします。
$ sudo apt-get -y install openstack-dashboard memcached
apt でインストールした Horizon は Ubuntu テーマが設定されています。
素の Horizon が良い場合は以下をコメントアウトします。
$ sudo vim /etc/openstack-dashboard/local_settings.py
#try:
# from ubuntu_theme import *
#except ImportError:
# pass
$ sudo service apache2 restart
$ sudo service memcached restart
http://192.168.56.2/horizon にアクセスすると WebGUI が利用可能になります。
Keystone に作成したユーザでログインをします。
以上