8. Nova インストール手順

VM 管理担当 Nova インストール手順を記載します。

8.1. Github からコードを取得する

Github から stable/diablo のコードを取得します。

$ cd /usr/local/src
$ sudo git clone https://github.com/openstack/nova.git -b stable/diablo
$ cd nova
$ git branch
* stable/diablo

8.2. Nova インストール

nova/tools/pip-requires には Nova と依存関係があるものが列挙されれています。

Nova 本体のインストール前にこれらをインストールします。(Ubuntu パッケージでインストールしても OK)

この時、なぜか glance をインストールしようとしてしまうためこれを削除した上でパッケージのインストールを行います。

確認

Ubuntu パッケージ python-distutils-extra がインストールされている場合、Nova の i18n 化、国際化を試みるようだが、失敗して成功したためしがないので python-distutils-extra はインストールしません。

また、指定されたバージョンの M2Crypto はコンパイルが通らないため、コメントアウトします。今回は事前の依存関係解決の項でインストール済みです。

※ 指定バージョンの M2Crypto はコンパイル時にバッファオーバーフローの可能性がある旨を警告されたりと・・・。

$ sudo sed -i -e 's/^glance/#glance/' -e 's/^M2Crypto/#M2Crypto/' /usr/local/src/nova/tools/pip-requires
$ sudo -i
# pip install -r /usr/local/src/nova/tools/pip-requires
(こけたらバージョンのせいかも)

また、この依存関係解決の際にインストールされる python-novaclient 2.6.0 は API 要求の実装が古いため、KeyStone 連携が行えません。必要に応じて、任意のバージョンまたは最新バージョンにする必要があります。今回は最新バージョンにアップグレードします。

# pip install python-novaclient --upgrade

boto についても Ubuntu パッケージの euca2ools の要求と合わないため、アップデートを行います。今回は最新バージョンにアップグレードします。

# pip install boto --upgrade

全てのパッケージがインストールされたことを確認し、Nova のインストールを行います。

# cd /usr/local/src/nova
# python setup.py build
# python setup.py install --record installfile.txt

8.3. 環境設定

各種ディレクトリの作成とユーザ等環境の設定を行います。

# mkdir -p /etc/nova /var/log/nova /var/lib/nova/{instances,keys}
# useradd -r -d /var/lib/nova -G libvirtd -s /bin/bash nova
(本番環境構築時は -r だけではなく UID, GID を指定した方が良い)

起動スクリプトを作成します。

# cat << _EOF_ > /etc/init/nova-api.conf
description "Nova API server"
author "Soren Hansen <soren@linux2go.dk>"

start on (filesystem and net-device-up IFACE!=lo)
stop on runlevel [016]


chdir /var/run

pre-start script
        mkdir -p /var/run/nova
        chown nova:root /var/run/nova/

        mkdir -p /var/lock/nova
        chown nova:root /var/lock/nova/
end script

exec su -c "nova-api --flagfile=/etc/nova/nova.conf" nova
_EOF_
# cat << _EOF_ > /etc/init/nova-compute.conf
description "Nova compute worker"
author "Soren Hansen <soren@linux2go.dk>"

start on (filesystem and net-device-up IFACE!=lo)
stop on runlevel [016]


chdir /var/run

pre-start script
        mkdir -p /var/run/nova
        chown nova:root /var/run/nova/

        mkdir -p /var/lock/nova
        chown nova:root /var/lock/nova/

        modprobe nbd
end script

exec su -c "nova-compute --flagfile=/etc/nova/nova.conf --flagfile=/etc/nova/nova-compute.conf" nova
_EOF_
# cat << _EOF_ > /etc/init/nova-network.conf
description "Nova network worker"
author "Soren Hansen <soren@linux2go.dk>"

start on (filesystem and net-device-up IFACE!=lo)
stop on runlevel [016]

chdir /var/run

pre-start script
        mkdir -p /var/run/nova
        chown nova:root /var/run/nova/

        mkdir -p /var/lock/nova
        chown nova:root /var/lock/nova/
end script

exec su -c "nova-network --flagfile=/etc/nova/nova.conf" nova
_EOF_
# cat << _EOF_ > /etc/init/nova-scheduler.conf
description "Nova scheduler"
author "Soren Hansen <soren@linux2go.dk>"

start on (filesystem and net-device-up IFACE!=lo)
stop on runlevel [016]


chdir /var/run

