2. Controllerノードのセットアップ

Controllerノードでは以下のインストール/設定を行います。

  • MySQL Server
  • RabbitMQ Server
  • memcached
  • MongoDB
  • Keystone
  • Nova
    • nova-api
    • nova-scheduler
    • nova-conductor
    • nova-spiceproxy
    • nova-consoleauth
  • Glance
    • glance-api
    • glance-registry
  • Cinder
    • cinder-api
    • cinder-scheduler
    • cinder-volume
  • Neutron
    • neutron-server
  • Ceilometer
    • ceilometer-api
    • ceilometer-collector
    • ceilometer-agent-central
    • ceilometer-agent-notification
    • ceilometer-alarm-evaluator
    • ceilometer-alarm-notifier
  • Heat
    • heat-api
    • heat-api-cfn
    • heat-engine
  • Horizon

2.1. ネットワーク設定

/etc/network/interfaces を設定します。

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 192.168.56.131
        netmask 255.255.255.0
        network 192.168.56.0
        broadcast 192.168.56.255

auto eth1
iface eth1 inet static
        address 192.168.5.131
        netmask 255.255.255.0
        network 192.168.5.0
        broadcast 192.168.5.255

auto eth2
iface eth2 inet static
        address 192.168.6.131
        netmask 255.255.255.0
        network 192.168.6.0
        broadcast 192.168.6.255

auto eth3
iface eth3 inet dhcp

2.2. 個別インストールが面倒臭いので一括でインストールしたい人向け

sudo apt-get -y update
sudo apt-get -y upgrade
sudo apt-get -y dist-upgrade
sudo shutdown -r 0
sudo apt-get -y install python-mysqldb python-memcache mysql-server rabbitmq-server memcached python-openstackclient sysstat git ntp
sudo apt-get -y install keystone glance cinder-api cinder-scheduler cinder-volume
sudo apt-get -y install neutron-server openstack-dashboard python-memcache nova-api nova-scheduler nova-conductor nova-consoleauth nova-spiceproxy
sudo apt-get -y install ceilometer-api ceilometer-collector ceilometer-agent-central ceilometer-agent-notification ceilometer-alarm-evaluator ceilometer-alarm-notifier python-ceilometerclient mongodb-server
sudo apt-get -y install heat-api heat-api-cfn heat-engine
sudo dpkg -r openstack-dashboard-ubuntu-theme
sudo mkdir /var/cache/{nova,neutron,cinder}
sudo chown nova:nova /var/cache/nova
sudo chown neutron:neutron /var/cache/neutron
sudo chown cinder:cinder /var/cache/cinder

2.3. パッケージアップデート

インストール前にパッケージのアップデートを行います。

sudo apt-get -y update
sudo apt-get -y upgrade
sudo apt-get -y dist-upgrade
sudo shutdown -r 0

2.4. MySQL

MySQLのインストールと各種設定を行います。

apt-getでMySQLをインストールする際、パスワードを求められます。パスワードを入力してください。

sudo apt-get -y install python-mysqldb mysql-server

外部からMySQLに接続できるようbind portを変更します。

sudo sed -i -e "s/\(^bind-address.*= \).*/\10.0.0.0/" /etc/mysql/my.cnf
sudo service mysql restart

MySQLの初期設定を行います。

mysql_secure_installation

各種データベース及びユーザを作成します。 後でデータベースを作成しても良いですが、面倒なのでここで一気に作成します。

接続元アドレスの許可設定は必要に応じて変更してください。

mysql -uroot -py7u8i9YUI

CREATE DATABASE IF NOT EXISTS cinder CHARACTER SET utf8;
CREATE DATABASE IF NOT EXISTS glance CHARACTER SET utf8;
CREATE DATABASE IF NOT EXISTS keystone CHARACTER SET utf8;
CREATE DATABASE IF NOT EXISTS nova CHARACTER SET latin1;
CREATE DATABASE IF NOT EXISTS neutron CHARACTER SET utf8;
CREATE DATABASE IF NOT EXISTS heat CHARACTER SET latin1;

GRANT ALL PRIVILEGES ON nova.* TO nova@localhost IDENTIFIED BY 'y7u8i9YUI';
GRANT ALL PRIVILEGES ON glance.* TO glance@localhost IDENTIFIED BY 'y7u8i9YUI';
GRANT ALL PRIVILEGES ON keystone.* TO keystone@localhost IDENTIFIED BY 'y7u8i9YUI';
GRANT ALL PRIVILEGES ON cinder.* TO cinder@localhost IDENTIFIED BY 'y7u8i9YUI';
GRANT ALL PRIVILEGES ON neutron.* TO neutron@localhost IDENTIFIED BY 'y7u8i9YUI';
GRANT ALL PRIVILEGES ON heat.* TO heat@localhost IDENTIFIED BY 'y7u8i9YUI';

GRANT ALL PRIVILEGES ON nova.* TO nova@'192.168.5.%' IDENTIFIED BY 'y7u8i9YUI';
GRANT ALL PRIVILEGES ON glance.* TO glance@'192.168.5.%' IDENTIFIED BY 'y7u8i9YUI';
GRANT ALL PRIVILEGES ON keystone.* TO keystone@'192.168.5.%' IDENTIFIED BY 'y7u8i9YUI';
GRANT ALL PRIVILEGES ON cinder.* TO cinder@'192.168.5.%' IDENTIFIED BY 'y7u8i9YUI';
GRANT ALL PRIVILEGES ON neutron.* TO neutron@'192.168.5.%' IDENTIFIED BY 'y7u8i9YUI';
GRANT ALL PRIVILEGES ON heat.* TO heat@'192.168.5.%' IDENTIFIED BY 'y7u8i9YUI';

2.5. RabbitMQ

RabbitMQをインストールします。RabbitMQは起動時、自身のホスト名で名前解決が行えないとエラーになります。

sudo apt-get -y install rabbitmq-server

事前に /etc/hostsを編集するなどし、名前解決が行えるようにしておいてください。

ほとんどのコンポーネントがRabbitMQを使用します。場合によってはRabbitMQを分割する必要があるかもしれません。

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 /keystone
sudo rabbitmqctl add_user cinder y7u8i9YUI
sudo rabbitmqctl set_permissions -p /keystone cinder ".*" ".*" ".*"
sudo rabbitmqctl add_vhost /cinder
sudo rabbitmqctl add_user cinder y7u8i9YUI
sudo rabbitmqctl set_permissions -p /cinder cinder ".*" ".*" ".*"
sudo rabbitmqctl add_vhost /neutron
sudo rabbitmqctl add_user neutron y7u8i9YUI
sudo rabbitmqctl set_permissions -p /neutron neutron ".*" ".*" ".*"
sudo rabbitmqctl delete_user guest
sudo rabbitmqctl add_vhost /ceilometer
sudo rabbitmqctl add_user ceilometer y7u8i9YUI
sudo rabbitmqctl set_permissions -p /ceilometer ceilometer ".*" ".*" ".*"
sudo rabbitmqctl add_vhost /heat
sudo rabbitmqctl add_user heat y7u8i9YUI
sudo rabbitmqctl set_permissions -p /heat heat ".*" ".*" ".*"

sudo rabbitmqctl list_users
sudo rabbitmqctl list_vhosts
sudo rabbitmqctl list_permissions
sudo rabbitmqctl list_user_permissions nova
sudo rabbitmqctl list_user_permissions glance
sudo rabbitmqctl list_user_permissions cinder
sudo rabbitmqctl list_user_permissions keystone
sudo rabbitmqctl list_user_permissions neutron
sudo rabbitmqctl list_user_permissions ceilometer
sudo rabbitmqctl list_user_permissions heat

2.6. NTP

各ノードの時刻がずれているとNova等サービスが正常に動作しません。時刻同期のため、NTP を使用します。

sudo apt-get -y install ntp

時刻同期先に任意のサーバを指定し、NTP を再起動します。

参考: NTPの使い方 : インターネットマルチフィード時刻情報サービス for Public

$ sudo vim /etc/ntp.conf

driftfile /var/lib/ntp/ntp.drift

statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable

server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp

restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery

restrict 127.0.0.1
restrict ::1

disable monitor

$ sudo service ntp restart

2.7. memcached

memcachedをインストールします。memcachedはKeystoneのTokenのストアなどに使用します。

sudo apt-get -y install memcached python-memcache

他のサーバからmemcachedに接続できるよう待ち受けインタフェースを変更します。

sudo sed -i -e "s/\(^-l \).*/\1192.168.5.131/g" /etc/memcached.conf
sudo service memcached restart

2.8. Keystone

Keystoneをインストールします。

sudo apt-get -y install keystone python-openstackclient

