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

Es momento de instalar el servicio encargado de proveer maquinas virtuales(instancias), este servicio resulta primordial para aquellas nubes orientadas a ofrecer servicios de computo como lo es High-Performance Computing. Conocido como “Nova”, este proyecto (junto con Swift) es de los mas antiguos y su origen se remonta desde Austin release. A lo largo de su historia, Nova ha agregado soporte a multiples hipervisores, como lo son KVM, qemu, Hyper-V, VMware, XenServer, LXC, Docker, etc.

Por otra parte, el proyecto de nova ofrece una variedad de servicios que pueden ser separados en dos categorias: compute y controller. Dependiendo de la distro que se use los nombres de los servicios pueden variar, en la categoria de controller podemos encontrar los siguientes servicios o paquetes: nova-api, nova-cert, nova-consoleauth, nova-scheduler, nova-conductor y nova-novncproxy. Para el caso de la categoria de compute: solo es necesario nova-compute y opcionalmente, nova-network en caso de utilizar una configuración de Legacy Networking.

Nota: Existen algunas variantes de como o donde utilizar el servicio de nopa-api. Estas tres alternativas son resumidas en este articulo.

Comenzaremos con la instalación y configuración de servicios de Compute. Nuevamente es necesario modificar el archivo de Vagrantfile para poder habilitar los puertos necesarios, en este caso el 8774:

Vagrantfile

    config.vm.define :compute_controller do |compute_controller|
      compute_controller.vm.hostname = 'compute-controller'
      compute_controller.vm.network :private_network, ip: '192.168.50.14'
      compute_controller.vm.network :forwarded_port, guest: 8774, host: 8774
      compute_controller.vm.provision "shell", path: "nova-controller.sh"
      compute_controller.vm.provider "virtualbox" do |v|
        v.customize ["modifyvm", :id, "--memory", 2048]
      end
    end

Nota: Los servicios de nova controller utilizan memoria RAM adicional de la que ofrece la configuración por defecto de Vagrant, por lo que es necesario especificar ese cambio explicitamente.

nova-controller.sh

apt-get install -y ubuntu-cloud-keyring
echo "deb http://ubuntu-cloud.archive.canonical.com/ubuntu trusty-updates/juno main" >>  /etc/apt/sources.list.d/juno.list
apt-get update && apt-get dist-upgrade
apt-get install -y nova-api nova-cert nova-conductor nova-consoleauth nova-novncproxy nova-scheduler python-novaclient

Como ya es costumbre, es necesario registrar el repositorio que contiene los paquetes requeridos para el release de OpenStack a instalar. En el caso de los paquetes su instalación sera muy especifica, ya que puede existir variantes que estarán ligadas a la arquitectura deseada.

A continuación describiré las secciones a configurar.

nova-controller.sh

echo "my_ip = 192.168.50.14" >> /etc/nova/nova.conf
echo "novncproxy_host = 0.0.0.0" >> /etc/nova/nova.conf
echo "novncproxy_port = 6080" >> /etc/nova/nova.conf
 
echo "rpc_backend = rabbit" >> /etc/nova/nova.conf
echo "rabbit_host = message-broker" >> /etc/nova/nova.conf
echo "rabbit_password = secure" >> /etc/nova/nova.conf
 
echo "auth_strategy = keystone" >> /etc/nova/nova.conf
echo "" >> /etc/nova/nova.conf
echo "[keystone_authtoken]" >> /etc/nova/nova.conf
echo "identity_uri = http://identity:35357" >> /etc/nova/nova.conf
echo "admin_tenant_name = service" >> /etc/nova/nova.conf
echo "admin_user = nova" >> /etc/nova/nova.conf
echo "admin_password = secure" >> /etc/nova/nova.conf
 
echo "" >> /etc/nova/nova.conf
echo "[glance]" >> /etc/nova/nova.conf
echo "host = image" >> /etc/nova/nova.conf

