Placement se encarga del seguimiento de los recursos físicos disponibles y asiste a Nova en la planificación de las asignaciones. En esta guía, instalaremos y configuraremos Placement en el nodo controller01 utilizando paquetes de Ubuntu y definiremos los pasos mínimos para verificar su funcionamiento.

Requisitos previos

Antes de empezar, asegúrate de tener:

  • Keystone instalado y accesible.
  • Una base de datos MySQL/MariaDB disponible.
  • Credenciales administrativas (admin-openrc) para crear usuarios y servicios.

Crear la base de datos

Nos conectaremos al servidor de la base de datos como root para crear la base de datos de Placement:

vagrant@controller01:~$ sudo mysql

Creo la base de datos y doy permisos al usuario placement (sustituye PLACEMENT_DBPASS):

CREATE DATABASE placement;
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' IDENTIFIED BY 'PLACEMENT_DBPASS';
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' IDENTIFIED BY 'PLACEMENT_DBPASS';

Finalmente, salimos del cliente de la base de datos.

Crear el usuario y los endpoints del servicio

Cargaremos las credenciales de administrador para trabajar con la CLI de OpenStack:

vagrant@controller01:~$ source admin-openrc

Crearemos el usuario placement en Keystone (utiliza PLACEMENT_PASSWORD como contraseña de ejemplo):

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

Añadiremos el rol admin al usuario dentro del proyecto service:

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

Registraremos el servicio Placement en el catálogo de Keystone:

vagrant@controller01:~$ openstack service create --name placement --description "Placement API" placement
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| id          | 845aa6ed076f4adab229902844c50f9b |
| name        | placement                        |
| type        | placement                        |
| enabled     | True                             |
| description | Placement API                    |
+-------------+----------------------------------+

Crearemos los endpoints públicos, internos y de administración, apuntando al puerto 8778:

vagrant@controller01:~$ openstack endpoint create --region RegionOne placement public http://controller01:8778 
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 74fee05c44b7436ab141ab81d2febc5b |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 845aa6ed076f4adab229902844c50f9b |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://controller01:8778         |
+--------------+----------------------------------+
vagrant@controller01:~$ openstack endpoint create --region RegionOne placement internal http://controller01:8778
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | f7395645747e47298201d6620c7c1102 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 845aa6ed076f4adab229902844c50f9b |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://controller01:8778         |
+--------------+----------------------------------+
vagrant@controller01:~$ openstack endpoint create --region RegionOne placement admin http://controller01:8778
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 8cf1ef59f4114fa39ecbb011363e4648 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 845aa6ed076f4adab229902844c50f9b |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://controller01:8778         |
+--------------+----------------------------------+

Nota: el puerto puede variar en tu entorno (por ejemplo 8780).

Instalar los componentes

Instalaremos el paquete del servicio Placement:

vagrant@controller01:~$ sudo apt install placement-api -y

Configurar Placement

Editaremos el archivo de configuración principal para definir la conexión con la base de datos y Keystone:

vagrant@controller01:~$ sudo nano /etc/placement/placement.conf

En la sección de la base de datos, configuraremos la cadena de conexión (sustituye PLACEMENT_DBPASS por la contraseña definida):

[placement_database]
connection = mysql+pymysql://placement:PLACEMENT_DBPASS@controller01/placement

En [api] y [keystone_authtoken] habilito Keystone y pongo las credenciales del servicio (reemplaza PLACEMENT_PASS):

[api]
auth_strategy = keystone

[keystone_authtoken]
auth_url = http://controller01:5000/v3
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = placement
password = PLACEMENT_PASS

Comenta o elimina opciones conflictivas si las encuentras.

Sincronizar la base de datos

Ejecutaremos la creación de las tablas mediante el comando placement-manage:

vagrant@controller01:~$ sudo su -s /bin/sh -c "placement-manage db sync" placement

Puedes ignorar advertencias deprecatorias si no afectan al proceso.

Finalizar la instalación

Reiniciaremos Apache (Placement se sirve habitualmente mediante mod_wsgi):

vagrant@controller01:~$ sudo service apache2 restart

Verificación

Verificaremos el estado del servicio utilizando placement-status:

vagrant@controller01:~$ sudo -u placement placement-status upgrade check
+-------------------------------------------+
| Upgrade Check Results                     |
+-------------------------------------------+
| Check: Missing Root Provider IDs          |
| Result: Success                           |
| Details: None                             |
+-------------------------------------------+
| Check: Incomplete Consumers               |
| Result: Success                           |
| Details: None                             |
+-------------------------------------------+
| Check: Policy File JSON to YAML Migration |
| Result: Success                           |
| Details: None                             |
+-------------------------------------------+

Finalmente, probaremos la API de Placement listando las clases de recursos:

vagrant@controller01:~$ openstack --os-placement-api-version 1.2 resource class list --sort-column name
+----------------------------------------+
| name                                   |
+----------------------------------------+
| DISK_GB                                |
| FPGA                                   |
| IPV4_ADDRESS                           |
| MEMORY_MB                              |
| MEM_ENCRYPTION_CONTEXT                 |
| NET_BW_EGR_KILOBIT_PER_SEC             |
| NET_BW_IGR_KILOBIT_PER_SEC             |
| NET_PACKET_RATE_EGR_KILOPACKET_PER_SEC |
| NET_PACKET_RATE_IGR_KILOPACKET_PER_SEC |
| NET_PACKET_RATE_KILOPACKET_PER_SEC     |
| NUMA_CORE                              |
| NUMA_MEMORY_MB                         |
| NUMA_SOCKET                            |
| NUMA_THREAD                            |
| PCI_DEVICE                             |
| PCPU                                   |
| PGPU                                   |
| SRIOV_NET_VF                           |
| VCPU                                   |
| VGPU                                   |
| VGPU_DISPLAY_HEAD                      |
+----------------------------------------+

Si obtienes una lista (aunque vacía) sin errores, Placement está operativo.