2.8.1. /etc/keystone/keystone.conf

/etc/keystone/keystone.conf を編集します。

設定後、データベースのイニシャライズとサービスの再起動を行います。

sudo vim /etc/keystone/keystone.conf

設定サンプル

[DEFAULT]
admin_token=999888777666
public_bind_host=0.0.0.0
admin_bind_host=0.0.0.0
compute_port=8774
admin_port=35357
public_port=5000
public_endpoint=http://localhost:%(public_port)s/
admin_endpoint=http://localhost:%(admin_port)s/
member_role_id=9fe2ff9ee4384b1894a90878d3e92bab
member_role_name=_member_
rabbit_host=192.168.5.131
rabbit_port=5672
rabbit_hosts=$rabbit_host:$rabbit_port
rabbit_use_ssl=false
rabbit_userid=keystone
rabbit_password=y7u8i9YUI
rabbit_login_method=AMQPLAIN
rabbit_virtual_host=/keystone
rabbit_ha_queues=false
rpc_backend=rabbit
control_exchange=openstack
keystone_ec2_url=http://localhost:5000/v2.0/ec2tokens
debug=true
verbose=true
use_stderr=true
log_dir=/var/log/keystone
use_syslog=false

[assignment]
driver=keystone.assignment.backends.sql.Assignment

[auth]
methods=external,password,token
password=keystone.auth.plugins.password.Password
token=keystone.auth.plugins.token.Token

[cache]

[catalog]
driver=keystone.catalog.backends.sql.Catalog

[credential]
driver=keystone.credential.backends.sql.Credential

[database]
connection = mysql://keystone:y7u8i9YUI@localhost/keystone?charset=utf8

[ec2]

[endpoint_filter]

[federation]

[identity]
default_domain_id=default
driver=keystone.identity.backends.sql.Identity

[kvs]

[ldap]

[matchmaker_ring]

[memcache]
servers=192.168.5.131:11211

[oauth1]

[os_inherit]

[paste_deploy]

[policy]
driver=keystone.policy.backends.sql.Policy

[revoke]

[signing]
token_format=UUID

[ssl]

[stats]

[token]
driver=keystone.token.backends.memcache.Token

[trust]
driver=keystone.trust.backends.sql.Trust

[extra_headers]
Distribution = Ubuntu

2.8.2. Keystone.confパラメータ適当に解説

  • [DEFAULT]
パラメータ 説明
admin_token 管理者用トークン。これが漏れたら即死する
public_bind_host パブリックサービスを待ち受けるインタフェースのIPアドレス
admin_bind_host 管理サービスを待ち受けるインタフェースのIPアドレス
compute_port Computeサービスの待ち受けポート
admin_port 管理サービスの待ち受けポート
public_port パブリックサービスの待ち受けポート
public_endpoint ベースパブリックエンドポイントのURL。管理者トークンを利用する場合などにこれを利用するだったと思う。
admin_endpoint ベース管理者エンドポイントのURL。管理者トークンを利用する場合などにこれを利用するだったと思う。
member_role_id keystone-manage db_syncをした時に作成されるMEMBER ROLEのID。変更しないと全世界共通
member_role_name keystone-manage db_syncをした時に作成されるMEMBER ROLEの名前。変更しない方が無難
rabbit_host 接続するRabbitMQのIPアドレスもしくは名前
rabbit_port 接続するRabbitMQのPort番号
rabbit_use_ssl RabbitMQの接続にSSLを使用する
rabbit_userid RabbitMQに接続可能なユーザID
rabbit_password RabbitMQに接続可能なユーザIDのパスワード
rabbit_virtual_host RabbitMQに接続可能なvhost
rabbit_ha_queues HA queuesを使用する
rpc_backend RPCサービスに使用するサービス名
keystone_ec2_url EC2リクエストからトークンを取得するためのURL
debug デバッグログを有効化
verbose 冗長なログを有効化
log_dir ログ出力ディレクトリを指定
use_syslog ログ出力にSyslogを利用する
  • [assignment]
パラメータ 説明
driver Keystone Assignment backend driver.
  • [database]
パラメータ 説明
connection Keystoneデータを保存するデータベースの接続情報
  • [memcache]
パラメータ 説明
servers Tokenを保存するmemcachedのアドレス:ポート
  • [token]
パラメータ 説明
driver Tokenの保存のバックエンドドライバを指定する。

2.8.3. Keystoneデータベースのイニシャライズとサービスの再起動

設定後、データベースのイニシャライズとサービスの再起動を行います。

sudo keystone-manage db_sync
sudo service keystone restart

2.8.4. Keystone初期データの投入

Keystoneの設定/データベースのイニシャライズ/再起動を完了が終わったら管理者ユーザの設定やサービスの登録等のKeystone初期データを投入します。

Keystoneには大きく分けて2つの情報を登録します。

  • ユーザ管理
    • ドメイン
    • グループ
    • プロジェクト
    • ユーザ
    • ロール
  • サービス
    • サービス
    • エンドポイント

サンプルをgistから取得し、各種情報を編集した後、初期データを投入します。

cd ~
wget https://gist.githubusercontent.com/ishikawa84g/b769460ba6f38fc24cfd/raw/ad101d6dba95d61c6fd7a7d45496406a9ec449b4/keystone_data.sh
vim ~/keystone_data.sh
chmod 755 keystone_data.sh
./keystone_data.sh

本環境では次のように編集をし、データを投入します。

#!/bin/bash

# -----------
# Defaults
# -----------

SERVICE_PROJECT=service
ADMIN_PROJECT=admin
DEMO_PROJECT=demo

ADMIN_ROLE=admin
MEMBER_ROLE=_member_
HEAT_OWNER_ROLE=heat_stack_owner

# SERVIVCE PASSWORD
ADMIN_PASSWORD=y7u8i9YUI
DEMO_PASSWORD=y7u8i9YUI
NOVA_PASSWORD=y7u8i9YUI
GLANCE_PASSWORD=y7u8i9YUI
CINDER_PASSWORD=y7u8i9YUI
NEUTRON_PASSWORD=y7u8i9YUI
CEILOMETER_PASSWORD=y7u8i9YUI
HEAT_PASSWORD=y7u8i9YUI

# SERVICE USER
ADMIN_USER=admin
DEMO_USER=demo
NOVA_USER=nova
GLANCE_USER=glance
CINDER_USER=cinder
NEUTRON_USER=neutron
CEILOMETER_USER=ceilometer
HEAT_USER=heat

# E-MAIL ADDRESS
ADMIN_EMAIL=admin@localhost.localdomain
DEMO_EMAIL=demo@localhost.localdomain
NOVA_EMAIL=nova@localhost.localdomain
GLANCE_EMAIL=glance@localhost.localdomain
CINDER_EMAIL=cinder@localhost.localdomain
NEUTRON_EMAIL=neutron@localhost.localdomain
CEILOMETER_EMAIL=ceilometer@localhost.localdomain
HEAT_EMAIL=heat@localhost.localdomain

# SERVICE PROTOCOL
NOVA_PUBLIC_SERVICE_PROTOCOL=http
NOVA_ADMIN_SERVICE_PROTOCOL=http
NOVA_INTERNAL_SERVICE_PROTOCOL=http
EC2_PUBLIC_SERVICE_PROTOCOL=http
EC2_ADMIN_SERVICE_PROTOCOL=http
EC2_INTERNAL_SERVICE_PROTOCOL=http
GLANCE_PUBLIC_SERVICE_PROTOCOL=http
GLANCE_ADMIN_SERVICE_PROTOCOL=http
GLANCE_INTERNAL_SERVICE_PROTOCOL=http
KEYSTONE_PUBLIC_SERVICE_PROTOCOL=http
KEYSTONE_ADMIN_SERVICE_PROTOCOL=http
KEYSTONE_INTERNAL_SERVICE_PROTOCOL=http
CINDER_PUBLIC_SERVICE_PROTOCOL=http
CINDER_ADMIN_SERVICE_PROTOCOL=http
CINDER_INTERNAL_SERVICE_PROTOCOL=http
NEUTRON_PUBLIC_SERVICE_PROTOCOL=http
NEUTRON_ADMIN_SERVICE_PROTOCOL=http
NEUTRON_INTERNAL_SERVICE_PROTOCOL=http
CEILOMETER_PUBLIC_SERVICE_PROTOCOL=http
CEILOMETER_ADMIN_SERVICE_PROTOCOL=http
CEILOMETER_INTERNAL_SERVICE_PROTOCOL=http
HEAT_API_PUBLIC_SERVICE_PROTOCOL=http
HEAT_API_ADMIN_SERVICE_PROTOCOL=http
HEAT_API_INTERNAL_SERVICE_PROTOCOL=http
HEAT_CFN_PUBLIC_SERVICE_PROTOCOL=http
HEAT_CFN_ADMIN_SERVICE_PROTOCOL=http
HEAT_CFN_INTERNAL_SERVICE_PROTOCOL=http