El primer grupo de instrucciones pretende configurar valores básicos del servicio de nova, como la ip del nodo de controller, y los valores para el servicio de VNC por el cual los clientes se conectaran a las instancias. El segundo grupo, pretende conectar el servicio de nova con el servicio de cola mensajes, de esta forma ira procesando peticiones de clientes tan pronto pueda. El cuarto bloque de instrucciones especifica valores referentes a la autorización y autenticación de usuarios por medio del servicio de Identidad. Y por ultimo el quinto bloque refiere a el hostname o IP del nodo que ofrece el servicio de Imagenes.

nova-controller.sh

echo "" >> /etc/nova/nova.conf
echo "[database]" >> /etc/nova/nova.conf
echo "connection = mysql://nova:secure@database/nova" >> /etc/nova/nova.conf
 
apt-get install -y python-mysqldb
su -s /bin/sh -c "nova-manage db sync" nova

Intencionalmente aisle las instrucciones referentes al manejo de la conexión y sincronización de la base de datos. En nuestro caso el manejador de base de datos que utilizamos es un MySQL, por lo que para la ejecución de “nova-manage db sync” es necesario tener instalado su ORM utilizando el modulo de python-mysqldb.

nova-controller.sh

service nova-api restart
service nova-cert restart
service nova-consoleauth restart
service nova-scheduler restart
service nova-conductor restart
service nova-novncproxy restart

Por ultimo no queda mas que reiniciar cada uno de los servicios para que estos utilicen los cambios realizados en el archivo de configuración.

Instalación “manual” de OpenStack – Servicio de Imagenes (perspectiva desarrollador)

Toca el turno ahora de configurar el servicio de imagenes desde la perspectiva de desarrollador. En este caso la documentación es algo escasa, ademas de que el proceso que se tiene resulta diferente respecto al resto de los servicios.

Antes que nada, primero es necesario modificar el archivo de Vagrantfile para utilizar un script diferente para el provisionamiento.

Vagrantfile

  config.vm.define :glance do |glance|
    glance.vm.hostname = 'glance-precise64'
    glance.vm.network :private_network, ip: '192.168.50.13'
    glance.vm.network :forwarded_port, guest: 9292, host: 9292
    #glance.vm.provision "shell", path: "glance.sh"
    glance.vm.provision "shell", path: "glance_dev.sh"
  end

Este nuevo script comenzara con la instalación de dependencias que require el código fuente de glance. La documentación oficial menciona que para Ubuntu puede utilizarse “sudo apt-get build-dep glance” para instalar las dependencias, en lo personal al utilizar ese comando he detectado la falta de algunas dependencias, por lo que he preferido especificar cada una de ellas.

glance_dev.sh

apt-get update
apt-get install --no-install-recommends -qqy git screen python-pip python-virtualenv python-dev libxml2-dev libxslt1-dev libsasl2-dev libsqlite3-dev libldap2-dev libffi-dev libmysqlclient-dev libpq-dev

Una vez que se tiene todo lo necesario, procedemos a descargar el código fuente, con este podremos generar un ambiente virtual desde el cual se agregaran mas dependencias solo que esta vez serán agregadas al ambiente virtual.

glance_dev.sh

git clone https://github.com/openstack/glance.git
cd glance
 
python tools/install_venv.py
. .venv/bin/activate
python setup.py develop

Una vez instalado las dependencias necesarias, es necesario modificar los archivos de configuración para especificar la ruta del archivo de bitácora, ademas de la ubicación de los archivos que contendrán almacenaran los datos.

glance_dev.sh

glance-manage --config-file etc/glance-registry.conf db_sync
glance-manage --config-file etc/glance-api.conf db_sync

Por ultimo, solo nos queda iniciar los servicios. El metodo recomendable para hacerlo es a traves de el comando “glance-control”, desafortunadamente al especificar el archivo de configuración este comando genera aun error. Por el momento utilizaremos sesiones de screen para mantener en segundo plano la ejecución del servicio.

glance_dev.sh

screen -dmS "glance_api_service" tools/with_venv.sh glance-api --config-file etc/glance-api.conf --debug
screen -dmS "glance_registry_service" tools/with_venv.sh glance-registry --config-file etc/glance-registry.conf --debug

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

