9. Horizon インストール手順

WebUI の Horizon(DashBoard) インストール手順を記載します。

はまりポイントが多いので一本道の手順にはなっていません。

エラーで検索した人を救済するようにエラーを記載しているのでちょっと見辛いです。

後日はまりポイントと分離します。

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

Github から Horizon(stable/diablo) を取得します。

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

Github からopenstackx(diablo) を取得します。

$ cd /usr/local/src
$ sudo git clone https://github.com/cloudbuilders/openstackx.git -b diablo
$ cd openstackx
$ git branch
* diablo

Github から openstack.compute(master) を取得します。

$ cd /usr/local/src
$ sudo git clone https://github.com/jacobian/openstack.compute.git
$ cd openstack.compute
$ git branch
* master

9.2. はまりポイント

  1. openstackx をインストールする
    • これをインストールしないとファイル不足で起動しません。
    • バージョンは必ず、diablo 用を使うこと。間違って、master にすると起動しません。
    • Ubuntu パッケージの openstackx はダミーっぽいです。騙されました。古いだけかも?
  2. /etc/nova/nova.conf に –osapi_extensions_path を設定する
    • 同、これを指定しないと起動しません。
  3. openstack.compute/ を openstack-dashboard の下に配置する
    • extensions を設定するとファイル不足で起動しません。さらに、nova-api が落ちます。nova-api が落ちます。
    • Nova インストールの項で、コメントアウトしてあるのはこのためです。

9.3. django-openstack のインストール

依存関係は特にありません。

$ sudo -i
# cd /usr/local/src/horizon/django-openstack
# python setup.py build
# python setup.py install --record installfile.txt

9.4. openstack-dashboard のインストール

依存関係があります。horizon/openstack-dashboard/tools/pip-requires を編集し、pip でインストールを行います。

変更箇所 は以下の通りです。

  • Django のバージョンを 1.3.1 にする
  • -e で始まるものをコメントアウトする
    • この時、/usr/(local/)?share/pytthon2.x とかに入らず、/usr/local/src/horizon/openstack-dashboard の下にはインストールされるようです。
    • with_venv.sh で起動する場合に利用するようです。(あやふや)
# sed -i -e 's/\(^Django==\).*/\11\.3\.1/g' -e 's/^-e/#-e/g' /usr/local/src/horizon/openstack-dashboard/tools/pip-requires
# pip install -r /usr/local/src/horizon/openstack-dashboard/tools/pip-requires
# exit
$ sudo cp -r /usr/local/src/horizon/openstack-dashboard /var/lib
$ sudo mkdir /var/lib/openstack-dashboard/.blackhole/

9.4.1. /var/lib/openstack-dashboard/dashboard/wsgi/django.wsgi の編集

この状態で Web サーバを起動して、アクセスした場合は /var/log/apache/error.log にエラーログが出力されます。

※ 配置場所が間違っている疑惑?

[error] [client 192.168.11.4] mod_wsgi (pid=18576): Exception occurred processing WSGI script '/var/lib/openstack-dashboard/dashboard/wsgi/django.wsgi'.
[error] [client 192.168.11.4] Traceback (most recent call last):
[error] [client 192.168.11.4]   File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 250, in __call__
[error] [client 192.168.11.4]     self.load_middleware()
[error] [client 192.168.11.4]   File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 39, in load_middleware
[error] [client 192.168.11.4]     for middleware_path in settings.MIDDLEWARE_CLASSES:
[error] [client 192.168.11.4]   File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 276, in __getattr__
[error] [client 192.168.11.4]     self._setup()
[error] [client 192.168.11.4]   File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 42, in _setup
[error] [client 192.168.11.4]     self._wrapped = Settings(settings_module)
[error] [client 192.168.11.4]   File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 89, in __init__
[error] [client 192.168.11.4]     raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
[error] [client 192.168.11.4] ImportError: Could not import settings 'dashboard.settings' (Is it on sys.path?): No module named dashboard.settings

/var/lib/openstack-dashboard/dashboard/wsgi/django.wsgi が dashboard.settings を見つけられないのでパスを通します。

$ sudo vim /var/lib/openstack-dashboard/dashboard/wsgi/django.wsgi

(6行目あたりに以下を追加)

sys.path.append("/var/lib/openstack-dashboard")

9.4.2. /var/lib/openstack-dashboard/local/local_settings.py の作成

次に現れるエラーは「設定ファイルがない。」です。