# SERVICE PORT
NOVA_COMPUTE_PORT=8774
EC2_PORT=8773
GLANCE_API_PORT=9292
KEYSTONE_PUBLIC_PORT=5000
KEYSTONE_ADMIN_PORT=35357
CINDER_PORT=8776
NEUTRON_PORT=9696
CEILOMETER_PORT=8777
HEAT_API_PORT=8004
HEAT_API_CFN_PORT=8000

# IDENTITY
IDENTITY_API_VERSION=2.0
REGION=RegionOne

# SERVICE HOST ADDRESS
NOVA_PUBLIC_SERVICE_HOST=192.168.56.131
NOVA_ADMIN_SERVICE_HOST=192.168.5.131
NOVA_INTERNAL_SERVICE_HOST=192.168.5.131
EC2_PUBLIC_SERVICE_HOST=192.168.56.131
EC2_ADMIN_SERVICE_HOST=192.168.5.131
EC2_INTERNAL_SERVICE_HOST=192.168.5.131
GLANCE_PUBLIC_SERVICE_HOST=192.168.56.131
GLANCE_ADMIN_SERVICE_HOST=192.168.5.131
GLANCE_INTERNAL_SERVICE_HOST=192.168.5.131
KEYSTONE_PUBLIC_SERVICE_HOST=192.168.56.131
KEYSTONE_ADMIN_SERVICE_HOST=192.168.5.131
KEYSTONE_INTERNAL_SERVICE_HOST=192.168.5.131
CINDER_PUBLIC_SERVICE_HOST=192.168.56.131
CINDER_ADMIN_SERVICE_HOST=192.168.5.131
CINDER_INTERNAL_SERVICE_HOST=192.168.5.131
NEUTRON_PUBLIC_SERVICE_HOST=192.168.56.131
NEUTRON_ADMIN_SERVICE_HOST=192.168.5.131
NEUTRON_INTERNAL_SERVICE_HOST=192.168.5.131
CEILOMETER_PUBLIC_SERVICE_HOST=192.168.56.131
CEILOMETER_ADMIN_SERVICE_HOST=192.168.5.131
CEILOMETER_INTERNAL_SERVICE_HOST=192.168.5.131
HEAT_API_PUBLIC_SERVICE_HOST=192.168.56.131
HEAT_API_ADMIN_SERVICE_HOST=192.168.5.131
HEAT_API_INTERNAL_SERVICE_HOST=192.168.5.131
HEAT_CFN_PUBLIC_SERVICE_HOST=192.168.56.131
HEAT_CFN_ADMIN_SERVICE_HOST=192.168.5.131
HEAT_CFN_INTERNAL_SERVICE_HOST=192.168.5.131

export OS_TOKEN=999888777666
export OS_URL=http://127.0.0.1:35357/v2.0
# OR openstack --os-token $OS_TOKEN --os-url $OS_URL

# --------------------------------------
# Functions
# --------------------------------------
function get_field {
    while read data; do
        if [ "$1" -lt 0 ]; then
            field="(\$(NF$1))"
        else
            field="\$$(($1 + 1))"
        fi
        echo "$data" | awk -F'[ \t]*\\|[ \t]*' "{print $field}"
    done
}

# --------------------------------------
# Roles
# --------------------------------------
openstack role create $ADMIN_ROLE
#openstack role create $MEMBER_ROLE

# --------------------------------------
# Projects
# --------------------------------------
openstack project create $ADMIN_PROJECT
openstack project create $DEMO_PROJECT
openstack project create $SERVICE_PROJECT

# --------------------------------------
# Users
# --------------------------------------
openstack user create --project $ADMIN_PROJECT --email $ADMIN_EMAIL --password $ADMIN_PASSWORD $ADMIN_USER
openstack user create --project $DEMO_PROJECT  --email $DEMO_EMAIL  --password $DEMO_PASSWORD  $DEMO_USER

# --------------------------------------
# Service Users
# --------------------------------------
openstack user create --password $NOVA_PASSWORD       --project $SERVICE_PROJECT --email $NOVA_EMAIL       $NOVA_USER
openstack user create --password $GLANCE_PASSWORD     --project $SERVICE_PROJECT --email $GLANCE_EMAIL     $GLANCE_USER
openstack user create --password $CINDER_PASSWORD     --project $SERVICE_PROJECT --email $CINDER_EMAIL     $CINDER_USER
openstack user create --password $NEUTRON_PASSWORD    --project $SERVICE_PROJECT --email $NEUTRON_EMAIL    $NEUTRON_USER
openstack user create --password $CEILOMETER_PASSWORD --project $SERVICE_PROJECT --email $CEILOMETER_EMAIL $CEILOMETER_USER
openstack user create --password $HEAT_PASSWORD       --project $SERVICE_PROJECT --email $HEAT_EMAIL       $HEAT_USER

# --------------------------------------
# Role add
# --------------------------------------
openstack role add --project $ADMIN_PROJECT   --user $ADMIN_USER      $ADMIN_ROLE
openstack role add --project $DEMO_PROJECT    --user $ADMIN_USER      $ADMIN_ROLE
#openstack role add --project $DEMO_PROJECT    --user $DEMO_USER       $MEMBER_ROLE

openstack role add --project $SERVICE_PROJECT --user $NOVA_USER       $ADMIN_ROLE
openstack role add --project $SERVICE_PROJECT --user $GLANCE_USER     $ADMIN_ROLE
openstack role add --project $SERVICE_PROJECT --user $CINDER_USER     $ADMIN_ROLE
openstack role add --project $SERVICE_PROJECT --user $NEUTRON_USER    $ADMIN_ROLE
openstack role add --project $SERVICE_PROJECT --user $CEILOMETER_USER $ADMIN_ROLE
openstack role add --project $SERVICE_PROJECT --user $HEAT_USER       $ADMIN_ROLE

# --------------------------------------
# Service
# --------------------------------------
openstack service create --type=compute   --description="Nova Compute Service"        nova
openstack service create --type=computev3 --description="Nova Compute Service V3"     novav3
openstack service create --type ec2       --description "EC2 Compatibility Layer"     ec2
openstack service create --type image     --description "Glance Image Service"        glance
openstack service create --type identity  --description "Keystone Identity Service"   keystone
openstack service create --type=volume    --description="Cinder Volume Service"       cinder
openstack service create --type=volumev2  --description="Cinder Volume Service V2"    cinderv2
openstack service create --type=network   --description="Neutron Service"             neutron
openstack service create --type=metering  --description="OpenStack Telemetry Service" ceilometer

HEAT_SERVICE=$(openstack service create --type=orchestration --description="Heat Orchestration Service" heat | grep " id " | get_field 2)
HEAT_CFN_SERVICE=$(openstack service create --type=cloudformation --description="Heat CloudFormation Service" heat | grep " id " | get_field 2)

# --------------------------------------
# Endpoint
# --------------------------------------

# Nova
openstack endpoint create \
    --region $REGION \
    --publicurl "${NOVA_PUBLIC_SERVICE_PROTOCOL}://${NOVA_PUBLIC_SERVICE_HOST}:${NOVA_COMPUTE_PORT}/v2/\$(tenant_id)s" \
    --adminurl "${NOVA_ADMIN_SERVICE_PROTOCOL}://${NOVA_ADMIN_SERVICE_HOST}:${NOVA_COMPUTE_PORT}/v2/\$(tenant_id)s" \
    --internalurl "${NOVA_INTERNAL_SERVICE_PROTOCOL}://${NOVA_INTERNAL_SERVICE_HOST}:${NOVA_COMPUTE_PORT}/v2/\$(tenant_id)s" \
    nova

openstack endpoint create $NOVA_V3_SERVICE \
    --region $REGION \
    --publicurl "${NOVA_PUBLIC_SERVICE_PROTOCOL}://${NOVA_PUBLIC_SERVICE_HOST}:${NOVA_COMPUTE_PORT}/v3" \
    --adminurl "${NOVA_ADMIN_SERVICE_PROTOCOL}://${NOVA_ADMIN_SERVICE_HOST}:${NOVA_COMPUTE_PORT}/v3" \
    --internalurl "${NOVA_INTERNAL_SERVICE_PROTOCOL}://${NOVA_INTERNAL_SERVICE_HOST}:${NOVA_COMPUTE_PORT}/v3" \
    novav3