Ahora es momento de instalar el servicio para manejar imagenes, el cual tiene como nombre de proyecto el de “Glance”. Su origen se remonta desde su liberación en el release de Bexar el 3 de febrero del 2011, y a lo largo de distintas versiones se han ido incorporando nuevas funcionalidades como lo son el soporte a distintos tipos de imagenes(Cactus), el poder compartir una imagen entre varios tenants(Diablo), el replicado de imagenes a traves de glance-replicator(Folsom), la exposición del estatus de los servicios por medio de glance-control(Grizzly) y la incorporación de una estrategia basada en la localización(Ice House).

La arquitectura de Glance esta compuesta por dos componentes:

  • glance-api. El cual acepta llamadas a la API para poder descubrir, recuperar y almacenar imagenes.
  • glance-registry. Almacena, procesa y recupera la información de las imagenes. Dicha información incluye tamaño tipo, etc.

Para su instalación sera necesario modificar nuevamente el archivo Vagrantfile para incorporar este nuevo servicio, de tal forma que agregaremos la siguiente sección:

Vagrantfile

  config.vm.define :glance do |glance|
    glance.vm.hostname = 'glance-precise64'
    glance.vm.network :private_network, ip: '192.168.50.13'
    glance.vm.network :forwarded_port, guest: 9292, host: 9292
    glance.vm.provision "shell", path: "glance.sh"
  end

Asignaremos la siguiente IP disponible y habilitaremos el puerto 9292 para permitir la comunicación desde el exterior. Al igual que otras instalaciones, los pasos a realizar son similares, los cuales se pueden resumir en la instalación de paquetes, generación de tablas, configuración y reinicio de servicios.

Para la instalación de servicios, en el caso de Ubuntu, sera necesario registrar el repositorio que se utilizara de acuerdo a la version deseada, en este caso es “IceHouse”.

glance.sh

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 glance

Una vez instalado los paquetes necesarios, varios archivos de configuración son creados por defecto, los cuales tendremos que modificar para consumir los servicios que ofrece Keystone. Por otra parte, el motor de base de datos que se usa por defecto es sqlite, por lo que es necesario modificar el archivo de configuración para utilizar el servidor de MySQL que creamos previamente.

glance.sh

sed -i.bak "s/auth_host = 127.0.0.1/auth_host = 192.168.50.12/g" /etc/glance/glance-api.conf
sed -i.bak "s/%SERVICE_TENANT_NAME%/service/g" /etc/glance/glance-api.conf
sed -i.bak "s/%SERVICE_USER%/glance/g" /etc/glance/glance-api.conf
sed -i.bak "s/%SERVICE_PASSWORD%/secure/g" /etc/glance/glance-api.conf
sed -i.bak "s/#flavor=/flavor=keystone/g" /etc/glance/glance-api.conf
 
sed -i.bak "s/auth_host = 127.0.0.1/auth_host = 192.168.50.12/g" /etc/glance/glance-registry.conf
sed -i.bak "s/%SERVICE_TENANT_NAME%/service/g" /etc/glance/glance-registry.conf
sed -i.bak "s/%SERVICE_USER%/glance/g" /etc/glance/glance-registry.conf
sed -i.bak "s/%SERVICE_PASSWORD%/secure/g" /etc/glance/glance-registry.conf
sed -i.bak "s/#flavor=/flavor=keystone/g" /etc/glance/glance-registry.conf
 
sqlite="sqlite:////var/lib/glance/glance.sqlite"
mysql="mysql://glance:secure@192.168.50.11/glance"
sed -i.bak "s/#connection = /connection=${mysql//\//\\/}/g" /etc/glance/glance-registry.conf
rm -f /var/lib/glance/glance.sqlite

Es necesario generar las tablas y columnas requeridas por el Servicio de Imagenes, por lo que realizaremos la generación a traves del comando de sincronización provisto por glance-manage.

glance.sh

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

Por ultimo y para poder cargar los nuevos valores de configuracion, necesitaremos reiniciar tanto el servicio de registro como el de la API.

glance.sh

service glance-registry restart
service glance-api restart

Nota: el código utilizado a lo largo de esta publicación estará disponible en el mismo repositorio.

Instalación “manual” de OpenStack – Servicio de Identidad (perspectiva desarrollador)

