Keystone (Openstack Identity Service) sobre Ubuntu 11.10

Objectiu:

Disposar d’un entorn d’autenticació per a openstack. Openstack aspira a convertir-se en l’estàndard de facto a l’hora d’implementar núvols privats o empresarials. El seu objectiu principal és que el sistema tingui una alta escalabilitat i sigui, també, altament distribuïble.

El primer dels mòduls necessaris per muntar un entorn bàsic (que és el que s’aspira amb aquests petits tutorials) és el de l’autenticació que usaran la resta de components del núvol.

Requeriments:

Lamentablement, en el moment d’escriure aquesta entrada Keystone es troba encara en fase de desenvolupament i els canvis són constants i poden fer que unes instruccions avui funcionin i demà no. A més l’actualització de la documentació no es du tant ràpidament com el codi, cosa que porta a incongruències i frustració per part de l’usuari.

Utilitzarem la versió 11.10 d’Ubuntu Server. No explicarem com instal·lar-lo en aquesta entrada. No es necessari res especific per dur a terme la instal·lació tret del següent:

  • Assignar una IP fixa (IP_SERVIDOR).
  • Particionar el disc deixant espai buit per crear volums LVM (per al tutorial de Glance)
  • Instal·lar OpenSSH per a accés remot.

Un cop acabada la instal·lació i en el nou entorn soc partidari del següent, per evitar el sudo i problemes de permisos:

$ sudo passwd root

D’aquesta manera assignem una contrasenya a l’usuari root i podem entrar al sistema amb tots els permisos.

Finalment actualitzem el sistema:

# apt-get update; apt-get dist-upgrade

Si s’ha actualitzat el kernel és recomanable reiniciar el sistema.

Procediment:

Instal·lem la versió que ve per defecte amb aquesta versió d’Ubunut més alguns altres paquets que ens faran falta:

# apt-get install python-software-properties
# add-apt-repository ppa:keystone-core/trunk
# apt-get update
# apt-get install keystone mysql-server python-mysqldb python-prettytable curl

Durant la instal·lació se’ns demanarà la contrasenya de l’usuari root de mysql. Assignem la que ens convingui.

Un cop tot instal·lat el servei keystone arrenca automàticament utilitzant una base de dades sqlite. Per al nostre entorn utilitzarem MySQL en tots els serveis associats a openstack, per tant hem de fer unes modificacions trivials.

Primer aturem keystone:

service keystone stop

Modifiquem la configuració de MySQL per a que escolti en totes les adreces. Això es fa a l’arxiu /etc/mysql/my.cnf i es pot fer executant la següent comanda:

# sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf

Finalment reiniciem el servei MySQL:

# service mysql restart

Creem una base de dades i assignem permisos:

# mysql -p
Enter password:

mysql> create database keystone;
mysql> grant all privileges on keystone.* to 'keystone'@'%' identified by 'pAssw0rd' with grant option;
mysql> quit;
Bye

A l’arxiu /etc/keystone/keystone.conf modificar la línia de la sql_connection per que quedi com es mostra a continuació (canviant, és clar, IP_SERVIDOR per l’adreça corresponent):

sql_connection = mysql://keystone:pAssw0rd@IP_SERVIDOR/keystone

En aquest punt es pot eliminar la base de dades SQLite per defecte:

# rm -f /var/lib/keystone/keystone.db

I finalment creem l’schema de Keystone a MySQL:

# keystone-manage sync_database

Fet això ja podem arrencar el servei:

# service keystone start

Configuració posterior:

Un cop instal·lat el servei és el moment d’afegir dades d’autenticació com ara usuaris, serveis etcètera. Aquesta és una tasca simple però que es fa pesada quan l’has hagut de fer diverses vegades. És per això que adjunto un petit script amb la informació bàsica d’inici.

NOTA: En aquest script s’ha de substituir IP_SERVIDOR per l’adreça de la màquina on treballem.

# pico keystone-init.sh
#!/bin/sh

keystone-manage tenant add admin
keystone-manage tenant add demo

keystone-manage user add admin root
keystone-manage user add demo root

keystone-manage role add Admin
keystone-manage role add KeystoneServiceAdmin
keystone-manage role add Member

keystone-manage role grant Admin admin
keystone-manage role grant KeystoneServiceAdmin admin
keystone-manage role grant Member demo

keystone-manage role grant Admin admin admin
keystone-manage role grant KeystoneServiceAdmin admin admin
keystone-manage role grant Member demo demo

keystone-manage service add nova compute "Nova Compute Service"
keystone-manage service add glance image "Glance Image Service"
keystone-manage service add keystone identity "Keystone Identity Service"