# EC2
openstack endpoint create \
    --region $REGION \
    --publicurl "${EC2_PUBLIC_SERVICE_PROTOCOL}://${EC2_PUBLIC_SERVICE_HOST}:${EC2_PORT}/services/Cloud" \
    --adminurl "${EC2_INTERNAL_SERVICE_PROTOCOL}://${EC2_ADMIN_SERVICE_HOST}:${EC2_PORT}/services/Admin" \
    --internalurl "${EC2_ADMIN_SERVICE_PROTOCOL}://${EC2_INTERNAL_SERVICE_HOST}:${EC2_PORT}/services/Cloud" \
    ec2

# Glance
openstack endpoint create \
    --region $REGION \
    --publicurl "${GLANCE_PUBLIC_SERVICE_PROTOCOL}://${GLANCE_PUBLIC_SERVICE_HOST}:${GLANCE_API_PORT}" \
    --adminurl "${GLANCE_ADMIN_SERVICE_PROTOCOL}://${GLANCE_INTERNAL_SERVICE_HOST}:${GLANCE_API_PORT}" \
    --internalurl "${GLANCE_INTERNAL_SERVICE_PROTOCOL}://${GLANCE_ADMIN_SERVICE_HOST}:${GLANCE_API_PORT}" \
    glance

# Keystone
openstack endpoint create \
    --region $REGION \
    --publicurl "${KEYSTONE_PUBLIC_SERVICE_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_PORT}/v${IDENTITY_API_VERSION}" \
    --adminurl "${KEYSTONE_ADMIN_SERVICE_PROTOCOL}://${KEYSTONE_INTERNAL_SERVICE_HOST}:${KEYSTONE_ADMIN_PORT}/v${IDENTITY_API_VERSION}" \
    --internalurl "${KEYSTONE_INTERNAL_SERVICE_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_PUBLIC_PORT}/v${IDENTITY_API_VERSION}" \
    keystone

# Cinder
openstack endpoint create \
    --region $REGION \
    --publicurl "${CINDER_PUBLIC_SERVICE_PROTOCOL}://${CINDER_PUBLIC_SERVICE_HOST}:${CINDER_PORT}/v1/\$(tenant_id)s" \
    --adminurl "${CINDER_ADMIN_SERVICE_PROTOCOL}://${CINDER_ADMIN_SERVICE_HOST}:${CINDER_PORT}/v1/\$(tenant_id)s" \
    --internalurl "${CINDER_INTERNAL_SERVICE_PROTOCOL}://${CINDER_INTERNAL_SERVICE_HOST}:${CINDER_PORT}/v1/\$(tenant_id)s" \
    cinder

openstack endpoint create \
    --region $REGION \
    --publicurl "${CINDER_PUBLIC_SERVICE_PROTOCOL}://${CINDER_PUBLIC_SERVICE_HOST}:${CINDER_PORT}/v2/\$(tenant_id)s" \
    --adminurl "${CINDER_ADMIN_SERVICE_PROTOCOL}://${CINDER_ADMIN_SERVICE_HOST}:${CINDER_PORT}/v2/\$(tenant_id)s" \
    --internalurl "${CINDER_INTERNAL_SERVICE_PROTOCOL}://${CINDER_INTERNAL_SERVICE_HOST}:${CINDER_PORT}/v2/\$(tenant_id)s" \
    cinderv2

# Neutron
openstack endpoint create \
    --region $REGION \
    --publicurl "${NEUTRON_PUBLIC_SERVICE_PROTOCOL}://${NEUTRON_PUBLIC_SERVICE_HOST}:${NEUTRON_PORT}" \
    --adminurl "${NEUTRON_ADMIN_SERVICE_PROTOCOL}://${NEUTRON_INTERNAL_SERVICE_HOST}:${NEUTRON_PORT}" \
    --internalurl "${NEUTRON_INTERNAL_SERVICE_PROTOCOL}://${NEUTRON_ADMIN_SERVICE_HOST}:${NEUTRON_PORT}" \
    neutron

# Ceilometer
openstack endpoint create \
    --region $REGION \
    --publicurl "$CEILOMETER_PUBLIC_SERVICE_PROTOCOL://$CEILOMETER_PUBLIC_SERVICE_HOST:$CEILOMETER_PORT/" \
    --adminurl "$CEILOMETER_ADMIN_SERVICE_PROTOCOL://$CEILOMETER_ADMIN_SERVICE_HOST:$CEILOMETER_PORT/" \
    --internalurl "$CEILOMETER_INTERNAL_SERVICE_PROTOCOL://$CEILOMETER_INTERNAL_SERVICE_HOST:$CEILOMETER_PORT/" \
    ceilometer

# Heat
openstack endpoint create  \
    --region $REGION \
    --publicurl "$HEAT_API_PUBLIC_SERVICE_PROTOCOL://$HEAT_API_PUBLIC_SERVICE_HOST:$HEAT_API_PORT/v1/\$(tenant_id)s" \
    --adminurl "$HEAT_API_ADMIN_SERVICE_PROTOCOL://$HEAT_API_ADMIN_SERVICE_HOST:$HEAT_API_PORT/v1/\$(tenant_id)s" \
    --internalurl "$HEAT_API_INTERNAL_SERVICE_PROTOCOL://$HEAT_API_INTERNAL_SERVICE_HOST:$HEAT_API_PORT/v1/\$(tenant_id)s" \
    $HEAT_SERVICE

openstack endpoint create \
    --region $REGION \
    --publicurl "$HEAT_CFN_PUBLIC_SERVICE_PROTOCOL://$HEAT_CFN_PUBLIC_SERVICE_HOST:$HEAT_API_CFN_PORT/v1" \
    --adminurl "$HEAT_CFN_ADMIN_SERVICE_PROTOCOL://$HEAT_CFN_ADMIN_SERVICE_HOST:$HEAT_API_CFN_PORT/v1" \
    --internalurl "$HEAT_CFN_INTERNAL_SERVICE_PROTOCOL://$HEAT_CFN_INTERNAL_SERVICE_HOST:$HEAT_API_CFN_PORT/v1" \
    $HEAT_CFN_SERVICE

# --------------------------------------
# EC2 Credentials ?
# --------------------------------------
#openstack ec2 credentials create --user nova --project $SERVICE_PROJECT -f shell -c access -c secret

# --------------------------------------
# deferred_auth_method = trusts ?
# --------------------------------------
openstack role create $HEAT_OWNER_ROLE
openstack role add $HEAT_OWNER_ROLE --project $DEMO_PROJECT  --user $DEMO_USER
openstack role add $HEAT_OWNER_ROLE --project $DEMO_PROJECT  --user $ADMIN_USER
openstack role add $HEAT_OWNER_ROLE --project $ADMIN_PROJECT --user $ADMIN_USER

#KS_ENDPOINT_V3="$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v3"
#D_ID=$(openstack --os-token $OS_TOKEN --os-url=$KS_ENDPOINT_V3 --os-identity-api-version=3 domain create heat --description "Owns users and projects created by heat" | grep ' id ' | get_field 2)
#openstack --os-token $OS_TOKEN --os-url=$KS_ENDPOINT_V3 --os-identity-api-version=3 user create --password $SERVICE_PASSWORD --domain $D_ID heat_domain_admin --description "Manages users and projects created by heat"
#openstack --os-token $OS_TOKEN --os-url=$KS_ENDPOINT_V3 --os-identity-api-version=3 role add --user heat_domain_admin --domain ${D_ID} admin

2.8.5. Keystone操作用環境変数ファイル

Keystoneを簡易に操作するため、環境設定ファイルを作成しておきます。

$ cat > ~/openrc << EOF
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=y7u8i9YUI
export OS_AUTH_URL=http://192.168.5.131:5000/v2.0
export OS_REGION_NAME=RegionOne
EOF

$ source ~/openrc
$ keystone user-list
+----------------------------------+------------+---------+----------------------------------+
|                id                |    name    | enabled |              email               |
+----------------------------------+------------+---------+----------------------------------+
| fb56a9b9a8f24f2b9653d1c5d8cd15af |   admin    |   True  |   admin@localhost.localdomain    |
| e203a5bad2254e1abc5634fa07bc9b8d | ceilometer |   True  | ceilometer@localhost.localdomain |
| 613883931ea6418faab9fed25fe2d948 |   cinder   |   True  |   cinder@localhost.localdomain   |
| e9c6d9deb76f4f37955c916a2d016c06 |    demo    |   True  |    demo@localhost.localdomain    |
| d984f874be2f41918be0363711d34626 |   glance   |   True  |   glance@localhost.localdomain   |
| 2acb0d970a9249cb8c8dfde73474f48a |    heat    |   True  |    heat@localhost.localdomain    |
| aaab14aee91f448bad02a63f8ec2d4b4 |  neutron   |   True  |  neutron@localhost.localdomain   |
| afd51d8fef264310a3f3d945dc20086f |    nova    |   True  |    nova@localhost.localdomain    |
+----------------------------------+------------+---------+----------------------------------+