Ahora es momento de explicar que pasos son requeridos para poder consumir y depurar el código fuente del Servicio de Identidad, o mejor conocido como Keystone.

En términos generales los pasos a realizar son muy sencillos y pueden resumirse en los siguientes:

  • Instalación de paquetes necesarios
  • Descarga del código fuente
  • Personalización de valores de configuración
  • Generación de tablas
  • Inicio de servicio

Todos los pasos a realizar serán agregados a un nuevo script llamado “keystone_dev.sh”, el cual podrá ser utilizado desde nuestro proyecto en vagrant. No esta por de mas mencionar que el código utilizado a lo largo de esta publicación estará disponible en el mismo repositorio.

Lo primero que haremos sera modificar el archivo Vagrantfile para poder ejecutar el script keystone_dev.sh

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"
    keystone.vm.provision "shell", path: "keystone_dev.sh"
  end

Comenzare el script almacenando un par de variables que pueden servir en caso de querer agregar roles, cuentas, servicios, etc. No son parte indispensable del proceso, pero son de gran utilidad para manipular datos en el momento de hacer pruebas.

keystone_dev.sh

#!/bin/bash
token=`openssl rand -hex 10`
echo "export SERVICE_TOKEN=${token}" >> openrc
echo "export SERVICE_ENDPOINT=http://127.0.0.1:35357/v2.0" >> openrc

La documentación oficial recomienda para Ubuntu la instalacion de solo algunos paquetes necesarios como lo son: python-dev, libxml2-dev, libxslt1-dev, libsasl2-dev, libsqlite3-dev, libssl-dev, libldap2-dev y libffi-dev, para complementar la lista seran agregados varios paquetes para facilitar el desarrollo.

keystone_dev.sh

apt-get update
apt-get install --no-install-recommends -qqy git screen python-pip python-virtualenv python-dev libxml2-dev libxslt1-dev libsasl2-dev libsqlite3-dev libssl-dev libldap2-dev libffi-dev

Una vez instalado las dependencias necesarias para nuestro ambiente de desarrollo, procederemos a descargar el código fuente mas reciente desde el repositorio oficial.

keystone_dev.sh

git clone https://github.com/openstack/keystone.git
cd keystone

Nuevamente instalaremos mas dependencias requeridas por el proyecto, solo que estas librerías serán almacenadas en un ambiente virtual de python llamado “.venv”. Por ultimo creamos un archivo de configuración con base en una plantilla proporcionada por el código fuente descargado.

keystone_dev.sh

python tools/install_venv.py
cp etc/keystone.conf.sample etc/keystone.conf
sed -i.bak "s/#admin_token=ADMIN/admin_token=${token}/g" etc/keystone.conf

Al sincronizar la base de datos, las tablas y columnas generadas serán almacenados en el archivo definido por la configuración que especificamos previamente.

keystone_dev.sh

tools/with_venv.sh bin/keystone-manage db_sync

Por ultimo, solo nos queda levantar el servicio para poder ser consumido por otras herramientas. Por lo que iniciaremos una instancia de screen donde estará corriendo el servicio.

keystone_dev.sh

screen -dmS "keystone_service" tools/with_venv.sh bin/keystone-all

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:secure@192.168.50.11/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=admin@example.com
keystone user-role-add --user=admin --tenant=admin --role=admin
keystone user-create --name=glance --pass=secure --email=glance@example.com
keystone user-role-add --user=glance --tenant=service --role=admin
keystone user-create --name=nova --pass=secure --email=nova@example.com
keystone user-role-add --user=nova --tenant=service --role=admin
keystone user-create --name=neutron --pass=secure --email=neutron@example.com
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.

Instalación “manual” de OpenStack – Servicio de Mensajería y Base de Datos

Esta serie de publicaciones no pretende ser un manual de instalación, por el contrario, solo pretende recabar las experiencias aprendidas a lo largo de su instalación y uso para complementar así los manuales existentes. El código mostrado y utilizado a lo largo de estas publicaciones estará disponible en el repositorio vagrant-manual-openstack de mi cuenta personal de github.