[error] ImportError: No module named local_settings
[error] [client 192.168.11.4] mod_wsgi (pid=18575): Exception occurred processing WSGI script '/var/lib/openstack-dashboard/dashboard/wsgi/django.wsgi'.
[error] [client 192.168.11.4] Traceback (most recent call last):
[error] [client 192.168.11.4]   File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 250, in __call__
[error] [client 192.168.11.4]     self.load_middleware()
[error] [client 192.168.11.4]   File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 47, in load_middleware
[error] [client 192.168.11.4]     raise exceptions.ImproperlyConfigured('Error importing middleware %s: "%s"' % (mw_module, e))
[error] [client 192.168.11.4] ImproperlyConfigured: Error importing middleware django_openstack.middleware.keystone: "No module named django_openstack.middleware.keystone"

/var/lib/openstack-dashboard/local/local_settings.py.example をベースに設定ファイルを作成します。

$ sudo cp /var/lib/openstack-dashboard/local/local_settings.py.example /var/lib/openstack-dashboard/local/local_settings.py
$ sudo vim /var/lib/openstack-dashboard/local/local_settings.py

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

import os

DEBUG = True
TEMPLATE_DEBUG = DEBUG
PROD = False
USE_SSL = False

LOCAL_PATH = os.path.dirname(os.path.abspath(__file__))
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(LOCAL_PATH, 'dashboard_openstack.sqlite3'),
    },
}

CACHE_BACKEND = 'dummy://'


# Send email to the console by default
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
# Or send them to /dev/null
#EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'

# django-mailer uses a different settings attribute
MAILER_EMAIL_BACKEND = EMAIL_BACKEND

# Configure these for your outgoing email host
# EMAIL_HOST = 'smtp.my-company.com'
# EMAIL_PORT = 25
# EMAIL_HOST_USER = 'djangomail'
# EMAIL_HOST_PASSWORD = 'top-secret!'


OPENSTACK_KEYSTONE_URL = "http://localhost:5000/v2.0/"
# FIXME: this is only needed until keystone fixes its GET /tenants call
# so that it doesn't return everything for admins
OPENSTACK_KEYSTONE_ADMIN_URL = "http://localhost:35357/v2.0"
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "Member"

# NOTE(tres): Available services should come from the service
#             catalog in Keystone.
SWIFT_ENABLED = False

# Configure quantum connection details for networking
QUANTUM_ENABLED = True
QUANTUM_URL = '127.0.0.1'
QUANTUM_PORT = '9696'
QUANTUM_TENANT = '1234'
QUANTUM_CLIENT_VERSION='0.1'

# If you have external monitoring links
EXTERNAL_MONITORING = [
    ['Nagios','http://foo.com'],
    ['Ganglia','http://bar.com'],
]

# If you do not have external monitoring links
# EXTERNAL_MONITORING = []

# Uncomment the following segment to silence most logging
# django.db and boto DEBUG logging is extremely verbose.
#LOGGING = {
#        'version': 1,
#        # set to True will disable all logging except that specified, unless
#        # nothing is specified except that django.db.backends will still log,
#        # even when set to True, so disable explicitly
#        'disable_existing_loggers': False,
#        'handlers': {
#            'null': {
#                'level': 'DEBUG',
#                'class': 'django.utils.log.NullHandler',
#                },
#            'console': {
#                'level': 'DEBUG',
#                'class': 'logging.StreamHandler',
#                },
#            },
#        'loggers': {
#            # Comment or Uncomment these to turn on/off logging output
#            'django.db.backends': {
#                'handlers': ['null'],
#                'propagate': False,
#                },
#            'django_openstack': {
#                'handlers': ['null'],
#                'propagate': False,
#            },
#        }
#}

# How much ram on each compute host?
COMPUTE_HOST_RAM_GB = 16

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

パラメータ 解説 今回設定する値
DATABASES データベース接続用設定 後述
OPENSTACK_KEYSTONE_URL KeyStone 接続用URL(endpointTemplate) http://192.168.0.2:5000/v2.0/
OPENSTACK_KEYSTONE_ADMIN_URL KeyStone 接続用URL(管理)(endpointTemplate) http://192.168.0.2:35357/v2.0/
QUANTUM_ENABLED Quantum を有効にするか否か False
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(LOCAL_PATH, 'dashboard_openstack.sqlite3'),
    },
}

↓(こんな感じ)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'horizon',
        'USER': 'horizon',
        'PASSWORD': 'y7u8i9YUI',
        'HOST': 'localhost',
        'default-character-set': 'utf8',
    },
}

9.5. Horizon データベース初期化

データベースを初期化します。はまりポインとはパスが通っていない。です。

ERROR:root:No module named local.local_settings
Traceback (most recent call last):
  File "/var/lib/openstack-dashboard/dashboard/settings.py", line 123, in <module>
    from local.local_settings import *