2.9. Glance

Glanceをインストールします。

sudo apt-get -y install glance

/etc/glance/glance-api.conf, /etc/glance/glance-registry.confを編集します。

v2 API では glance-registry要らないって聞いたんだけどいるの?

2.9.1. Glance API

/etc/glance/glance-api.conf を編集します。

sudo vim /etc/glance/glance-api.conf

設定サンプル

[DEFAULT]
verbose = True
debug = True
default_store = file
bind_host = 0.0.0.0
bind_port = 9292
log_file = /var/log/glance/api.log
backlog = 4096
data_api = glance.db.sqlalchemy.api
workers = 1
admin_role = admin
allow_anonymous_access = False
enable_v1_api = True
enable_v2_api = True
container_formats=ami,ari,aki,bare,ovf,ova
disk_formats=ami,ari,aki,vhd,vmdk,raw,qcow2,vdi,iso
use_syslog = False
registry_host = 0.0.0.0
registry_port = 9191
registry_client_protocol = http
db_auto_create = False
sqlalchemy_debug = True
notifier_strategy = messaging
notification_driver = rabbit
rabbit_host = 192.168.5.131
rabbit_port = 5672
rabbit_use_ssl = false
rabbit_userid = glance
rabbit_password = y7u8i9YUI
rabbit_virtual_host = /glance
rabbit_notification_exchange = glance
rabbit_notification_topic = notifications
rabbit_durable_queues = False
filesystem_store_datadir = /var/lib/glance/images/
delayed_delete = False
scrub_time = 43200
scrubber_datadir = /var/lib/glance/scrubber
image_cache_dir = /var/lib/glance/image-cache/

[database]
backend = sqlalchemy
connection = mysql://glance:y7u8i9YUI@localhost/glance?charset=utf8

[keystone_authtoken]
auth_host = 192.168.5.131
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = glance
admin_password = y7u8i9YUI

[paste_deploy]
flavor = keystone

[store_type_location_strategy]

2.9.2. glance-api.confパラメータ適当に解説

  • [DEFAULT]
パラメータ 説明
debug デバッグログを有効化
verbose 冗長なログを有効化
default_store イメージのデフォルトの保存先を指定
bind_host APIサーバーが待ち受けるアドレス
bind_port APIサーバーが待ち受けるポート番号
workers worker数
registry_host Registryサーバが待ち受けるアドレス
registry_port Registryサーバが待ち受けるポート番号
notification_driver RPCサービスに使用するドライバ名
rabbit_host 接続するRabbitMQのIPアドレスもしくは名前
rabbit_port 接続するRabbitMQのPort番号
rabbit_use_ssl RabbitMQの接続にSSLを使用する
rabbit_userid RabbitMQに接続可能なユーザID
rabbit_password RabbitMQに接続可能なユーザIDのパスワード
rabbit_virtual_host RabbitMQに接続可能なvhost
rabbit_durable_queues Durable queuesを使用する
rabbit_notification_exchange rabbit strategyを使用している場合に使用
rabbit_notification_topic rabbit strategyを使用している場合に使用
filesystem_store_datadir File storeを利用している場合にイメージを保存するディレクトリ
  • [Database]
パラメータ 説明
connection Glanceデータを保存するデータベースの接続情報
  • [keystone_authtoken]
パラメータ 説明
auth_host 接続するKeystoneのIPアドレスもしくは名前
auth_port 接続するKeystoneのポート番号
auth_protocol 接続プロトコル
admin_tenant_name Keystoneに接続可能なGlanceプロジェクト名
admin_user Keystoneに接続可能なGlanceユーザ名
admin_password Keystoneに接続可能なGlanceユーザのパスワード
  • [paste_deploy]
パラメータ 説明
flavor ペーストセレクション名を指定

2.9.3. Glance Registry

/etc/glance/glance-registry.conf を編集します。

sudo vim /etc/glance/glance-registry.conf

設定サンプル

[DEFAULT]
verbose = True
debug = True
bind_host = 0.0.0.0
bind_port = 9191
log_file = /var/log/glance/registry.log
backlog = 4096
data_api = glance.db.sqlalchemy.api
enable_v1_registry = True
enable_v2_registry = True
api_limit_max = 1000
limit_param_default = 25
admin_role = admin
db_auto_create = False
sqlalchemy_debug = True
use_syslog = False

[database]
backend = sqlalchemy
connection = mysql://glance:y7u8i9YUI@localhost/glance?charset=utf8

[keystone_authtoken]
auth_host = 192.168.5.131
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = glance
admin_password = y7u8i9YUI

[paste_deploy]
flavor = keystone

2.9.4. glance-registry.confパラメータ適当に解説

  • [DEFAULT]
パラメータ 説明
debug デバッグログを有効化
verbose 冗長なログを有効化
default_store イメージのデフォルトの保存先を指定
bind_host Registryサーバーが待ち受けるアドレス
bind_port Registryサーバーが待ち受けるポート番号
  • [Database]
パラメータ 説明
connection Glanceデータを保存するデータベースの接続情報
  • [keystone_authtoken]
パラメータ 説明
auth_host 接続するKeystoneのIPアドレスもしくは名前
auth_port 接続するKeystoneのポート番号
auth_protocol 接続プロトコル
admin_tenant_name Keystoneに接続可能なGlanceプロジェクト名
admin_user Keystoneに接続可能なGlanceユーザ名
admin_password Keystoneに接続可能なGlanceユーザのパスワード
  • [paste_deploy]
パラメータ 説明
flavor ペーストセレクション名を指定

2.9.5. Glanceデータベースの初期化

Glanceデータベースを初期化し、サービスを再起動します。

sudo glance-manage db_sync
sudo service glance-api restart
sudo service glance-registry restart

2.9.6. Glanceイメージの登録

CirrOS などのイメージを登録します。

$ source ~/openrc
$ wget http://cdn.download.cirros-cloud.net/0.3.2/cirros-0.3.2-x86_64-disk.img -P /tmp
$ wget http://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img -P /tmp
$ glance image-create --name "cirros-0.3.2" --is-public=true --container-format=ovf --disk-format=qcow2 < /tmp/cirros-0.3.2-x86_64-disk.img
$ glance image-create --name "Ubuntu 14.04" --is-public=true --container-format=ovf --disk-format=qcow2 < /tmp/trusty-server-cloudimg-amd64-disk1.img
$ glance image-list
+--------------------------------------+--------------+-------------+------------------+-----------+--------+
| ID                                   | Name         | Disk Format | Container Format | Size      | Status |
+--------------------------------------+--------------+-------------+------------------+-----------+--------+
| 3efdaca2-0d36-460c-96aa-255c04fdb46d | cirros-0.3.2 | qcow2       | ovf              | 13167616  | active |
| f635aff2-431b-4f9c-91af-296f9316fb03 | Ubuntu 14.04 | qcow2       | ovf              | 253821440 | active |
+--------------------------------------+--------------+-------------+------------------+-----------+--------+

$ ls -l /var/lib/glance/images/
total 260736
-rw-r----- 1 glance glance  13167616 Jun 12 18:53 3efdaca2-0d36-460c-96aa-255c04fdb46d
-rw-r----- 1 glance glance 253821440 Jun 12 18:53 f635aff2-431b-4f9c-91af-296f9316fb03

2.10. Cinder

Cinderをインストールします。

sudo apt-get -y install cinder-api cinder-scheduler cinder-volume
sudo mkdir /var/cache/cinder
sudo chown cinder:cinder /var/cache/cinder

今回はバックエンドにLVMを使用しますのでLVMを構成していない場合は設定を行います。

VirtualBoxの場合は一度OSを停止し、ディスクを10GB程度追加した後、追加作業を行います。

インストール空き領域を持ったVolume Groupを用意している場合はその領域を使用します。新たにPVやVGを追加する必要はありません。

$ sudo apt-get -y install lvm2
$ sudo pvcreate /dev/sdb
$ sudo vgcreate cinder-volumes /dev/sdb
$ sudo pvs
PV         VG             Fmt  Attr PSize PFree
/dev/sdb   cinder-volumes lvm2 a--  8.00g 8.00g

$ sudo vgs
VG             #PV #LV #SN Attr   VSize VFree
cinder-volumes   1   0   0 wz--n- 8.00g 8.00g

ディスクを当たらに追加し、LVMを設定した場合は仮想マシンにより使用されるデバイスをスキャンすることからLVMを保護するために、/etc/lvm/lvm.conf ファイルの devices セクションにフィルター項目を追加します。