Cabe mencionar que actualmente son usados masivamente dos sistema operativos por la comunidad para instalar los servicios de OpenStack: Ubuntu y RedHat. En este caso, utilizare Vagrant como herramienta para la automatización de instalación y configuración de los ambientes, y por ello haré uso del box “precise64″ que es Ubuntu, quizá luego muestre los pasos para RedHat. Por otra parte, esta instalación tiene como objetivo central el ser distribuida, resultando en varias maquinas virtuales ofreciendo cada una de ellas un servicio especifico. Su configuración sera llevada a cabo a través del archivo Vagrantfile especificando los detalles técnicos para cada una de ellas.

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :
 
VAGRANTFILE_API_VERSION = "2"
 
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = 'puphpet/ubuntu1404-x64'
 
  config.vm.define :rabbitmq do |rabbitmq|
    rabbitmq.vm.hostname = 'rabbitmq-precise64'
    rabbitmq.vm.network :private_network, ip: '192.168.50.10'
    rabbitmq.vm.network :forwarded_port, guest: 5672 , host: 5672 
    rabbitmq.vm.provision "shell", path: "rabbitmq.sh"
  end
 
  config.vm.define :mysql do |mysql|
    mysql.vm.hostname = 'mysql-precise64'
    mysql.vm.network :private_network, ip: '192.168.50.11'
    mysql.vm.network :forwarded_port, guest: 3306, host: 3306
    mysql.vm.provision "shell", path: "mysql.sh"
  end
end

Como proceso de post-instalación y configuración de cada maquina, he creado un script para cada maquina que contiene los pasos necesarios. Comenzare con la instalación del servicio de mensajería, para ello utilizare RabbitMQ, su proceso de instalación es muy sencillo y directo por lo que su script resulta en el siguiente:

rabbitmq.sh

#!/bin/bash
 
# 1. Instalación de servicio de mensajeria
apt-get update
apt-get --no-install-recommends -qqy install rabbitmq-server

Otro servicio que requerimos es el de un motor de base de datos, donde todos los servicios podrán almacenar sus datos de manera optima y centralizada. Al ser instalado los servicios de OpenStack, como lo es Keystone, Glance, Nova, etc. utilizan por defecto SQLite como medio de persistencia, sus capacidades pueden llegar a ser limitadas ignorando partes esenciales requeridas en la computación de la nube, como lo son la escalabilidad y alta disponibilidad, es quizá por ello que la comunidad ha optado por el uso de MySQL (quizá mas delante podremos ver configuraciones con MariaDB) es por ello y para fines prácticos utilizaremos dicho motor de base de datos. En teoría, OpenStack puede soportar cualquier administradores de bases de datos.

A continuación no solo mostrare las instrucciones necesarias para la instalación y configuración de la base de datos, también incluiré los pasos necesarios para la generación de bases de datos necesarias para cada servicio de OpenStack que posteriormente instalaremos.

mysql.sh

#!/bin/bash
 
# 1. Instalacion de servidor de base de datos
apt-get update
debconf-set-selections <<< 'mysql-server mysql-server/root_password password secure'
debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password secure'
apt-get install -qqy mysql-server
 
# 2. Configuracion necesaria para acceso remoto
sed -i.bak "s/127.0.0.1/192.168.50.11/g" /etc/mysql/my.cnf
sed -i.bak "s/key_buffer/#key_buffer/g" /etc/mysql/my.cnf
sed -i.bak "s/myisam-recover/#myisam-recover/g" /etc/mysql/my.cnf
service mysql restart
 
# 3 Creacion de bases de datos de OpenStack
 
# 3.1 Creacion de base de datos para Keystone
echo "CREATE DATABASE keystone;" >> create_keystone.sql
echo "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'secure';" >> create_keystone.sql
echo "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'secure';" >> create_keystone.sql
 
mysql -uroot -psecure < create_keystone.sql
 
# 3.2 Creacion de bases de datos para Glance
echo "CREATE DATABASE glance CHARACTER SET utf8 COLLATE utf8_general_ci;" >> create_glance.sql
echo "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'secure';" >> create_glance.sql
echo "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'secure';" >> create_glance.sql
 
mysql -uroot -psecure < create_glance.sql
 