pre-start script
        mkdir -p /var/run/nova
        chown nova:root /var/run/nova/

        mkdir -p /var/lock/nova
        chown nova:root /var/lock/nova/
end script

exec su -c "nova-scheduler --flagfile=/etc/nova/nova.conf" nova
_EOF_
# cat << _EOF_ > /etc/init/nova-volume.conf
description "Nova Volume server"
author "Soren Hansen <soren@linux2go.dk>"

start on (filesystem and net-device-up IFACE!=lo)
stop on runlevel [016]


chdir /var/run

pre-start script
        mkdir -p /var/run/nova
        chown nova:root /var/run/nova/
end script

exec su -c "nova-volume --flagfile=/etc/nova/nova.conf" nova
_EOF_
# cd /etc/init.d
# ln -s /lib/init/upstart-job nova-api
# ln -s /lib/init/upstart-job nova-compute
# ln -s /lib/init/upstart-job nova-network
# ln -s /lib/init/upstart-job nova-scheduler
# ln -s /lib/init/upstart-job nova-volume

sudoers の設定を行います。

# vim /etc/sudoers.d/nova_sudoers
Cmnd_Alias NOVACMDS = /bin/chmod /var/lib/nova/tmp/*/root/.ssh, \
                      /bin/chown /var/lib/nova/tmp/*/root/.ssh, \
                      /bin/chown,                               \
                      /bin/chmod,                               \
                      /bin/dd,                                  \
                      /sbin/ifconfig,                           \
                      /sbin/ip,                                 \
                      /sbin/route,                              \
                      /sbib/ebtables,                           \
                      /sbin/iptables,                           \
                      /sbin/iptables-save,                      \
                      /sbin/iptables-restore,                   \
                      /sbin/ip6tables-save,                     \
                      /sbin/ip6tables-restore,                  \
                      /sbin/kpartx,                             \
                      /sbin/losetup,                            \
                      /sbin/lvcreate,                           \
                      /sbin/lvdisplay,                          \
                      /sbin/lvremove,                           \
                      /bin/mkdir,                               \
                      /bin/mount,                               \
                      /sbin/pvcreate,                           \
                      /usr/bin/tee,                             \
                      /sbin/tune2fs,                            \
                      /bin/umount,                              \
                      /sbin/vgcreate,                           \
                      /usr/bin/virsh,                           \
                      /usr/bin/qemu-nbd,                        \
                      /usr/sbin/brctl,                          \
                      /sbin/brctl,                              \
                      /usr/sbin/radvd,                          \
                      /sbin/pvcreate,                           \
                      /sbin/aoe-discover,                       \
                      /sbin/vgcreate,                           \
                      /bin/aoe-stat,                            \
                      /bin/kill,                                \
                      /sbin/vconfig,                            \
                      /usr/sbin/tgtadm,                         \
                      /usr/sbin/ietadm,                         \
                      /sbin/vgs,                                \
                      /sbin/iscsiadm,                           \
                      /sbin/parted,                             \
                      /usr/sbin/dnsmasq,                        \
                      /usr/bin/arping,                          \
                      /bin/netcat,                              \
                      /usr/bin/dhcp_release

nova ALL = (root) NOPASSWD: SETENV: NOVACMDS

# chmod 440 /etc/sudoers.d/nova_sudoers

DashBoard を使用する際は、/etc/sudoers も変更する必要があるかも。

※ 確認中の項目。修正の可能性があります。

8.3.1. logrotate 設定

ローテート期間や所有者などは別途調整の上、設定を行います。

# cat << _EOF_ > /etc/logrotate.d/nova
/var/log/nova/nova-*.log {
    daily
    missingok
}
_EOF_

# exit

8.3.2. 設定ファイルのコピー

Nova と KeyStone の連携には KeyStone に含まれるサンプルファイルを使用します。

$ sudo cp /usr/local/src/keystone/examples/paste/nova-api-paste.ini /etc/nova/api-paste.ini
$ sudo chown -R nova:nova /etc/nova /var/log/nova /var/lib/nova

8.4. /etc/nova/nova.conf の作成

デフォルトは存在しない。手で作成。解説は激しく面倒なので別途・・・。パラメータは調整中。

nova-manage config list や find ./nova | xargs grep –color “flags.DEFINE_” など検索かけて力技で!