devices {
...
filter = [ "a/sda1/", "a/sdb/", "r/.*/"]
...
}

2.10.1. /etc/cinder/cinder.conf

/etc/cinder/cidner.confを編集します。

sudo vim /etc/cinder/cinder.conf

個別の説明は多過ぎるので勘弁してください。ドキュメントとソース見てください…。

[DEFAULT]
host=ctrl
my_ip=192.168.5.131

rabbit_host=192.168.5.131
rabbit_port=5672
rabbit_hosts=$rabbit_host:$rabbit_port
rabbit_use_ssl=false
rabbit_userid=cinder
rabbit_password=y7u8i9YUI
#rabbit_login_method=AMQPLAIN
rabbit_virtual_host=/cinder
rabbit_retry_interval=1
rabbit_retry_backoff=2
rabbit_max_retries=0
rabbit_ha_queues=false
rpc_backend=rabbit
control_exchange=cinder
notification_driver=cinder.openstack.common.notifier.rpc_notifier
policy_file=policy.json
policy_default_rule=default
quota_volumes=10
quota_snapshots=10
quota_gigabytes=1000
reservation_expire=86400
quota_driver=cinder.quota.DbQuotaDriver
use_default_quota_class=true
report_interval=10
periodic_interval=60
osapi_volume_listen=0.0.0.0
osapi_volume_listen_port=8776
osapi_volume_workers=1
use_forwarded_for=false
restore_discard_excess_bytes=true
api_paste_config=api-paste.ini
state_path=/var/lib/cinder
glance_host=$my_ip
glance_port=9292
glance_api_servers=$glance_host:$glance_port
glance_api_version=1
glance_num_retries=0
glance_api_insecure=false
glance_api_ssl_compression=false
#glance_request_timeout=<None>
scheduler_topic=cinder-scheduler
volume_topic=cinder-volume
backup_topic=cinder-backup
enable_v1_api=true
enable_v2_api=true
api_rate_limit=true
osapi_volume_extension=cinder.api.contrib.standard_extensions
volume_manager=cinder.volume.manager.VolumeManager
backup_manager=cinder.backup.manager.BackupManager
scheduler_manager=cinder.scheduler.manager.SchedulerManager
storage_availability_zone=nova
default_availability_zone=nova
volume_usage_audit_period=month
rootwrap_config=/etc/cinder/rootwrap.conf
service_down_time=60
volume_api_class=cinder.volume.api.API
backup_api_class=cinder.backup.api.API
auth_strategy=keystone
no_snapshot_gb_quota=false
transfer_api_class=cinder.transfer.api.API
compute_api_class=cinder.compute.nova.API
nova_catalog_info=compute:nova:internalURL
nova_catalog_admin_info=compute:nova:adminURL
db_backend=sqlalchemy
volume_name_template=volume-%s
snapshot_name_template=snapshot-%s
backup_name_template=backup-%s
db_driver=cinder.db
image_conversion_dir=$state_path/conversion
lock_path=/var/lock/cinder
debug=true
verbose=true
use_stderr=true
fatal_deprecations=false
instance_format=[instance: %(uuid)s]
instance_uuid_format=[instance: %(uuid)s]
log_dir=/var/log/cinder
use_syslog=false
scheduler_host_manager=cinder.scheduler.host_manager.HostManager
scheduler_default_filters=AvailabilityZoneFilter,CapacityFilter,CapabilitiesFilter
scheduler_default_weighers=CapacityWeigher
scheduler_driver=cinder.scheduler.filter_scheduler.FilterScheduler
snapshot_same_host=true
cloned_volume_same_az=true
iscsi_num_targets=100
iscsi_target_prefix=iqn.2010-10.org.openstack:
iscsi_ip_address=$my_ip
iscsi_port=3260
num_volume_device_scan_tries=3
#volume_backend_name=<None>
volume_clear=zero
volume_clear_size=0
iscsi_helper=tgtadm
volumes_dir=$state_path/volumes
iscsi_iotype=fileio
volume_dd_blocksize=1M
volume_group=cinder-volumes
lvm_mirrors=0
lvm_type=default
rbd_max_clone_depth=5
volume_driver=cinder.volume.drivers.lvm.LVMISCSIDriver

[database]
backend=sqlalchemy
connection=mysql://cinder:y7u8i9YUI@192.168.5.131/cinder?charset=utf8

[keystone_authtoken]
auth_host=192.168.5.131
auth_port=35357
auth_protocol=http
auth_uri=http://192.168.5.131:5000/v2.0
admin_user=cinder
admin_password=y7u8i9YUI
admin_tenant_name=service
signing_dir=/var/cache/cinder

※ Volume Group名を cinder-volumes にしていない場合は、volume_group に自信で設定したVG名を指定します。

2.10.2. Cinderデータベースの初期化

Cinderデータベースを初期化し、サービスを再起動します。

sudo cinder-manage db sync
sudo service cinder-api restart
sudo service cinder-scheduler restart
sudo service cinder-volume restart

ボリュームの作成/削除ができる事を確認します。

$ sudo pvs
PV         VG             Fmt  Attr PSize PFree
/dev/sdb   cinder-volumes lvm2 a--  7.97g 6.97g

$ sudo vgs
  VG             #PV #LV #SN Attr   VSize VFree
  cinder-volumes   1   1   0 wz--n- 7.97g 7.97g

$ sudo lvs

$ source ~/openrc

$ cinder create --display_name vol001 1
+---------------------+--------------------------------------+
|       Property      |                Value                 |
+---------------------+--------------------------------------+
|     attachments     |                  []                  |
|  availability_zone  |                 nova                 |
|       bootable      |                false                 |
|      created_at     |      2014-06-09T08:55:32.703210      |
| display_description |                 None                 |
|     display_name    |                vol001                |
|      encrypted      |                False                 |
|          id         | b01948e3-eede-41f6-adfe-be06637ac364 |
|       metadata      |                  {}                  |
|         size        |                  1                   |
|     snapshot_id     |                 None                 |
|     source_volid    |                 None                 |
|        status       |               creating               |
|     volume_type     |                 None                 |
+---------------------+--------------------------------------+

$ cinder list
+--------------------------------------+-----------+--------------+------+-------------+----------+-------------+
|                  ID                  |   Status  | Display Name | Size | Volume Type | Bootable | Attached to |
+--------------------------------------+-----------+--------------+------+-------------+----------+-------------+
| b01948e3-eede-41f6-adfe-be06637ac364 | available |    vol001    |  1   |     None    |  false   |             |
+--------------------------------------+-----------+--------------+------+-------------+----------+-------------+

$ sudo lvs
  LV                                          VG             Attr      LSize Pool Origin Data%  Move Log Copy%  Convert
  volume-b01948e3-eede-41f6-adfe-be06637ac364 cinder-volumes -wi-a---- 1.00g

$ cinder delete b01948e3-eede-41f6-adfe-be06637ac364

$ cinder list
+----+--------+--------------+------+-------------+----------+-------------+
| ID | Status | Display Name | Size | Volume Type | Bootable | Attached to |
+----+--------+--------------+------+-------------+----------+-------------+
+----+--------+--------------+------+-------------+----------+-------------+

$ sudo lvs

2.11. Nova

Nova compute以外のパッケージををインストールします。

sudo apt-get -y install nova-api nova-scheduler nova-conductor nova-spiceproxy nova-consoleauth
sudo mkdir /var/cache/nova
sudo chown nova:nova /var/cache/nova

2.11.1. /etc/nova/nova.conf

/etc/nova/nova.confを編集します。

sudo vim /etc/nova/nova.conf

個別の説明は多過ぎるので勘弁してください。ドキュメントとソース見てください…。

設定サンプル

[DEFAULT]
my_ip=192.168.5.131
host=ctrl

rabbit_host=192.168.5.131
rabbit_port=5672
rabbit_hosts=$rabbit_host:$rabbit_port
rabbit_use_ssl=false
rabbit_userid=nova
rabbit_password=y7u8i9YUI
rabbit_login_method=AMQPLAIN
rabbit_virtual_host=/nova
rabbit_retry_interval=1
rabbit_retry_backoff=2
rabbit_max_retries=0
rabbit_ha_queues=false
rpc_backend=rabbit
control_exchange=openstack

internal_service_availability_zone=internal
default_availability_zone=nova
default_schedule_zone=nova

pybasedir=/usr/lib/python2.7/site-packages
bindir=/usr/local/bin
state_path=/var/lib/nova
instances_path=$state_path/instances
lock_path=/var/lock/nova
log_dir=/var/log/nova
snapshots_directory=$instances_path/snapshots