# 3.3 Creacion de base de datos para Nova
echo "CREATE DATABASE nova;" >> create_nova.sql
echo "GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'secure';" >> create_nova.sql
echo "GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'secure';" >> create_nova.sql
 
mysql -uroot -psecure < create_nova.sql
 
# 3.4 Creacion de base de datos para Neutron
echo "CREATE DATABASE neutron;" >> create_neutron.sql
echo "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'secure';" >> create_neutron.sql
echo "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'secure';" >> create_neutron.sql
 
mysql -uroot -psecure < create_neutron.sql

Nota: A diferencia del resto de las base de datos, Glance requiere ser configurada con un recompilación especifico(CHARACTER SET utf8 COLLATE utf8_general_ci), dicha característica esta en proceso de ser corregida en el código fuente.

OpenStack Fundamentos

openstack-cloud-software-vertical-large

OpenStack es un proyecto de código abierto creado hace mas de cuatro años por Rackspace y la NASA. Su finalidad es proveer un sistema que permita controlar un amplio grupo de recursos de computo, almacenamiento y redes de un centro de datos, todos ellos administrados desde un punto central. En otras palabras, dicha plataforma ofrece soluciones de Infraestructura a través de APIs (Servicios Web con arquitectura Restful).

Su masificación y popularización a lo largo de estos años ha ido creciendo de manera constante, lo cual ha permitido a compañías de distintos tamaños hacer uso de ella. Hoy en día cuenta con un total de 2,914,963 de lineas de código en su mayoría escritas en python y provistas por una comunidad de 2,556 miembros. Fuentes de información resumida y detallada.

Cada seis meses la comunidad global de OpenStack se reune para completar el ciclo de desarrollo y liberar la siguiente versión del código de fuente.

Release Name Release Date
Austin 21 de octubre del 2010
Bexar 3 de febrero del 2011
Cactus 15 de abril del 2011
Diablo 22 de septiembre del 2011
Essex 5 de abril del 2012
Folsom 27 de septiembre del 2012
Grizzly 4 de abril del 2013
Havana 17 de octubre del 2013
Icehouse 17 de abril del 2014
Juno 16 de octubre del 2014
Kilo abril del 2015

Nota: En las siguientes publicaciones mostrare los pasos para instalar OpenStack Ice House en un Ubuntu 12.04 LTS “precise”.

Devstack

