How-to Guides¶
Task-oriented recipes for deploying, operating, upgrading and troubleshooting OpenStack. Commands target the 2026.1 Gazpacho series and a current python-openstackclient. Background is in Explanation; defaults, ports and version matrices are in Reference.
Deployment¶
DevStack (Development)¶
DevStack builds a single-node development cloud from source. Never use it for production. Run it on a disposable VM as a non-root user with sudo:
sudo useradd -s /bin/bash -d /opt/stack -m stack
sudo chmod +x /opt/stack
echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
sudo -u stack -i
git clone https://opendev.org/openstack/devstack
cd devstack
cat > local.conf <<'EOF'
[[local|localrc]]
ADMIN_PASSWORD=secret
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
EOF
./stack.sh
Passwords
DevStack docs warn to use only alphanumeric characters in these passwords, as some services fail with special characters.
Production (Kolla-Ansible)¶
Kolla-Ansible deploys the Kolla container images with Ansible. The steps below follow the 2026.1 quickstart (all-in-one inventory; swap in multinode for real clusters). Supported hosts for 2026.1: Ubuntu 24.04, Debian 13, Rocky Linux 10, CentOS Stream 10.
# 1. Virtualenv with kolla-ansible from the matching stable branch
python3 -m venv ~/kolla-venv
source ~/kolla-venv/bin/activate
pip install -U pip
pip install git+https://opendev.org/openstack/kolla-ansible@stable/2026.1
# 2. Config directory, example globals/passwords and inventory
sudo mkdir -p /etc/kolla
sudo chown $USER:$USER /etc/kolla
cp -r ~/kolla-venv/share/kolla-ansible/etc_examples/kolla/* /etc/kolla
cp ~/kolla-venv/share/kolla-ansible/ansible/inventory/all-in-one .
# 3. Ansible Galaxy dependencies and generated passwords
kolla-ansible install-deps
kolla-genpwd
# 4. Edit /etc/kolla/globals.yml (kolla_base_distro, network_interface,
# neutron_external_interface, kolla_internal_vip_address), then:
kolla-ansible bootstrap-servers -i ./all-in-one
kolla-ansible prechecks -i ./all-in-one
kolla-ansible deploy -i ./all-in-one
# 5. Client and admin credentials
pip install python-openstackclient -c https://releases.openstack.org/constraints/upper/2026.1
kolla-ansible post-deploy -i ./all-in-one # writes /etc/kolla/clouds.yaml
Command syntax
Current Kolla-Ansible uses kolla-ansible <action> -i <inventory>. Older guides that put -i before the action, or use pip install kolla-ansible without a branch, target older releases.
Production on Kubernetes (OpenStack-Helm)¶
OpenStack-Helm publishes charts on tarballs.opendev.org and a Helm plugin (helm osh) that assembles per-release value overrides. After preparing Kubernetes (1.33 to 1.35 per the README), Ceph or another storage class, and ingress:
helm repo add openstack-helm https://tarballs.opendev.org/openstack/openstack-helm
helm plugin install https://opendev.org/openstack/openstack-helm-plugin
export OPENSTACK_RELEASE=2025.1
export FEATURES="${OPENSTACK_RELEASE} ubuntu_noble"
export OVERRIDES_DIR=$(pwd)/overrides
helm upgrade --install keystone openstack-helm/keystone \
--namespace=openstack \
$(helm osh get-values-overrides -p ${OVERRIDES_DIR} -c keystone ${FEATURES})
helm osh wait-for-pods openstack
Repeat for the other charts (RabbitMQ, MariaDB, Memcached, Glance, Placement, Nova, Neutron, Cinder, Horizon) in the order given by the upstream install guide. The upstream example still uses OPENSTACK_RELEASE=2025.1; the README lists 2025.2 and 2026.1 as tested too. Rackspace's Genestack wraps these same charts with Kustomize if you want an opinionated distribution.
Upgrades¶
Upgrade with Kolla-Ansible (adjacent or SLURP skip-level)¶
Upgrades go from one release to the next, or from a SLURP to the next SLURP (for example 2025.1 Epoxy to 2026.1 Gazpacho). Read the release notes of every project for both the target and any skipped release first.
source ~/kolla-venv/bin/activate
pip install --upgrade git+https://opendev.org/openstack/kolla-ansible@stable/2026.1
kolla-ansible install-deps
# Merge old passwords with any new ones
cp /etc/kolla/passwords.yml passwords.yml.old
cp ~/kolla-venv/share/kolla-ansible/etc/kolla/passwords.yml passwords.yml.new
kolla-genpwd -p passwords.yml.new
kolla-mergepwd --old passwords.yml.old --new passwords.yml.new --final /etc/kolla/passwords.yml
kolla-ansible pull -i ./multinode
kolla-ansible prechecks -i ./multinode
kolla-ansible upgrade -i ./multinode
SLURP extra step
For a skip-level upgrade, first upgrade ansible-core to the range the target release supports, and upgrade RabbitMQ to the intermediate version described in the Kolla-Ansible RabbitMQ SLURP guide, because RabbitMQ cannot jump two major versions at once.
Plan the Upgrade Window¶
- Check the target is supported from your release in the SLURP matrix.
- Move off removed features first (for example the Neutron Linux bridge driver was removed in 2025.1; Kolla-Ansible no longer deploys Swift since 2025.1).
- Back up every database (
mariadb-dumpor Kolla'skolla-ansible mariadb-backup) and Fernet keys. - Upgrade a staging cloud with the same inventory and run Tempest or Rally smoke tests.
- Upgrade production control plane, then compute hosts; watch
openstack compute service listfor down services.
Authentication¶
# clouds.yaml (preferred) or an openrc file
export OS_CLOUD=mycloud
# source admin-openrc.sh
# Verify authentication and catalog
openstack token issue
openstack catalog list
openstack endpoint list
Compute (Nova)¶
openstack server list --long
openstack server create myvm \
--image ubuntu-24.04 \
--flavor m1.large \
--network private-net \
--key-name mykey \
--security-group default \
--availability-zone az1
# Live migrate (let the scheduler pick, or name a host)
openstack server migrate --live-migration myvm
openstack server migrate --live-migration --host compute-02 myvm
openstack server migration list --server myvm
# Resize and confirm
openstack server resize --flavor m1.xlarge myvm
openstack server resize confirm myvm
# Console access
openstack console url show myvm
openstack console log show --lines 50 myvm
Removed flag
The old openstack server migrate --live <host> form is gone from current OSC; use --live-migration plus --host.
Networking (Neutron)¶
# Network + subnet
openstack network create private-net
openstack subnet create private-sub \
--network private-net \
--subnet-range 10.0.0.0/24 \
--gateway 10.0.0.1 \
--dns-nameserver 9.9.9.9
# Router + external gateway
openstack router create main-router
openstack router set main-router --external-gateway public-net
openstack router add subnet main-router private-sub
# Floating IP
openstack floating ip create public-net
openstack server add floating ip myvm 203.0.113.10
Open a Port with a Security Group Rule¶
The positional argument is the security group; add rules to a dedicated group rather than widening default.
openstack security group create web
openstack security group rule create web \
--protocol tcp --dst-port 443 --remote-ip 0.0.0.0/0
openstack security group rule create web \
--protocol tcp --dst-port 22 --remote-ip 198.51.100.0/24
openstack server add security group myvm web
Storage (Cinder)¶
openstack volume create --size 100 --type ssd data-vol
openstack server add volume myvm data-vol
openstack volume snapshot create --volume data-vol snap-01
openstack volume backup create --name backup-01 data-vol
Images (Glance)¶
openstack image create ubuntu-24.04 \
--file noble-server-cloudimg-amd64.img \
--disk-format qcow2 --container-format bare \
--public
openstack image list --long
Ceph backends
With Ceph RBD for Glance and Nova, upload images as raw so Nova can make copy-on-write clones; a qcow2 image forces a full download and conversion on every boot.
Orchestration (Heat)¶
# stack.yaml
heat_template_version: 2021-04-16
parameters:
image:
type: string
default: ubuntu-24.04
resources:
server:
type: OS::Nova::Server
properties:
image: { get_param: image }
flavor: m1.large
networks:
- network: private-net
Security Tasks¶
Rotate Fernet Keys¶
Keystone encrypts tokens with a rotating set of Fernet keys. Rotate on every Keystone node from the same key repository (Kolla-Ansible automates this with a cron container):
keystone-manage fernet_rotate --keystone-user keystone --keystone-group keystone
# then distribute /etc/keystone/fernet-keys/ to all Keystone nodes
Keep max_active_keys large enough that keys outlive the token expiration (default 3600 s).
Enable TLS in Kolla-Ansible¶
In /etc/kolla/globals.yml set kolla_enable_tls_external: "yes" and kolla_enable_tls_internal: "yes" with certificates, and rabbitmq_enable_tls: "yes" for AMQP over TLS (port 5671), then run kolla-ansible reconfigure -i ./multinode.
Performance Tuning¶
Allocation ratios are set per compute host in nova.conf (or per resource provider in Placement). Since Stein the initial defaults are initial_cpu_allocation_ratio = 4.0 and initial_ram_allocation_ratio = 1.0.
[DEFAULT]
# Explicit values override the initial_* defaults and Placement edits
cpu_allocation_ratio = 4.0
ram_allocation_ratio = 1.0
max_concurrent_live_migrations = 2
[libvirt]
# 2026.1+: parallel memory transfer; each connection can use a CPU core
live_migration_parallel_connections = 4
| Component | Parameter | Recommendation |
|---|---|---|
| Nova | cpu_allocation_ratio |
4.0 is the initial default; lower for CPU-bound workloads, use cpu_dedicated_set for pinning |
| Nova | ram_allocation_ratio |
1.0 (default) unless you run memory ballooning deliberately |
| Nova | max_concurrent_live_migrations |
Default 1; 2 to 4 on a dedicated migration network |
| Neutron (ML2/OVS) | l3_ha |
Enable for router HA (OVN routers are HA by design) |
| Cinder | rbd_pool |
Dedicated Ceph pool per volume type or tier |
Common Issues¶
| Issue | Diagnosis | Fix |
|---|---|---|
| Service down | openstack compute service list, openstack network agent list |
Check service logs, restart the container or unit |
| VM stuck in BUILD or ERROR | openstack server show <id> (fault field) |
Check nova-conductor and nova-scheduler logs, Placement capacity, quotas |
| "No valid host was found" | openstack allocation candidate list --resource VCPU=2 (osc-placement plugin) |
Free capacity, fix allocation ratios, check traits and AZs |
| Network unreachable | openstack port show <id> |
Check security groups, port binding (binding_vif_type), OVN chassis registration |
| RabbitMQ cluster issues | rabbitmqctl cluster_status |
Recover the partitioned node, then restart dependent services |
| Galera cluster down | kolla-ansible mariadb-recovery -i ./multinode |
Recovers from the most advanced node |
Troubleshooting¶
# Service and agent health
openstack compute service list
openstack network agent list
openstack volume service list
# Hypervisor capacity (OSC marks 'hypervisor stats show' deprecated; Nova
# removed the statistics API from compute microversion 2.88 onward)
openstack hypervisor list --long
openstack resource provider list # osc-placement plugin
# Quota check (project is positional)
openstack quota show myproject