policy_file=policy.json
policy_default_rule=default
quota_instances=10
quota_cores=20
quota_ram=51200
quota_floating_ips=10
quota_fixed_ips=-1
quota_metadata_items=128
quota_injected_files=5
quota_injected_file_content_bytes=10240
quota_injected_file_path_bytes=255
quota_security_groups=10
quota_security_group_rules=20
quota_key_pairs=100
reservation_expire=86400
until_refresh=0
max_age=0
quota_driver=nova.quota.DbQuotaDriver
report_interval=10
periodic_enable=true
periodic_fuzzy_delay=60
enabled_apis=ec2,osapi_compute,metadata
enabled_ssl_apis=
ec2_listen=0.0.0.0
ec2_listen_port=8773
ec2_workers=1
osapi_compute_listen=0.0.0.0
osapi_compute_listen_port=8774
osapi_compute_workers=1
metadata_manager=nova.api.manager.MetadataManager
metadata_listen=0.0.0.0
metadata_listen_port=8775
metadata_workers=1
compute_manager=nova.compute.manager.ComputeManager
console_manager=nova.console.manager.ConsoleProxyManager
consoleauth_manager=nova.consoleauth.manager.ConsoleAuthManager
cert_manager=nova.cert.manager.CertManager
scheduler_manager=nova.scheduler.manager.SchedulerManager
service_down_time=60
password_length=12
instance_usage_audit_period=month
rootwrap_config=/etc/nova/rootwrap.conf
api_paste_config=api-paste.ini
wsgi_default_pool_size=1000
api_rate_limit=false
auth_strategy=keystone
use_forwarded_for=false
keystone_ec2_url=http://192.168.5.131:5000/v2.0/ec2tokens
ec2_host=192.168.5.131
ec2_dmz_host=192.168.5.131
ec2_port=8773
ec2_scheme=http
ec2_path=/services/Cloud
region_list=
allow_instance_snapshots=true
allow_resize_to_same_host=false
allow_migrate_to_same_host=false
multi_instance_display_name_template=%(name)s-%(uuid)s

instance_usage_audit=false
resume_guests_state_on_host_boot=false
compute_topic=compute
consoleauth_topic=consoleauth
instance_name_template=instance-%08x
snapshot_name_template=snapshot-%s
db_driver=nova.db
glance_host=192.168.5.131
glance_port=9292
glance_protocol=http
glance_api_servers=$glance_host:$glance_port
glance_api_insecure=false
glance_num_retries=0

network_api_class=nova.network.neutronv2.api.API
neutron_url=http://192.168.5.131:9696
neutron_url_timeout=30
neutron_auth_strategy=keystone
neutron_admin_tenant_name=service
neutron_region_name=RegionOne
neutron_admin_username=neutron
neutron_admin_password=y7u8i9YUI
neutron_admin_auth_url=http://192.168.5.131:35357/v2.0
neutron_api_insecure=false
neutron_ovs_bridge=br-int
neutron_extension_sync_interval=600
linuxnet_interface_driver=nova.network.linux_net.LinuxOVSInterfaceDriver
firewall_driver=nova.virt.firewall.NoopFirewallDriver
security_group_api=neutron
service_neutron_metadata_proxy=True
neutron_metadata_proxy_shared_secret=TimeIsMoney
auto_assign_floating_ip=false
forward_bridge_interface=all
metadata_host=192.168.5.131
metadata_port=8775

debug=true
verbose=true
use_stderr=true
instance_format=[instance: %(uuid)s]
instance_uuid_format=[instance: %(uuid)s]
use_syslog=false
scheduler_host_manager=nova.scheduler.host_manager.HostManager
cpu_allocation_ratio=16.0
disk_allocation_ratio=1.0
scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter
scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler
scheduler_topic=scheduler
config_drive_format=iso9660
allow_same_net_traffic=true
image_cache_subdirectory_name=_base
remove_unused_base_images=true
volume_api_class=nova.volume.cinder.API
cinder_catalog_info=volume:cinder:internalURL
os_region_name=RegionOne
cinder_api_insecure=false
cinder_cross_az_attach=true
vnc_enabled=false

[conductor]
use_local=false
topic=conductor
manager=nova.conductor.manager.ConductorManager
workers=1

[database]
backend=sqlalchemy
connection=mysql://nova:y7u8i9YUI@192.168.5.131/nova?charset=utf8
use_db_reconnect=false

[keystone_authtoken]
auth_host=192.168.5.131
auth_port=35357
auth_protocol=http
auth_uri=http://192.168.5.131:5000/v2.0
admin_user=nova
admin_password=y7u8i9YUI
admin_tenant_name=service
signing_dir=/var/cache/nova

[libvirt]
virt_type=qemu
inject_password=false
inject_key=false
inject_partition=-2
live_migration_flag=VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE
block_migration_flag=VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_NON_SHARED_INC
live_migration_bandwidth=0
#vif_driver=nova.virt.libvirt.vif.LibvirtGenericVIFDriver
images_type=default
volume_clear=zero
volume_clear_size=0
use_virtio_for_bridges=true


[osapi_v3]
enabled=true

[spice]
html5proxy_base_url=http://192.168.56.131:6082/spice_auto.html
server_listen=0.0.0.0
server_proxyclient_address=192.168.5.131
enabled=true
agent_enabled=true
keymap=ja-jp

2.11.2. Novaデータベースの初期化

Novaデータベースを初期化し、サービスを再起動します。

sudo nova-manage db sync
sudo service nova-api restart
sudo service nova-conductor restart
sudo service nova-consoleauth restart
sudo service nova-scheduler restart
sudo service nova-spiceproxy restart

現段階ではネットワークが作れない為、インスタンスの作成はできません。

nova listコマンドが正常に実行できる事だけ確認します。

source ~/openrc
nova list
+----+------+--------+------------+-------------+----------+
| ID | Name | Status | Task State | Power State | Networks |
+----+------+--------+------------+-------------+----------+
+----+------+--------+------------+-------------+----------+

2.12. Neutron

Neutronサーバのインストールをします。

Neutronコントローラドキュメント 参照。

sudo apt-get -y install neutron-server neutron-plugin-ml2
sudo mkdir /var/cache/neutron
sudo chown neutron:neutron /var/cache/neutron

2.12.1. /etc/neutron/neutron.conf

/etc/neutron/neutron.conf を編集します。

sudo vim /etc/neutron/neutron.conf

設定サンプル

[DEFAULT]
verbose = True
debug = True
state_path = /var/lib/neutron
lock_path = $state_path/lock
bind_host = 0.0.0.0
bind_port = 9696
core_plugin = ml2
service_plugins = router
auth_strategy = keystone
allow_overlapping_ips = True
rpc_backend = neutron.openstack.common.rpc.impl_kombu
rabbit_host = 192.168.5.131
rabbit_password = y7u8i9YUI
rabbit_port = 5672
rabbit_hosts = 192.168.5.131:5672
rabbit_userid = neutron
rabbit_virtual_host = /neutron
rabbit_ha_queues = false
notification_driver = neutron.openstack.common.notifier.rpc_notifier
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True
nova_url = http://192.168.5.131:8774/v2
nova_region_name = RegionOne
nova_admin_username = nova
nova_admin_tenant_id = 235941422117481288d4d5a10f28f0c5
nova_admin_password = y7u8i9YUI
nova_admin_auth_url = http://192.168.5.131:35357/v2.0

[quotas]

[agent]
root_helper = sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf

[keystone_authtoken]
auth_host = 192.168.5.131
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = neutron
admin_password = y7u8i9YUI
signing_dir = /var/cache/neutron

[database]
connection = mysql://neutron:y7u8i9YUI@192.168.5.131/neutron?charset=utf8

[service_providers]
service_provider=LOADBALANCER:Haproxy:neutron.services.loadbalancer.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default
service_provider=VPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default

nova_admin_tenant_id には serviceプロジェクトのIDを指定します。

source ~/openrc
keystone tenant-list | grep service

nova_admin_tenant_id には serviceプロジェクトのIDを指定します。nova_url, nova_admin_tenant_id など認証情報に誤りがある場合はインスタンス生成時、Unexpected vif_type=binding_failed がnova-compute.logに出力されます。nova_url のURL指定には /v2 が必須です。

2.12.2. neutron.confパラメータ適当に解説

  • [DEFAULT]
