Guía completa para instalar OpenStack All-In-One en Ubuntu 22.04 LTS

¡Hola entusiastas de la nube! ☁️ En este artículo te guiaré paso a paso para desplegar un entorno OpenStack All-In-One (es decir, todos los servicios en un solo servidor) sobre Ubuntu 22.04 LTS. Esta configuración es ideal para laboratorios, entornos de pruebas o para quienes recién comienzan a explorar las capacidades de OpenStack. ¡Así que prepárate una buena taza de café ☕ y empecemos!
1. ¿Qué es OpenStack y por qué un All-In-One?
OpenStack es una plataforma de software libre que nos permite crear y gestionar nubes privadas o públicas, ofreciendo servicios de computación, almacenamiento y redes de manera escalable. La instalación All-In-One significa que todos los componentes (Keystone, Glance, Nova, Neutron, Horizon, etc.) se ejecutarán en la misma máquina.
Ventajas de esta modalidad:
-
Simplicidad para quienes están aprendiendo: no necesitamos desplegar múltiples nodos.
-
Ahorro de recursos: un solo servidor (o VM) lo hace todo.
- Ideal para pruebas y demos: si algo sale mal, reinstalar es rápido y sin afectar a otros hosts.
2. Requerimientos previos
Antes de poner manos a la obra, asegúrate de contar con:
-
Sistema Operativo: Ubuntu Server 22.04 LTS actualizado.
-
Recomendación de recursos (mínimo para pruebas):
- CPU: 4 vCPUs
- RAM: 8 GB
-
Disco: 40 GB o más
-
Conectividad de red funcional.
- Usuario con privilegios sudo.
Tip: Aunque con menos recursos también puede funcionar, podrías encontrarte con problemas de rendimiento. Ajusta según tus necesidades y disponibilidad.
3. Preparación del sistema operativo
¡Manos a la obra! ✨
3.1 Actualiza los paquetes
Lo primero es asegurarnos de que Ubuntu tenga todos los paquetes al día:
sudo apt update
sudo apt upgrade -y
sudo reboot
El reinicio garantizará que estemos usando el kernel y paquetes más recientes.
3.2 Habilita el repositorio de OpenStack (Ubuntu Cloud Archive)
Ubuntu publica las versiones de OpenStack mediante el Ubuntu Cloud Archive. Para 22.04 (Jammy), podemos habilitar el repositorio correspondiente (por ejemplo, la versión “Zed” o alguna más reciente):
sudo apt install -y software-properties-common
sudo add-apt-repository cloud-archive:zed
sudo apt update
Cambia “zed” por la versión que desees (por ejemplo, “antelope” o la más nueva que aparezca).
4. Instalando servicios base: Base de datos, RabbitMQ y Memcached
OpenStack necesita varios servicios subyacentes que manejan la mensajería, la base de datos y la caché.
4.1 Instala y configura la base de datos (MariaDB)
sudo apt install -y mariadb-server python3-pymysql
Configura MariaDB para que escuche en todas las interfaces (aunque en un All-In-One no es crítico, lo hacemos por buenas prácticas):
sudo nano /etc/mysql/mariadb.conf.d/99-openstack.cnf
Agrega en la sección [mysqld]
:
bind-address = 0.0.0.0
default-storage-engine = innodb
innodb_file_per_table = on
collation-server = utf8_general_ci
character-set-server = utf8
Reinicia el servicio:
sudo systemctl enable mariadb
sudo systemctl restart mariadb
Asegura la instalación (establecer contraseña root, quitar usuarios anónimos, etc.):
sudo mysql_secure_installation
4.2 Instala RabbitMQ
RabbitMQ se encarga de las colas de mensajería que coordinan la comunicación entre los servicios de OpenStack:
sudo apt install -y rabbitmq-server
sudo systemctl enable rabbitmq-server
sudo systemctl start rabbitmq-server
Crea un usuario para OpenStack (ejemplo: openstack):
sudo rabbitmqctl add_user openstack MI_SUPERCONTRASENA
sudo rabbitmqctl set_permissions openstack ".*" ".*" ".*"
4.3 Instala Memcached (opcional, pero recomendado)
Sirve para cachear tokens de autenticación y mejorar el rendimiento:
sudo apt install -y memcached python3-memcache
Asegúrate de que sólo escuche en localhost (-l 127.0.0.1
), y reinícialo:
sudo systemctl enable memcached
sudo systemctl restart memcached
5. Keystone: El servicio de identidad
Keystone es el guardián de la autenticación y autorización en OpenStack.
5.1 Instala Keystone
sudo apt install -y keystone
5.2 Prepara la base de datos para Keystone
sudo mysql -u root -p
Dentro de la consola de MySQL:
CREATE DATABASE keystone;
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'MI_PASS_KEYSTONE';
FLUSH PRIVILEGES;
EXIT;
5.3 Configura Keystone
Edita /etc/keystone/keystone.conf
y en la sección [database]
:
nginxCopiarEditarconnection = mysql+pymysql://keystone:MI_PASS_KEYSTONE@localhost/keystone
En [token]
, configura fernet:
provider = fernet
Aplica la migración de la base de datos:
sudo su -s /bin/sh -c "keystone-manage db_sync" keystone
Genera claves de fernet:
sudo keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
sudo keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
Haz el “bootstrap” para inicializar los roles y el usuario admin:
sudo keystone-manage bootstrap --bootstrap-password adminpass \
--bootstrap-admin-url http://localhost:5000/v3/ \
--bootstrap-internal-url http://localhost:5000/v3/ \
--bootstrap-public-url http://localhost:5000/v3/ \
--bootstrap-region-id RegionOne
5.4 Integra Keystone con Apache
Keystone utiliza Apache para manejar las peticiones:
sudo systemctl enable apache2
sudo systemctl restart apache2
5.5 Crea las variables de entorno de administrador
Para no escribir credenciales a cada rato, creamos un archivo:
nano ~/admin-openrc.sh
Y pegamos:
export OS_USERNAME=admin
export OS_PASSWORD=adminpass
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://localhost:5000/v3
export OS_IDENTITY_API_VERSION=3
Cerramos y luego cargamos:
source ~/admin-openrc.sh
¡Pruébalo!:
openstack token issue
Si ves un token, Keystone funciona correctamente.
6. Glance: Administración de imágenes
Glance gestiona las imágenes que usaremos para instanciar máquinas virtuales.
6.1 Crea la base de datos y usuario de Glance
sudo mysql -u root -p
CREATE DATABASE glance;
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'MI_PASS_GLANCE';
FLUSH PRIVILEGES;
EXIT;
6.2 Crea el usuario y servicio Glance en Keystone
Recuerda tener source ~/admin-openrc.sh
activo:
openstack user create --domain default --password MI_PASS_GLANCE glance
openstack role add --project service --user glance admin
openstack service create --name glance --description "OpenStack Image Service" image
Crea los endpoints:
openstack endpoint create --region RegionOne image public http://localhost:9292
openstack endpoint create --region RegionOne image internal http://localhost:9292
openstack endpoint create --region RegionOne image admin http://localhost:9292
6.3 Instala y configura Glance
sudo apt install -y glance
Edita /etc/glance/glance-api.conf
:
[database]
connection = mysql+pymysql://glance:MI_PASS_GLANCE@localhost/glance
[keystone_authtoken]
www_authenticate_uri = http://localhost:5000
auth_url = http://localhost:5000
memcached_servers = localhost:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = glance
password = MI_PASS_GLANCE
[paste_deploy]
flavor = keystone
[glance_store]
stores = file
default_store = file
filesystem_store_datadir = /var/lib/glance/images/
Sincroniza la base de datos:
sudo su -s /bin/sh -c "glance-manage db_sync" glance
Reinicia Glance:
sudo systemctl enable glance-api
sudo systemctl restart glance-api
7. Nova: El servicio de cómputo
Nova se encarga de orquestar y gestionar las instancias (máquinas virtuales).
7.1 Prepara las bases de datos de Nova y Placement
sudo mysql -u root -p
CREATE DATABASE nova_api;
CREATE DATABASE nova;
CREATE DATABASE nova_cell0;
CREATE DATABASE placement;
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'MI_PASS_NOVA';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'MI_PASS_NOVA';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY 'MI_PASS_NOVA';
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' IDENTIFIED BY 'MI_PASS_PLACEMENT';
FLUSH PRIVILEGES;
EXIT;
7.2 Crea los usuarios y servicios en Keystone
Para Nova:
openstack user create --domain default --password MI_PASS_NOVA nova
openstack role add --project service --user nova admin
openstack service create --name nova --description "OpenStack Compute" compute
Endpoints de Nova:
openstack endpoint create --region RegionOne compute public http://localhost:8774/v2.1
openstack endpoint create --region RegionOne compute internal http://localhost:8774/v2.1
openstack endpoint create --region RegionOne compute admin http://localhost:8774/v2.1
Para Placement:
openstack user create --domain default --password MI_PASS_PLACEMENT placement
openstack role add --project service --user placement admin
openstack service create --name placement --description "OpenStack Placement" placement
Endpoints de Placement:
openstack endpoint create --region RegionOne placement public http://localhost:8778
openstack endpoint create --region RegionOne placement internal http://localhost:8778
openstack endpoint create --region RegionOne placement admin http://localhost:8778
7.3 Instala los servicios Nova y Placement
sudo apt install -y nova-api nova-conductor nova-scheduler nova-novncproxy placement-api
7.4 Configura Nova
Edita /etc/nova/nova.conf
. Asegúrate de incluir:
[api_database]
connection = mysql+pymysql://nova:MI_PASS_NOVA@localhost/nova_api
[database]
connection = mysql+pymysql://nova:MI_PASS_NOVA@localhost/nova
[DEFAULT]
transport_url = rabbit://openstack:MI_SUPERCONTRASENA@localhost
my_ip = 192.168.1.10 # Ajusta a tu IP local
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver
[api]
auth_strategy = keystone
[glance]
api_servers = http://localhost:9292
[keystone_authtoken]
www_authenticate_uri = http://localhost:5000
auth_url = http://localhost:5000
memcached_servers = localhost:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = MI_PASS_NOVA
[vnc]
enabled = true
server_listen = 0.0.0.0
server_proxyclient_address = $my_ip
[placement]
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://localhost:5000/v3
username = placement
password = MI_PASS_PLACEMENT
[wsgi]
api_paste_config = /etc/nova/api-paste.ini
7.5 Configura Placement
Algunos parámetros ya vienen en /etc/placement/placement.conf
o se comparten en nova.conf
. Verifica que aparezca:
[placement_database]
connection = mysql+pymysql://placement:MI_PASS_PLACEMENT@localhost/placement
[api]
auth_strategy = keystone
[keystone_authtoken]
www_authenticate_uri = http://localhost:5000
auth_url = http://localhost:5000
memcached_servers = localhost:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = placement
password = MI_PASS_PLACEMENT
7.6 Sincroniza las bases de datos
sudo su -s /bin/sh -c "nova-manage api_db sync" nova
sudo su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
sudo su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1" nova
sudo su -s /bin/sh -c "nova-manage db sync" nova
Verifica:
nova-manage cell_v2 list_cells
Debe mostrar cell0
y cell1
.
7.7 Inicia los servicios de Nova
sudo systemctl enable nova-api nova-conductor nova-scheduler nova-novncproxy
sudo systemctl restart nova-api nova-conductor nova-scheduler nova-novncproxy
8. Neutron: El servicio de red
Neutron administra redes, subredes y asigna direcciones IP a las instancias.
8.1 Base de datos y usuario de Neutron
sudo mysql -u root -p
CREATE DATABASE neutron;
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'MI_PASS_NEUTRON';
FLUSH PRIVILEGES;
EXIT;
8.2 Crea usuario y servicio de Neutron en Keystone
openstack user create --domain default --password MI_PASS_NEUTRON neutron
openstack role add --project service --user neutron admin
openstack service create --name neutron --description "OpenStack Networking" network
Endpoints:
openstack endpoint create --region RegionOne network public http://localhost:9696
openstack endpoint create --region RegionOne network internal http://localhost:9696
openstack endpoint create --region RegionOne network admin http://localhost:9696
8.3 Instala Neutron
sudo apt install -y neutron-server neutron-plugin-ml2 \
neutron-linuxbridge-agent neutron-dhcp-agent neutron-metadata-agent
8.4 Configura Neutron
8.4.1 Edita el archivo de configuración: /etc/neutron/neutron.conf
[database]
connection = mysql+pymysql://neutron:MI_PASS_NEUTRON@localhost/neutron
[DEFAULT]
transport_url = rabbit://openstack:MI_SUPERCONTRASENA@localhost
auth_strategy = keystone
core_plugin = ml2
service_plugins = router
[keystone_authtoken]
www_authenticate_uri = http://localhost:5000
auth_url = http://localhost:5000
memcached_servers = localhost:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = neutron
password = MI_PASS_NEUTRON
[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
8.4.2 Edita la configuración del Plugin ML2: /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers = flat,vlan,vxlan
tenant_network_types = vxlan
mechanism_drivers = linuxbridge,l2population
[ml2_type_flat]
flat_networks = external
[ml2_type_vxlan]
vni_ranges = 1:1000
[securitygroup]
enable_ipset = True
8.4.3 Edita la configuración del Agente Linux Bridge: /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[linux_bridge]
physical_interface_mappings = external:INTERFAZ_EXTERNA # Cambia a tu interfaz real, ej. eth0
[vxlan]
enable_vxlan = true
local_ip = 192.168.1.10 # La misma IP que Nova my_ip
l2_population = true
[securitygroup]
enable_security_group = true
firewall_driver = neutron.privileged.agent.linux.iptables_firewall.IptablesFirewallDriver
8.4.4 Edita la configuración del Agente DHCP: /etc/neutron/dhcp_agent.ini
[DEFAULT]
interface_driver = linuxbridge
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = true
8.4.5 Edita la configuración del Agente de Metadata: /etc/neutron/metadata_agent.ini
[DEFAULT]
nova_metadata_host = localhost
metadata_proxy_shared_secret = METADATA_SECRET
Edita /etc/nova/nova.conf
otra vez para enlazar con Neutron:
[neutron]
url = http://localhost:9696
auth_url = http://localhost:5000
auth_type = password
project_domain_name = Default
user_domain_name = Default
region_name = RegionOne
project_name = service
username = neutron
password = MI_PASS_NEUTRON
service_metadata_proxy = true
metadata_proxy_shared_secret = METADATA_SECRET
8.5 Migra la base de datos de Neutron
sudo neutron-db-manage --config-file /etc/neutron/neutron.conf \
--config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head
8.6 Inicia los servicios de Neutron
sudo systemctl enable neutron-server neutron-linuxbridge-agent neutron-dhcp-agent neutron-metadata-agent
sudo systemctl restart neutron-server neutron-linuxbridge-agent neutron-dhcp-agent neutron-metadata-agent
sudo systemctl restart nova-api nova-scheduler nova-conductor
9. Horizon: Panel web de OpenStack
¡Vamos a darle una interfaz bonita y amigable a todo esto! 🖥️
sudo apt install -y openstack-dashboard
9.1 Ajusta la configuración de Horizon
Edita /etc/openstack-dashboard/local_settings.py
:
ALLOWED_HOSTS = ['*'] # Permitir acceso desde cualquier IP (o especifícalas)
OPENSTACK_KEYSTONE_URL = "http://localhost:5000/v3"
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
Opcionalmente, revisa la configuración de sesiones y caché. Luego reinicia Apache:
sudo systemctl restart apache2
Ahora, si accedes con tu navegador a http://<IP_del_servidor>/horizon
, deberías ver la pantalla de login de OpenStack.
-
Usuario:
admin
-
Contraseña:
adminpass
(o la que hayas configurado en el bootstrap de Keystone).
10. ¡Verifiquemos que todo funciona!
Un par de comprobaciones rápidas:
- Carga las credenciales:bashCopiarEditar
source ~/admin-openrc.sh
- Lista los servicios:bashCopiarEditar
openstack service list
Debes ver “compute”, “image”, “network”, etc.
- Sube una imagen de prueba (ejemplo: cirros):bashCopiarEditar
wget http://download.cirros-cloud.net/0.6.1/cirros-0.6.1-x86_64-disk.img openstack image create "cirros" \ --file cirros-0.6.1-x86_64-disk.img \ --disk-format qcow2 --container-format bare \ --public openstack image list
Verás la imagen “cirros” en la lista.
- Desde Horizon, podrás crear proyectos, redes y lanzar instancias para probar.
11. Conclusiones y próximos pasos
¡Enhorabuena! 🥳 Ya tienes un entorno OpenStack All-In-One corriendo en Ubuntu 22.04 LTS. Aunque este despliegue es perfecto para aprendizaje y pruebas, si quieres llevarlo a producción necesitarás:
- Alta disponibilidad: Distribuir servicios en varios nodos y usar balanceadores.
- Seguridad reforzada: Usar SSL/TLS en los endpoints, restringir accesos de red, etc.
- Almacenamiento adicional: Incorporar Cinder (bloques) y/o Swift (objetos) si requieres mayores capacidades.
- Monitoreo y métricas: Podrías usar herramientas como Ceilometer, Gnocchi o Prometheus+Grafana.
¡Y mucho más! OpenStack es un universo increíble de posibilidades.
12. Recursos de referencia
- Documentación oficial de OpenStack (en inglés)
- Ubuntu Cloud Archive (Wiki oficial)
- Tutoriales y foros de la comunidad OpenStack
¡Listo!
Con esto, tu nube privada está en marcha. No olvides compartir tus experiencias y desafíos en la sección de comentarios o en redes sociales. ¡Suerte con tus experimentos en la nube! ☁️✨