Instalación “manual” de OpenStack – Servicio de Identidad (perspectiva operador/implementador)

Mejor conocido por su nombre de proyecto «Keystone», el cual ofrece servicios de autenticación y autorización mediante políticas de seguridad a traves del uso de tokens, principalmente para los proyectos de la familia de OpenStack. Keystone provee un directorio central el cual mapea los servicios a los que un usuario puede acceder. Tambien actua como un sistema central de autenticación para operar la nube y el cual puede ser integrado con otros servicios existentes como lo son LDAP. A lo largo de esta publicación intentare cubrir los pasos necesarios para la instalación de sus servicios desde la perspectiva de «operador/implementador» de servicios de OpenStack, en la siguiente publicación cubriré la perspectiva como desarrollador de OpenStack.

Basta de rodeos y comencemos con su instalación, para lo cual hare referencia a la publicación pasada donde fue creado un archivo Vagrantfile, el cual contenía especificaciones para el servicio de mensajería y la base de datos necesarios para OpenStack, en esta ocasión agregaremos una nueva especificación para la maquina virtual que se encargara de ofrecer los servicios de identidad, por lo que del archivo sera modificado para incluir las siguientes lineas:

Vagrantfile

  config.vm.define :keystone do |keystone|
    keystone.vm.hostname = 'keystone-precise64'
    keystone.vm.network :private_network, ip: '192.168.50.12'
    keystone.vm.network :forwarded_port, guest: 5000, host: 5000
    keystone.vm.network :forwarded_port, guest: 35357, host: 35357
    keystone.vm.provision "shell", path: "keystone.sh"
  end

Cabe mencionar que las instrucciones anteriores hacen referencia al archivo keystone.sh, dicho script contendrá los pasos necesarios para instalar los servicios de Keystone desde la perspectiva de operador/implementador. La mayoría de las instalación de los servicios podrían ser resumidos en tres pasos muy sencillos:

  • Instalación de paquetes
  • Configuración de servicio
  • Reinicio de servicio(s)

Para realizar la instalación de paquetes sera necesario registrar el repositorio de la version que utilizaremos, en este caso sera la version de «Icehouse». Para poder obtener las claves requeridas sera necesario actualizar la lista de los paquetes disponibles, una vez actualizada la lista procedemos a la instalación del servicio de keystone que sera el que estamos buscando.

keystone.sh

#!/bin/bash
echo "deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-updates/icehouse main" >>  /etc/apt/sources.list.d/icehouse.list
apt-get update
apt-get --no-install-recommends -qqy install ubuntu-cloud-keyring
apt-get update
apt-get --no-install-recommends -qqy install keystone

Una vez instalado el servicio, se requiere configurarlo para que haga uso de la base de datos. Por lo que sera necesario modificar el archivo localizado en /etc/keystone/keystone.conf, y sustituir el valor de connection con el protocolo y la dirección de la base de datos. Una vez cambiado el valor de la conexión, el cual utilizaba un motor de base de datos sqlite, el archivo que se utilizaba previamente ya no sera requerido por lo que podemos eliminarlo. Por ultimo es necesario generar las tablas y columnas en el servidor de base de datos provisto por lo que utilizaremos una herramienta de keystone.

Las tablas recién generadas se encuentran vacías, por lo que para ingresar datos se requiere una clave maestra a traves de un token. Esta clave maestra sera generada y registrada en el archivo de configuración, así cualquier cliente que la utilice podrá crear cuentas, roles, servicios, endpoints, etc.

keystone.sh

sqlite="sqlite:////var/lib/keystone/keystone.db"
mysql="mysql://keystone:[email protected]/keystone"
sed -i.bak "s/${sqlite//\//\\/}/${mysql//\//\\/}/g" /etc/keystone/keystone.conf

rm /var/lib/keystone/keystone.db

apt-get --no-install-recommends -qqy install python-mysqldb
keystone-manage db_sync

token=`openssl rand -hex 10`
sed -i.bak "s/#admin_token=ADMIN/admin_token=${token}/g" /etc/keystone/keystone.conf

Todos estos cambios solo serán reflejados hasta que el servicio sea reiniciado.

keystone.sh

service keystone restart

Para el caso de Keystone y como requisito para instalación del resto de servicios de OpenStack, sera necesario crear varios tenants, un rol de administrador y usuarios para cada servicio. Aunque aun no se han creado las maquinas virtuales que proveerán los distintos servicios de OpenStack, registraremos tanto los servicios como los endpoints que estos ofrecen.

keystone.sh

export SERVICE_TOKEN="${token}"
export SERVICE_ENDPOINT=http://127.0.0.1:35357/v2.0

# Tenants
keystone tenant-create --name=admin --description="Admin Tenant"
keystone tenant-create --name=service --description="Service Tenant"

# Roles
keystone role-create --name=admin

# Usuarios
keystone user-create --name=admin --pass=secure [email protected]
keystone user-role-add --user=admin --tenant=admin --role=admin
keystone user-create --name=glance --pass=secure [email protected]
keystone user-role-add --user=glance --tenant=service --role=admin
keystone user-create --name=nova --pass=secure [email protected]
keystone user-role-add --user=nova --tenant=service --role=admin
keystone user-create --name=neutron --pass=secure [email protected]
keystone user-role-add --user=neutron --tenant=service --role=admin

# Servicios
keystone service-create --name=keystone --type=identity --description="OpenStack Identity Service"
keystone service-create --name=glance --type=image --description="OpenStack Image Service"
keystone service-create --name=nova --type=compute --description="OpenStack Compute Service"
keystone service-create --name=neutron --type=network --description="OpenStack Networking Service"

# Endpoints
keystone endpoint-create \
  --service_id=$(keystone service-list | awk '/ identity / {print $2}') \
  --publicurl=http://192.168.50.12:5000/v2.0 \
  --internalurl=http://192.168.50.12:5000/v2.0 \
  --adminurl=http://192.168.50.12:35357/v2.0
keystone endpoint-create \
  --service_id=$(keystone service-list | awk '/ image / {print $2}') \
  --publicurl=http://192.168.50.13:9292 \
  --internalurl=http://192.168.50.13:9292 \
  --adminurl=http://192.168.50.13:9292
keystone endpoint-create \
  --service_id=$(keystone service-list | awk '/ compute / {print $2}') \
  --publicurl=http://192.168.50.14:8774 \
  --internalurl=http://192.168.50.14:8774 \
  --adminurl=http://192.168.50.14:8774
keystone endpoint-create \
  --service_id=$(keystone service-list | awk '/ network / {print $2}') \
  --publicurl=http://192.168.50.16:9696 \

Nota: El código mostrado ha cargado en mi repositorio personal vagrant-manual-openstack.