Comenzar a trabajar con OpenStack puede ser algo complicado ya que cuenta con varios componentes interconectados entre si, su instalación necesita la configuración adecuada de cada uno de los servicios y la correcta instalación de los paquetes requeridos, esta tarea en muchas ocasiones es repetitiva para muchos operadores y ardua para los desarrolladores. Es por ello que fue creado Devstack, su propósito fundamental es proveer de un entorno de desarrollo de una manera muy rápida y de la forma mas sencilla posible. Su instalación se podría resumir en solo tres simples pasos:

  • Descarga de los scripts necesarios
  • electrocucaracha@precise64:~$ git clone https://github.com/openstack-dev/devstack.git
  • Configuracion de servicios a ser habilitados y asignación de contraseñas
  • electrocucaracha@precise64:~$ cat <<EOL > devstack/local.conf
    > [[local|localrc]]
    > ADMIN_PASSWORD=password
    > DATABASE_PASSWORD=password
    > RABBIT_PASSWORD=password
    > SERVICE_PASSWORD=password
    > SERVICE_TOKEN=a682f596-76f3-11e3-b3b2-e716f9080d50
    > EOL
  • Ejecución…
  • electrocucaracha@precise64:~$ cd devstack; ./stack.sh

    Nota : Cabe señalar que en los pasos previos han sido omitida la instalación de git.

    Una vez iniciada su instalación solo es cuestión de esperar unos minutos, dependiendo de la velocidad de la red y otros factores, a que el script termine su ejecución. En caso de querer trabajar con Devstack, he creado un repositorio(https://github.com/electrocucaracha/vagrant-minimal-devstack) con las instrucciones mínimas necesarias para conseguirlo, solo es necesario contar con Vagrant y Virtualbox en la maquina a realizar la prueba.

    Creando agentes para envio de bitácoras

    Para completar la publicación anterior, es necesario instalar un agente que sea responsable de enviar el contenido de las bitácoras a nuestro repositorio central. Para ello utilizaremos los mismos pasos para la instalación de logstash, con cambios en la configuración.

    Instalación de logstash

    electrocucaracha@precise64:~# add-apt-repository ppa:webupd8team/java
    electrocucaracha@precise64:~# apt-get update
    electrocucaracha@precise64:~# apt-get install oracle-java7-installer
    electrocucaracha@precise64:~# cd /opt/
    electrocucaracha@precise64:~# wget https://download.elasticsearch.org/logstash/logstash/logstash-1.4.0.tar.gz
    electrocucaracha@precise64:~# tar -xvf logstash-1.4.0.tar.gz
    electrocucaracha@precise64:~# cat <<EOL > /etc/logstash-shipper-redis.conf
    >input {
    >  file {
    >    type => "nova"
    >    start_position => "beginning"
    >    path => [
    >             "/var/log/nova/nova.log",
    >             "/var/log/nova/nova-api.log",
    >             "/var/log/nova/nova-manage.log",
    >             "/var/log/nova/nova-compute.log"
    >    ]
    >  }
    >}
    >filter {
    >  if [type] == "nova" {
    >    grok {
    >      match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{AUDITLOGLEVEL:level} %{PROG:program} %{GREEDYDATA:message}" }
    >    }
    >    multiline {
    >      pattern => "^(([0-9]+-(?:0?[1-9]|1[0-2])-(?:3[01]|[1-2]?[0-9]|0?[1-9]))|((?:0?[1-9]|1[0-2])/(?:3[01]|[1-2]?[0-9]|0?[1-9]))).*$"
    >      negate => true
    >      what => "previous"
    >    }
    >  }
    >}
    >output {
    >  redis {
    >    host => [ "mi_servidor_redis.com" ]
    >    data_type => 'list'
    >    key => 'logstash'
    >    batch => true
    >  }
    >}
    EOL
    electrocucaracha@precise64:~# bin/logstash -f /etc/logstash-indexer-redis.conf

    Solo hace falta configurar el agente para que inicie como servicio. Para ello utilizare Ubuntu upstart.

    Instalación de logstash

    electrocucaracha@precise64:~# cat <<EOL >/etc/init/logshipper.conf
    >description     "logstash shipper agent"
    >
    >start on (net-device-up
    >          and local-filesystems
    >          and runlevel [2345])
    >
    >stop on runlevel [016]
    >
    >respawn
    >respawn limit 10 30
    >
    ># NB: Upstart scripts do not respect
    ># /etc/security/limits.conf, so the open-file limits
    ># settings need to be applied here.
    >limit nofile 32000 32000
    >
    >console log
    >
    >script
    >  exec sudo /opt/logstash-1.4.0/bin/logstash agent -f /etc/logstash-shipper-redis.conf
    >end script
    EOL

    Implementando un sistema centralizado de bitácoras

    Arquitectura general

    Dada la naturaleza de la nube, cada vez es mas común que un administrador sea responsable de varios cientos o quizá miles de servidores. No olvidemos que cada servidor cuenta con cierto nivel de dinamismo donde se procesa cantidad de datos resultando en la generación de eventos, estos últimos registran su actividad en las bitácoras o entradas en el sistema. Estos datos contienen información valiosa que nos puede servir para prevenir fallas en los equipos.

    Desgraciadamente la información que se generada por cada uno de los sistemas supera por mucho la capacidad de análisis que un operador puede realizar de manera cotidiana como parte de sus actividades de prevención en los equipos, es por ello que su análisis lejos de ser una actividad preventiva termina siendo una actividad reactiva. No obstante, muchas aplicaciones se encuentran distribuidas en varios equipos o su interacción implica el uso de varios servidores, lo cual agrava aun mas el poder determinar la principal causa de un problema.

    Es aquí donde nace la necesidad de contar con un sistema central de registros. Donde se busca el que los datos generados sean enviados y almacenados en un lugar único, para así mas tarde puedan ser procesados y consultados en tiempo real con el fin de prevenir posibles fallas.

    Logstash es una herramienta que maneja eventos y registros de las bitácoras. Ademas, su uso en conjunto con otras herramientas como redis, elasticsearch y kibana, nos permite crear un sistema central de registros.

    En esta ocasión, tratare de cubrir los pasos básicos para su instalación. Con el fin de tener una arquitectura modular es recomendable la utilización varios servidores, ademas nos permitirá un crecimiento horizontal en caso de tener una carga excesiva de datos.

    Arquitectura de componentes

    El primer componente que configuraremos es el negociador(“broker), su función es la de regular el flujo de datos que entran a nuestro sistema. Para ello utilizaremos una base de datos de tipo diccionario muy robusta como lo es Redis.

    Instalación de redis

    electrocucaracha@precise64:~# apt-get install build-essential
    electrocucaracha@precise64:~# cd /opt/
    electrocucaracha@precise64:~# wget http://download.redis.io/releases/redis-2.8.8.tar.gz
    electrocucaracha@precise64:~# tar -xvf redis-2.8.8.tar.gz
    electrocucaracha@precise64:~# cd /redis-2.8.8
    electrocucaracha@precise64:~# make
    electrocucaracha@precise64:~# src/redis-server

    Como segundo componente necesario es el indexador(“indexer), el cual nos permite ir procesando la información almacenada por el negociador. Para ello no solo es necesario instalar el servicio, también se requiere especificar las direcciones tanto del negociador(como origen de los datos) como del destino(como análisis de información).

    Instalación de logstash

    electrocucaracha@precise64:~# add-apt-repository ppa:webupd8team/java
    electrocucaracha@precise64:~# apt-get update
    electrocucaracha@precise64:~# apt-get install oracle-java7-installer
    electrocucaracha@precise64:~# cd /opt/
    electrocucaracha@precise64:~# wget https://download.elasticsearch.org/logstash/logstash/logstash-1.4.0.tar.gz
    electrocucaracha@precise64:~# tar -xvf logstash-1.4.0.tar.gz
    electrocucaracha@precise64:~# cat <<EOL > /etc/logstash-indexer-redis.conf
    >input {
    >  redis {
    >    host => "mi_servidor_redis.com"
    >    data_type => "list"
    >    key => "logstash"
    >  }
    >}
    >output {
    >  elasticsearch {
    >    host => "mi_servidor_elasticsearch.com"
    >  }
    >}
    EOL
    electrocucaracha@precise64:~# bin/logstash -f /etc/logstash-indexer-redis.conf

    El tercer componente sera una otra base de datos que nos permitirá consumirlos desde una interfaz gráfica. Para esta base de datos utilizaremos elasticsearch y su instalación se realiza de la siguiente manera.

    Instalación de elasticsearch

    electrocucaracha@precise64:~# add-apt-repository ppa:webupd8team/java
    electrocucaracha@precise64:~# apt-get update
    electrocucaracha@precise64:~# apt-get install oracle-java7-installer
    electrocucaracha@precise64:~# cd /opt
    electrocucaracha@precise64:~# wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.0.1.tar.gz
    electrocucaracha@precise64:~# tar -xvf elasticsearch-1.0.1.tar.gz
    electrocucaracha@precise64:~# cd elasticsearch-1.0.1/
    electrocucaracha@precise64:~# ./bin/elasticsearch

    El ultimo componente y no por ello el menos importante es la interfaz gráfica. Es necesario contar con un elemento que nos permita desplegar la información procesada y que mejor que tomar ventaja de las bondades de node.js con kibana.

    Instalación de kibana

    electrocucaracha@precise64:~# apt-get install -y apache2
    electrocucaracha@precise64:~# wget https://download.elasticsearch.org/kibana/kibana/kibana-3.0.1.tar.gz
    electrocucaracha@precise64:~# tar -xvf kibana-3.0.1.tar.gz
    electrocucaracha@precise64:~# cd kibana-3.0.1
    electrocucaracha@precise64:~# cp -R * /var/www/

    Hasta el momento solo hemos creado la infraestructura que almacenara, procesara y mostrara los datos. En la siguiente publicación mostrare como los clientes pueden utilizar este sistema.