$ sudo vim /etc/nova/nova.conf
--my_ip=192.168.0.2
--routing_source_ip=192.168.0.2
--public_interface=eth0
--host=stack
--lock_path=/var/lock/nova
--state_path=/var/lib/nova
--logdir=/var/log/nova
--verbose
--sql_connection=mysql://nova:y7u8i9YUI@localhost/nova
--rabbit_userid=nova
--rabbit_password=y7u8i9YUI
--rabbit_virtual_host=/nova
--rabbit_host=192.168.0.2
--glance_api_servers=192.168.0.2:9292
--use_deprecated_auth
--ec2_dmz_host=192.168.0.2
--ec2_host=192.168.0.2
--ec2_listen=192.168.0.2
--ec2_port=8773
--osapi_listen=192.168.0.2
--osapi_listen_port=8774
--osapi_host=192.168.0.2
--osapi_port=8774
--ajax_console_proxy_port=8000
--ajax_console_proxy_url=http://192.168.0.2:8000
--ajaxterm_portrange=10000-12000
--network_driver=nova.network.linux_net
--firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver
--network_manager=nova.network.manager.FlatDHCPManager
--fixed_range=10.0.0.0/8
--use_ipv6=False
--flat_interface=eth0
--flat_network_bridge=br100
--force_dhcp_release
--floating_range=192.168.0.128/25
--image_service=nova.image.glance.GlanceImageService
--dhcpbridge_flagfile=/etc/nova/nova.conf
--dhcpbridge=/usr/local/bin/nova-dhcpbridge
--use_local_volumes
--volume_group=stack
--fake_tests=False

## KeyStone
--keystone_ec2_url=http://192.168.0.2:5000/v2.0/ec2tokens

## Horizon
#--osapi_extensions_path=/usr/local/lib/python2.7/dist-packages/openstackx-0.2-py2.7.egg/extensions
--vnc_enabled=True
--vncproxy_url=http://192.168.0.2:6080
--vncproxy_wwwroot=/var/lib/noVNC
--vncproxy_manager=nova.vnc.auth.VNCProxyAuthManager

8.4.1. はまりポイント

今回、ローカルボリュームを利用するようにしています。nova-volume は LVM が存在しないと使えず、さらに VG名 が nova-volumes でないと起動しません。この問題を回避するため、–volume_group パラメータヲ使用し、使用する VG 名を変更しています。

8.5. /etc/nova/nova-compute.conf の作成

デフォルトは存在しない。

--libvirt_type=kvm

8.6. /etc/nova/api-paste.ini の修正

サンプル設定ファイルを修正します。KeyStone 連携を行う場合の設定を記載します。

8.6.1. デフォルトの設定ファイル(2012/02/02)

#######
# EC2 #
#######

[composite:ec2]
use = egg:Paste#urlmap
/: ec2versions
/services/Cloud: ec2cloud
/services/Admin: ec2admin
/latest: ec2metadata
/2007-01-19: ec2metadata
/2007-03-01: ec2metadata
/2007-08-29: ec2metadata
/2007-10-10: ec2metadata
/2007-12-15: ec2metadata
/2008-02-01: ec2metadata
/2008-09-01: ec2metadata
/2009-04-04: ec2metadata
/1.0: ec2metadata

[pipeline:ec2cloud]
pipeline = logrequest totoken authtoken keystonecontext cloudrequest authorizer ec2executor

[pipeline:ec2admin]
pipeline = logrequest totoken authtoken keystonecontext adminrequest authorizer ec2executor

[pipeline:ec2metadata]
pipeline = logrequest ec2md

[pipeline:ec2versions]
pipeline = logrequest ec2ver

[filter:logrequest]
paste.filter_factory = nova.api.ec2:RequestLogging.factory

[filter:ec2lockout]
paste.filter_factory = nova.api.ec2:Lockout.factory

[filter:totoken]
paste.filter_factory = keystone.middleware.ec2_token:EC2Token.factory

[filter:ec2noauth]
paste.filter_factory = nova.api.ec2:NoAuth.factory

[filter:authenticate]
paste.filter_factory = nova.api.ec2:Authenticate.factory

[filter:cloudrequest]
controller = nova.api.ec2.cloud.CloudController
paste.filter_factory = nova.api.ec2:Requestify.factory

[filter:adminrequest]
controller = nova.api.ec2.admin.AdminController
paste.filter_factory = nova.api.ec2:Requestify.factory

[filter:authorizer]
paste.filter_factory = nova.api.ec2:Authorizer.factory

[app:ec2executor]
paste.app_factory = nova.api.ec2:Executor.factory

