Este documento describe cómo instalar y configurar el servicio Compute, en nuestro caso Nova, en el nodo controlador (controller01).

Requisitos previos

Antes de empezar, asegúrate de tener las bases de datos y las credenciales de Keystone básicas creadas (admin-openrc disponible).

Crear las bases de datos (en controller01)

Me conecto al servidor SQL como root para crear las bases necesarias:

vagrant@controller01:~$ sudo mysql

Creo las bases de datos nova_api, nova y nova_cell0:

CREATE DATABASE nova_api;
CREATE DATABASE nova;
CREATE DATABASE nova_cell0;

Concedo los permisos a la cuenta nova (reemplaza NOVA_DBPASS por tu contraseña):

GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';

GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';

GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';

Salgo del cliente cuando termino:

exit;

Crear credenciales del servicio (en controller01)

Cargo las variables del entorno del administrador para ejecutar comandos de Keystone:

vagrant@controller01:~$ source admin-openrc 

Creo el usuario de servicio nova (usa NOVA_PASSWORDS como ejemplo de contraseña):

vagrant@controller01:~$ openstack user create --domain default --password NOVA_PASSWORDS nova
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| default_project_id  | None                             |
| domain_id           | default                          |
| email               | None                             |
| enabled             | True                             |
| id                  | 5da398a114604a278117a4e071796e91 |
| name                | nova                             |
| description         | None                             |
| password_expires_at | None                             |
+---------------------+----------------------------------+

Asigno el rol admin al usuario nova dentro del proyecto service:

vagrant@controller01:~$ openstack role add --project service --user nova admin

Registro la entidad de servicio nova en Keystone:

vagrant@controller01:~$ openstack service create --name nova --description "OpenStack Compute" compute
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| id          | 28cdb92573e7483283b156df041352de |
| name        | nova                             |
| type        | compute                          |
| enabled     | True                             |
| description | OpenStack Compute                |
+-------------+----------------------------------+

Crear los endpoints de la API (en controller01)

A continuación creo los endpoints públicos, internos y admin para el servicio de cómputo:

vagrant@controller01:~$ openstack endpoint create --region RegionOne compute public http://controller01:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | ff46aff4339b4ecfa650cbc08cc38816 |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 28cdb92573e7483283b156df041352de |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://controller01:8774/v2.1      |
+--------------+----------------------------------+
vagrant@controller01:~$ openstack endpoint create --region RegionOne compute internal http://controller01:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | e65163fd3ebe48b69d7ec9982be66cf1 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 28cdb92573e7483283b156df041352de |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://controller01:8774/v2.1      |
+--------------+----------------------------------+
vagrant@controller01:~$ openstack endpoint create --region RegionOne compute admin http://controller01:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 6ef7e3b07f1a46b288ec200212c0547e |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 28cdb92573e7483283b156df041352de |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://controller01:8774/v2.1      |
+--------------+----------------------------------+

Instalar y configurar los componentes de Nova (en controller01)

Instalo los paquetes de controlador que necesito en este nodo:

vagrant@controller01:~$ sudo apt install nova-api nova-conductor nova-novncproxy nova-scheduler -y

Edito el archivo /etc/nova/nova.conf y realizo los siguientes cambios:

Sección [api_database] y [database]

Configuro las cadenas de conexión a las bases de datos creadas (reemplaza NOVA_DBPASS):

[api_database]
connection = mysql+pymysql://nova:NOVA_DBPASS@controller01/nova_api

[database]
connection = mysql+pymysql://nova:NOVA_DBPASS@controller01/nova

Sección [DEFAULT]

En [DEFAULT] indico la conexión a RabbitMQ y la IP de gestión del controlador (my_ip):

[DEFAULT]
transport_url = rabbit://openstack:RABBIT_PASS@controller01:5672/
my_ip = 10.0.0.2

Sección [keystone_authtoken]

Configuro el acceso a Keystone para validar tokens:

[keystone_authtoken]
www_authenticate_uri = http://controller01:5000/
auth_url = http://controller01:5000/
memcached_servers = controller01:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = NOVA_PASS

Sección [service_user]

Habilito el token de servicio y apunto al endpoint v3:

[service_user]
send_service_user_token = true
auth_url = http://controller01:5000/v3
auth_type = password
project_domain_name = Default
project_name = service
user_domain_name = Default
username = nova
password = NOVA_PASS

Sección [vnc]

Configuro VNC para que use la IP de gestión:

[vnc]
enabled = true
server_listen = $my_ip
server_proxyclient_address = $my_ip

Sección [glance]

Indico la URL del servicio Glance para que Nova pueda recuperar imágenes:

[glance]
api_servers = http://controller01:9292

Sección [oslo_concurrency]

Directorio para bloqueos temporales:

[oslo_concurrency]
lock_path = /var/lib/nova/tmp

Sección [placement]

Conecto Nova con el servicio Placement (reemplaza PLACEMENT_PASS):

[placement]
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller01:5000/v3
username = placement
password = PLACEMENT_PASS

Inicializar las bases de datos de Nova (en controller01)

Ejecuto los comandos de nova-manage para sincronizar esquemas y crear la celda adicional:

vagrant@controller01:~$ sudo su -s /bin/sh -c "nova-manage api_db sync" nova
vagrant@controller01:~$ sudo su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
vagrant@controller01:~$ sudo su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
vagrant@controller01:~$ sudo su -s /bin/sh -c "nova-manage db sync" nova

Verifico que las celdas estén registradas correctamente:

vagrant@controller01:~$ sudo su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
+-------+--------------------------------------+------------------------------------------+-------------------------------------------------+----------+
|  Name |                 UUID                 |              Transport URL               |               Database Connection               | Disabled |
+-------+--------------------------------------+------------------------------------------+-------------------------------------------------+----------+
| cell0 | 00000000-0000-0000-0000-000000000000 |                  none:/                  | mysql+pymysql://nova:****@controller/nova_cell0 |  False   |
| cell1 | 29e1ed74-59fa-43e3-9651-999d592a2cdf | rabbit://openstack:****@controller01:5672/ |    mysql+pymysql://nova:****@controller/nova    |  False   |
+-------+--------------------------------------+------------------------------------------+-------------------------------------------------+----------+

Finalizar la instalación (en controller01)

Reinicio los servicios de Nova para aplicar la nueva configuración:

vagrant@controller01:~$  sudo service nova-api restart
vagrant@controller01:~$  sudo service nova-scheduler restart
vagrant@controller01:~$  sudo service nova-conductor restart
vagrant@controller01:~$  sudo service nova-novncproxy restart