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.