パラメータ 説明
verbose 冗長なログを有効化
debug デバッグログを有効化
bind_host Neutronサーバーが待ち受けるアドレス
bind_port Neutronサーバーが待ち受けるポート番号
core_plugin Core Pluginとして使用するプラグイン名を指定する。
service_plugins Service Pluginとして使用するプラグイン名を指定する。
auth_strategy 認証方式を指定する
allow_overlapping_ips 重複したIPアドレスの利用を可能にする
rpc_backend RPCバックエンドに使用するサービス名を指定する
rabbit_host 接続するRabbitMQのIPアドレスもしくは名前
rabbit_port 接続するRabbitMQのPort番号
rabbit_use_ssl RabbitMQの接続にSSLを使用する
rabbit_userid RabbitMQに接続可能なユーザID
rabbit_password RabbitMQに接続可能なユーザIDのパスワード
rabbit_virtual_host RabbitMQに接続可能なvhost
rabbit_ha_queues HA queuesを使用する
notify_nova_on_port_status_changes Ceilometerで使用
notify_nova_on_port_data_changes Ceilometerで使用
nova_url 接続するNovaのEndpointを指定。/v2がないとハマる。
nova_region_name 接続するNovaのリージョンを指定
nova_admin_username 接続可能なNovaユーザ名を指定
nova_admin_tenant_id 接続可能なNovaユーザ名の所属プロジェクト(service)のプロジェクトIDを指定
nova_admin_password 接続可能なNovaユーザ名のパスワード
nova_admin_auth_url KeystoneのadminURLを指定
  • [keystone_authtoken]
パラメータ 説明
auth_host 接続するKeystoneのIPアドレスもしくは名前
auth_port 接続するKeystoneのポート番号
auth_protocol 接続プロトコル
admin_tenant_name Keystoneに接続可能なGlanceプロジェクト名
admin_user Keystoneに接続可能なGlanceユーザ名
admin_password Keystoneに接続可能なGlanceユーザのパスワード
  • [database]
パラメータ 説明
connection 接続先データベース情報
  • [service_providers]
パラメータ 説明
service_provider サービスプロバイダを指定

2.12.3. /etc/neutron/plugins/ml2/ml2_conf.ini

/etc/neutron/plugins/ml2/ml2_conf.ini を編集します。

sudo vim /etc/neutron/plugins/ml2/ml2_conf.ini

設定サンプル

[ml2]
type_drivers = gre
tenant_network_types = gre
mechanism_drivers = openvswitch

[ml2_type_flat]

[ml2_type_vlan]

[ml2_type_gre]
tunnel_id_ranges = 1:1000

[ml2_type_vxlan]

[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver

2.12.4. Neutronサーバ再起動

設定後、Neutronサーバを再起動します。この時データベースが初期化されます。

sudo service neutron-server restart

2.13. MongoDB

Ceilometerで利用するMongoDBをインストールします。

sudo apt-get -y install mongodb-server

2.13.1. /etc/mongodb.conf

パラメータ bind_ip を変更し、サービスを再起動します。

sudo sed -i -e "s/\(^bind_ip.*= \).*/\1192.168.5.131/" /etc/mongodb.conf
sudo service mongodb restart

2.13.2. ユーザ・データベースの作成

CeilometerユーザとCeilometerデータベースを作成します。

※とりあえず

mongo --host ctrl --eval '
db = db.getSiblingDB("ceilometer");
db.addUser({user: "ceilometer",
            pwd: "y7u8i9YUI",
            roles: [ "readWrite", "dbAdmin" ]})'

2.14. Ceilometer

Ceilometerをインストールします。

sudo apt-get -y install ceilometer-api ceilometer-collector ceilometer-agent-central \
                        ceilometer-agent-notification ceilometer-alarm-evaluator \
                        ceilometer-alarm-notifier python-ceilometerclient

2.14.1. /etc/ceilometer/ceilometer.conf

/etc/ceilometer/ceilometer.conf を編集します。

sudo vim /etc/ceilometer/ceilometer.conf

Ceilometerコントローラドキュメント に従ったところこんな感じになりました。

[DEFAULT]
http_control_exchanges=nova
http_control_exchanges=glance
http_control_exchanges=neutron
http_control_exchanges=cinder
host=ctrl
auth_strategy=keystone
nova_control_exchange=nova
libvirt_type=qemu
glance_control_exchange=glance
neutron_control_exchange=neutron
sqlite_db=ceilometer.sqlite
debug=true
verbose=true
log_dir=/var/log/ceilometer
rabbit_host=192.168.5.131
rabbit_port=5672
rabbit_hosts=$rabbit_host:$rabbit_port
rabbit_use_ssl=false
rabbit_userid=ceilometer
rabbit_password=y7u8i9YUI
rabbit_virtual_host=/ceilometer

[alarm]

[api]
port=8777
host=0.0.0.0

[collector]

[database]
backend=sqlalchemy
connection = mongodb://ceilometer:y7u8i9YUI@192.168.5.131:27017/ceilometer

[dispatcher_file]

[event]

[keystone_authtoken]
auth_host = 192.168.5.131
auth_port = 35357
auth_protocol = http
auth_uri = http://192.168.5.131:5000
admin_tenant_name = service
admin_user = ceilometer
admin_password = y7u8i9YUI

[matchmaker_redis]

[matchmaker_ring]

[notification]

[publisher]
metering_secret=y7u8i9YUI

[publisher_rpc]

[rpc_notifier2]

[service_credentials]
os_auth_url = http://192.168.5.131:5000/v2.0
os_username = ceilometer
os_tenant_name = service
os_password = y7u8i9YUI

[ssl]

[vmware]

2.14.2. Ceilometerサービスの再起動

設定を行ったら各種Ceilometerサービスを再起動します。

sudo service ceilometer-agent-central restart
sudo service ceilometer-agent-notification restart
sudo service ceilometer-alarm-evaluator restart
sudo service ceilometer-alarm-notifier restart
sudo service ceilometer-api restart
sudo service ceilometer-collector restart

2.15. Heat

Heatをインストールします。

sudo apt-get -y install heat-api heat-api-cfn heat-engine

2.15.1. /etc/heat/heat.conf

/etc/heat/heat.confを編集します。

sudo vim /etc/heat/heat.conf

Heatコントローラドキュメント に従ったところこんな感じになりました。

[DEFAULT]
heat_metadata_server_url=http://192.168.5.131:8000
heat_waitcondition_server_url=http://192.168.5.131:8000/v1/waitcondition
heat_stack_user_role=heat_stack_user
debug=true
verbose=true
log_dir=/var/log/heat
rabbit_host=localhost
rabbit_port=5672
rabbit_hosts=$rabbit_host:$rabbit_port
rabbit_use_ssl=false
rabbit_userid=heat
rabbit_password=y7u8i9YUI
rabbit_virtual_host=/heat

[auth_password]

[clients]

[clients_ceilometer]

[clients_cinder]

[clients_heat]

[clients_keystone]

[clients_neutron]

[clients_nova]

[clients_swift]

[clients_trove]

[database]
connection=mysql://heat:y7u8i9YUI@localhost/heat?charset=utf8

[ec2authtoken]
auth_uri = http://192.168.5.131:5000/v2.0

[heat_api]

[heat_api_cfn]

[heat_api_cloudwatch]

[keystone_authtoken]
auth_host = 192.168.5.131
auth_port = 35357
auth_protocol = http
auth_uri = http://192.168.5.131:5000/v2.0
admin_tenant_name = service
admin_user = heat
admin_password = y7u8i9YUI

[matchmaker_redis]

[matchmaker_ring]

[paste_deploy]

[revision]

[rpc_notifier2]

[ssl]

2.15.2. Heatデータベースの初期化

Heatデータベースを初期化し、サービスを再起動します。

sudo heat-manage db_sync
sudo service heat-api restart
sudo service heat-api-cfn restart
sudo service heat-engine restart

Sample Template

2.16. Horizon

Horizonのインストールと設定を行います。

インストールをするとデフォルトでUbuntuのテーマがインストールされますが不要なので削除します。

sudo apt-get -y install openstack-dashboard
sudo dpkg -r openstack-dashboard-ubuntu-theme

2.17. /etc/openstack-dashboard/local_settings.py

/etc/openstack-dashboard/local_settings.py を編集します。

ここでは以下個所を修正しています。

$ sudo vim /etc/openstack-dashboard/local_settings.py
...
OPENSTACK_ENDPOINT_TYPE = "publicURL"
...
CACHES = {
   'default': {
       'BACKEND' : 'django.core.cache.backends.memcached.MemcachedCache',
       'LOCATION' : '192.168.5.131:11211',
   }
}
...
OPENSTACK_HOST = "192.168.5.131"
...

2.17.1. Apache再起動

設定後、Apacheを再起動します。

sudo service apache2 restart

2.17.2. Horizonへのアクセス

設定後WebブラウザからHorizonにアクセスをします。

http://192.168.56.131/horizon

Table Of Contents

Previous topic

1. 前提条件等

Next topic

3. Networkノードのセットアップ

This Page