ImportError: No module named local.local_settings
ERROR:root:No module named local.local_settings
Traceback (most recent call last):
  File "/var/lib/openstack-dashboard/dashboard/../dashboard/settings.py", line 123, in <module>
    from local.local_settings import *
ImportError: No module named local.local_settings
Error: No module named django_openstack.templatetags

環境変数を渡した上で実行します。

$ cd /var/lib/openstack-dashboard
$ sudo PYTHONPATH=/var/lib/openstack-dashboard python dashboard/manage.py syncdb

9.6. Apache 設定

DashBoard はマニュアルによると、with_venv.sh で起動するようになっていますが、今回は Apache 連携をします。

$ sudo vim /etc/apache2/sites-enabled/000-default
<VirtualHost *:80>
    WSGIScriptAlias / /var/lib/openstack-dashboard/dashboard/wsgi/django.wsgi
    WSGIDaemonProcess horizon user=ishikawa group=ishikawa processes=3 threads=10
    SetEnv APACHE_RUN_USER ishikawa
    SetEnv APACHE_RUN_GROUP ishikawa
    WSGIProcessGroup horizon

    DocumentRoot /var/lib/openstack-dashboard/.blackhole/
    Alias /media /var/lib/openstack-dashboard/openstack-dashboard/static
    #Alias /vpn /opt/stack/vpn

    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

    <Directory /var/lib/openstack-dashboard/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log
    LogLevel warn
    CustomLog /var/log/apache2/access.log combined
</VirtualHost>
$ sudo /etc/init.d/apache2 restart

9.7. openstackx のインストール

openstackx をインストールせずに、Webアクセスをすると、以下のようなエラーが出力されます。

[error] INFO:root:Running in debug mode without debug_toolbar.
[error] [client 192.168.11.4] mod_wsgi (pid=18577): Exception occurred processing WSGI script '/var/lib/openstack-dashboard/dashboard/wsgi/django.wsgi'.
[error] [client 192.168.11.4] Traceback (most recent call last):
[error] [client 192.168.11.4]   File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 250, in __call__
[error] [client 192.168.11.4]     self.load_middleware()
[error] [client 192.168.11.4]   File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 47, in load_middleware
[error] [client 192.168.11.4]     raise exceptions.ImproperlyConfigured('Error importing middleware %s: "%s"' % (mw_module, e))
[error] [client 192.168.11.4] ImproperlyConfigured: Error importing middleware django_openstack.middleware.keystone: "No module named openstackx"

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

$ sudo -i
# cd /usr/local/src/openstackx
# python setup.py build
# python setup.py install --record installfile.txt
# exit

9.8. openstack.compute のインストール

openstack.compute を配置せずに、Webアクセスをすると、以下のようなエラーが出力されます。opensrtack.compute を配置します。

$ sudo cp -r /usr/local/src/openstack.compute/openstack /var/lib/openstack-dashboard

9.9. その他ログイン画面が表示されるまでの黒魔術

ここまでくると Webアクセスは可能になります。エラー画面ですが。

ViewDoesNotExist at /

Could not import dashboard.views. Error was: No module named quantum.client

Request Method:   GET
Request URL:   http://192.168.11.2/
Django Version:   1.3.1
Exception Type:   ViewDoesNotExist
Exception Value:

Could not import dashboard.views. Error was: No module named quantum.client

Exception Location:  /usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py in _get_callback, line 167
Python Executable:   /usr/bin/python
Python Version:   2.7.2

Quantum を使用しない設定にしていますが要求されます。空ファイルを作ってごまかします。

$ cd /var/lib/openstack-dashboard
$ sudo mkdir quantum
$ sudo touch quantum/__init__.py quantum/client.py

9.10. ログイン

ここまでくると本当にログインできるようになります。

../_images/dashboard_login_001.png

そして例のごとく現れるエラーです。

../_images/dashboard_login_002.png
Unable to get usage info: This error may be caused by a misconfigured nova url in keystone's service catalog, or by missing openstackx extensions in nova. See the dashboard README.

9.10.1. /etc/nova/nova.conf の修正

47行目、コメントアウトされている箇所を有効化します。

$ sudo vim /etc/nova/nova.conf
#--osapi_extensions_path=/usr/local/lib/python2.7/dist-packages/openstackx-0.2-py2.7.egg/extensions
↓
--osapi_extensions_path=/usr/local/lib/python2.7/dist-packages/openstackx-0.2-py2.7.egg/extensions

$ sudo /etc/init.d/nova-api restart