Horizon (Openstack Dashboard) sobre Ubuntu 11.10

Objectiu:

Disposar d’un entorn web per tal de controlar la infraestructura Openstack instal·lada en els tutorials anteriors. L’Openstack Dashboard ofereix un entorn web simple amb el que es possible crear instàncies, volums, regles de seguretat i demés sobre un entorn Openstack. Es tracta d’una aplicació web desenvolupada amb python i que funciona mitjançant el connector wsgi d’Apache, tot i que també es pot executar de forma autònoma. En aquest tutorial farem que funcioni com un VirtualHost més d’Apache.

Procediment:

Instal·larem el client en una màquina ubuntu 11.10 autònoma, que es comunicarà amb el sistema openstack que estarà funcionant en altres màquines. Instal·lar-ho en la mateixa màquina on hem instal·lat la resta de components d’Openstack és perfectament vàlid, però alguns dels mòduls que instal·larem poden crear conflictes a l’hora d’arrencar els serveis a l’inici que, tot i que són fàcils d’arreglar, només complicarien aquest tutorial (veure nota al peu).

La versió que utilitzarem és la de la branca master del repositori git del projecte. El primer que necessitem es satisfer tot un seguit de requeriments. Això ho farem executant les següents comandes:

# apt-get install python-software-properties
# add-apt-repository ppa:nova-core/trunk
# apt-get update
# apt-get install git libapache2-mod-wsgi python-django python-setuptools python-prettytable python-cloudfiles python-mox python-gflags python-django-nose python-dateutil glance-common

Amb els requeriments bàsics instal·lats clonem el projecte i els clients associats:

# git clone https://github.com/openstack/horizon
# git clone https://github.com/openstack/python-keystoneclient
# git clone https://github.com/openstack/python-quantumclient
# git clone https://github.com/openstack/python-novaclient

Instal·lem els clients dels components d’Openstack:

# ls
horizon  python-keystoneclient  python-novaclient  python-quantumclient
# cd python-keystoneclient
# python setup.py install
# cd ../python-novaclient
# python setup.py install
# cd ../horizon/horizon
# python setup.py install
# cd ../../python-quantumclient
# python setup.py install
# cd ..

Podem copiar l’aplicació web allà on vulguem, sempre i quan la referenciem correctament des de l’apache2. Tot i potser no ser la millor ubicació la posarem a /var/www:

# cp -aR horizon /var/www/
# cd /var/www
# mkdir horizon/.blackhole
# mkdir .novaclient
# cd horizon/openstack-dashboard
# cp local/local_settings.py.example local/local_settings.py
# cd /var/www
# chown -R www-data:www-data horizon .novaclient

A l’arxiu que es troba a local/local_settings.py de l’aplicació web trobarem la configuració. En aquest arxiu es defineix la base de dades, el host on s’està executant keystone i demés. A continuació es mostra el contingut bàsic de l’arxiu (s’ha de canviar IP_SERVIDOR_KEYSTONE per l’adreça de la màquina on s’executa aquest servei):

# cat /var/www/horizon/openstack-dashboard/local/local_settings.py
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'),
        'TEST_NAME': os.path.join(LOCAL_PATH, 'test.sqlite3'),
    },
}

CACHE_BACKEND = 'dummy://'
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
MAILER_EMAIL_BACKEND = EMAIL_BACKEND

HORIZON_CONFIG = {
    'dashboards': ('nova', 'syspanel', 'settings',),
    'default_dashboard': 'nova',
    'user_home': 'dashboard.views.user_home',
}

OPENSTACK_HOST = "IP_SERVIDOR_KEYSTONE"
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v2.0" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_ADMIN_URL = "http://%s:35357/v2.0" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "Member"

API_RESULT_LIMIT = 1000

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

Inicialitzem la base de dades:

# cd /var/www/horizon/openstack-dashboard
# python manage.py syncdb
# chown -R www-data:www-data /var/www/horizon/openstack-dashboard/local/*

Amb el dashboard configurat passem a definir un VirtualHost per a Apache:

# cd /etc/apache2/sites-available
# pico dashboard

El contingut de l’arxiu /etc/apache2/sites-available/dashboard és el següent:

<VirtualHost *:80>
    WSGIScriptAlias / /var/www/horizon/openstack-dashboard/dashboard/wsgi/django.wsgi
    WSGIDaemonProcess horizon user=www-data group=www-data processes=3 threads=10
    SetEnv APACHE_RUN_USER www-data
    SetEnv APACHE_RUN_GROUP www-data
    WSGIProcessGroup horizon

    DocumentRoot /var/www/horizon/.blackhole/
    Alias /media /var/www/horizon/openstack-dashboard/dashboard/static

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

    <Directory /var/www/horizon/>
        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>

Activem el VirtualHost com a principal:

# a2dissite default
# a2ensite dashboard
# service apache2 restart

En aquest punt ja tenim disponible el dashboard a http://IP_SERVIDOR/

Documentació:

Lamentablement la documentació del projecte no mostra com instal·lar aquesta aplicació web tal i com s’ha descrit en aquest tutorial ja que encara està en desenvolupament i es planteja una instal·lació per a desenvolupadors. Aquest tutorial s’ha basat força en el que el projecte devstack.org du a terme en el seu script.

NOTA sobre els clients i les incompatibilitats:

Quan s’instal·len els clients de keystone i nova en la mateixa màquina on funcionen els serveis es pot donar el cas que els scripts d’inici dels serveis utilitzin els clients en comptes dels binaris corresponents ja que es diuen igual (sí, és alucinant!).

Per arreglar això s’ha de modificar els scripts d’inici i canviar la ruta dels binaris pel seu corresponent:

# cat /etc/init/keystone.conf
...
exec su -c "/usr/bin/keystone --log-dir=/var/log/keystone --log-file=api.log" keystone

Aquesta línia (l’última) és la que he modificat.