[app:ec2ver]
paste.app_factory = nova.api.ec2:Versions.factory

[app:ec2md]
paste.app_factory = nova.api.ec2.metadatarequesthandler:MetadataRequestHandler.factory

#############
# Openstack #
#############

[composite:osapi]
use = egg:Paste#urlmap
/: osversions
/v1.0: openstackapi10
/v1.1: openstackapi11

[pipeline:openstackapi10]
pipeline = faultwrap authtoken keystonecontext ratelimit osapiapp10

[pipeline:openstackapi11]
pipeline = faultwrap authtoken keystonecontext ratelimit extensions osapiapp11

[filter:faultwrap]
paste.filter_factory = nova.api.openstack:FaultWrapper.factory

[filter:auth]
paste.filter_factory = nova.api.openstack.auth:AuthMiddleware.factory

[filter:noauth]
paste.filter_factory = nova.api.openstack.auth:NoAuthMiddleware.factory

[filter:ratelimit]
paste.filter_factory = nova.api.openstack.limits:RateLimitingMiddleware.factory

[filter:extensions]
paste.filter_factory = nova.api.openstack.extensions:ExtensionMiddleware.factory

[app:osapiapp10]
paste.app_factory = nova.api.openstack:APIRouterV10.factory

[app:osapiapp11]
paste.app_factory = nova.api.openstack:APIRouterV11.factory

[pipeline:osversions]
pipeline = faultwrap osversionapp

[app:osversionapp]
paste.app_factory = nova.api.openstack.versions:Versions.factory

##########
# Shared #
##########

[filter:keystonecontext]
paste.filter_factory = keystone.middleware.nova_keystone_context:NovaKeystoneContext.factory

[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
service_protocol = http
service_host = 127.0.0.1
service_port = 5000
auth_host = 127.0.0.1
auth_port = 35357
auth_protocol = http
auth_uri = http://127.0.0.1:5000/
admin_token = 999888777666

8.6.2. 変更箇所とちょっとした解説?

パラメータ 解説 今回設定する値
service_host KeyStone のIPアドレスを指定 192.168.0.2
service_port KeyStone のサービスポートを指定 5000
auth_host KeyStone のIPアドレスを指定 192.168.0.2
auth_port KeyStone の管理ポートを指定 35357
auth_uri 認証の際にアクセスする URL を指定 http://192.168.0.2:5000/
admin_token アクセス用 Token Key を指定 999888777666

8.7. nova-manage

Nova データベースを初期化し、ネットワークの設定を行います。Project と User は KeyStone で管理しているため、設定不要。また、nova-manage project zipfile * * * 等も不要。

$ sudo nova-manage db sync
$ sudo nova-manage network create private --multi_host=T --fixed_range_v4=10.0.0.0/24 --num_networks=1 --network_size=256
$ sudo nova-manage floating create --ip_range=192.168.0.128/25

8.8. サービス起動

設定後、サービスを起動します。

$ sudo /etc/init.d/nova-api start
$ sudo /etc/init.d/nova-compute start
$ sudo /etc/init.d/nova-network start
$ sudo /etc/init.d/nova-scheduler start
$ sudo /etc/init.d/nova-vncproxy start
$ sudo /etc/init.d/nova-volume start
$ sudo /etc/init.d/libvirt-bin restart

8.9. 環境変数

以下の環境変数を設定するスクリプトを作成し、.bashrc などから呼び出するように設定します。

# nova
export NOVA_USERNAME=admin
export NOVA_PROJECT_ID=adminTenant
export NOVA_PASSWORD=y7u8i9YUI
export NOVA_API_KEY=${NOVA_PASSWORD}
export NOVA_URL=http://192.168.0.2:5000/v2.0/
export NOVA_VERSION=1.1
export NOVA_REGION_NAME=RegionOne

# glance
export OS_AUTH_USER=${NOVA_USERNAME}
export OS_AUTH_KEY=${NOVA_PASSWORD}
export OS_AUTH_TENANT=${NOVA_PROJECT_ID}
export OS_AUTH_URL=${NOVA_URL}
export OS_AUTH_STRATEGY=keystone

# euca2ools
export EC2_URL=http://192.168.0.2:8773/services/Cloud
export EC2_ACCESS_KEY=admin
export EC2_SECRET_KEY=y7u8i9YUI

8.10. 確認

はいごめんなさい。もっと詳しく書きます。

$ nova list
$ euca-describe-group