keystone-manage endpointTemplates add RegionOne nova http://IP_SERVIDOR:8774/v1.1/%tenant_id% http://IP_SERVIDOR:8774/v1.1/%tenant_id%  http://IP_SERVIDOR:8774/v1.1/%tenant_id% 1 1
keystone-manage endpointTemplates add RegionOne glance http://IP_SERVIDOR:9292/v1 http://IP_SERVIDOR:9292/v1 http://IP_SERVIDOR:9292/v1 1 1
keystone-manage endpointTemplates add RegionOne keystone http://IP_SERVIDOR:5000/v2.0 http://IP_SERVIDOR:35357/v2.0 http://IP_SERVIDOR:5000/v2.0 1 1

keystone-manage token add 999888777666 admin admin 2020-01-01T00:00

Seguidament l’executem:

# chmod a+x keystone-init.sh
# ./keystone-init.sh
SUCCESS: User admin created.
SUCCESS: User demo created.
SUCCESS: Role Admin created successfully.
SUCCESS: Role KeystoneServiceAdmin created successfully.
SUCCESS: Role Member created successfully.
SUCCESS: Granted admin the Admin role on None.
SUCCESS: Granted admin the KeystoneServiceAdmin role on None.
SUCCESS: Granted demo the Member role on None.
SUCCESS: Service nova created successfully.
SUCCESS: Service glance created successfully.
SUCCESS: Service keystone created successfully.
SUCCESS: Created EndpointTemplates for nova pointing to http://IP_SERVIDOR:8774/v1.1/%tenant_id%.
SUCCESS: Created EndpointTemplates for glance pointing to http://IP_SERVIDOR:9292/v1.
SUCCESS: Created EndpointTemplates for keystone pointing to http://IP_SERVIDOR:5000/v2.0.
SUCCESS: Token 999888777666 created.

Amb la informació entrada podem verificar que el sistema funciona correctament fent alguna consulta al servei:

# curl -d '{"passwordCredentials":{"username": "admin", "password": "root"}}' -H "Content-type: application/json" http://IP_SERVIDOR:35357/v2.0/tokens | python -mjson.tool
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   724  100   659  100    65   7281    718 --:--:-- --:--:-- --:--:--  7404
{
    "auth": {
        "serviceCatalog": {
            "identity": [
                {
                    "adminURL": "http://IP_SERVIDOR:35357/v2.0", 
                    "id": "3", 
                    "internalURL": "http://IP_SERVIDOR:5000/v2.0", 
                    "publicURL": "http://IP_SERVIDOR:5000/v2.0", 
                    "region": "RegionOne"
                }
            ], 
            "image": [
                {
                    "adminURL": "http://IP_SERVIDOR:9292/v1", 
                    "id": "2", 
                    "internalURL": "http://IP_SERVIDOR:9292/v1", 
                    "publicURL": "http://IP_SERVIDOR:9292/v1", 
                    "region": "RegionOne"
                }
            ]
        }, 
        "token": {
            "expires": "2012-02-18T13:20:53.871877", 
            "id": "365e2015-d152-4c1e-accb-5dcea4f89aa6"
        }, 
        "user": {
            "id": "e1cc1979c085465da601752305c223b6", 
            "name": "admin", 
            "roles": [
                {
                    "id": "1", 
                    "name": "Admin"
                }, 
                {
                    "id": "2", 
                    "name": "KeystoneServiceAdmin"
                }
            ]
        }
    }
}
# curl -H "X-Auth-Token:365e2015-d152-4c1e-accb-5dcea4f89aa6" http://IP_SERVIDOR:35357/v2.0/tokens/365e2015-d152-4c1e-accb-5dcea4f89aa6 | python -mjson.tool
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   504  100   504    0     0  22384      0 --:--:-- --:--:-- --:--:-- 24000
{
    "access": {
        "token": {
            "expires": "2012-02-18T13:20:53", 
            "id": "365e2015-d152-4c1e-accb-5dcea4f89aa6"
        }, 
        "user": {
            "id": "e1cc1979c085465da601752305c223b6", 
            "name": "admin", 
            "roles": [
                {
                    "id": "1", 
                    "name": "Admin"
                }, 
                {
                    "id": "2", 
                    "name": "KeystoneServiceAdmin"
                }
            ], 
            "username": "admin"
        }
    }, 
    "auth": {
        "token": {
            "expires": "2012-02-18T13:20:53", 
            "id": "365e2015-d152-4c1e-accb-5dcea4f89aa6"
        }, 
        "user": {
            "roleRefs": [
                {
                    "id": "1", 
                    "roleId": "Admin"
                }, 
                {
                    "id": "2", 
                    "roleId": "KeystoneServiceAdmin"
                }
            ], 
            "username": "admin"
        }
    }
}

Si s’obtenen resultats d’aquest tipus aleshores és que tot està funcionant correctament. Altrament podem veure quins error s’han produït amb:

# tail -f /var/log/keystone/api.log

Documentació:

La documentació d’openstack es pot trobar a http://docs.openstack.org.

Bona sort!