Learn OpenStack · deploy/config-build

All-in-One (AIO) Configuration

Specific guidance for single-node deployments.

Key AIO Settings

For an all-in-one deployment, several settings differ from multinode:

# VIP address = the host's own IP (no floating VIP on a single node)
kolla_internal_vip_address: "10.0.200.79"  # same as the host's management IP

# Disable HAProxy — no need for load balancing on a single node
enable_haproxy: "no"

Why disable HAProxy? On a single-node deployment, HAProxy would just proxy to localhost. Disabling it removes an unnecessary layer and avoids the need for keepalived/VRRP.

AIO Inventory

Use INI format (kolla-ansible's native format):

# inventory/hosts
[control]
localhost ansible_connection=local

[network]
localhost ansible_connection=local

[compute]
localhost ansible_connection=local

[storage]
localhost ansible_connection=local

[monitoring]
localhost ansible_connection=local

Or for a remote AIO (deploying from a separate machine):

Important: Use the stock kolla inventory as a base (it has ~176 groups that kolla expects). Only modify the host assignments at the top:

KOLLA_SHARE="/opt/kolla-venv/share/kolla-ansible"
cp "$KOLLA_SHARE/ansible/inventory/all-in-one" inventory/hosts

Then edit the top of inventory/hosts to point at the remote host:

# At the top of the stock all-in-one inventory, change localhost to your host:
[control]
aio ansible_host=10.0.200.79 ansible_user=root

[network]
aio

[compute]
aio

[storage]
aio

[monitoring]
aio

# Keep [deployment] as localhost — this is where ansible runs FROM
[deployment]
localhost ansible_connection=local

# DO NOT modify the rest of the file — it has ~170 group mappings kolla needs

Key pattern: Define the host once in [control] with ansible_host= and ansible_user=, then reference by alias in all other groups.

Expected Timing (AIO)

Based on real deployments:

Step Time (cold) Time (cached)
Bootstrap 5-10 min ~1 min
Prechecks 2-3 min ~2 min
Pull 10-30 min ~3 min
Deploy 15-45 min ~15 min
Post-deploy ~30 sec ~30 sec

Host Preparation Script

Create a prepare-host.sh to run ON the target host before deploying:

#!/usr/bin/env bash
# Run this ON the target host as root
set -euo pipefail

echo "=== 1. Ensure external interface is UP with no IP ==="
ip link set <external_interface> up
ip addr flush dev <external_interface> 2>/dev/null || true

echo "=== 2. Install prerequisites ==="
# Rocky Linux / CentOS
dnf install -y python3 python3-pip python3-devel gcc libffi-devel openssl-devel git

# Ubuntu
# apt update && apt install -y python3 python3-pip python3-venv python3-dev gcc libffi-dev libssl-dev git

echo "=== 3. Create kolla-ansible virtual environment ==="
python3 -m venv /opt/kolla-venv
source /opt/kolla-venv/bin/activate
pip install -U pip

echo "=== 4. Install kolla-ansible ==="
pip install 'kolla-ansible @ git+https://opendev.org/openstack/kolla-ansible@stable/2025.1'

echo "=== 5. Install Ansible Galaxy dependencies ==="
kolla-ansible install-deps

echo "=== 6. Set up /etc/kolla ==="
mkdir -p /etc/kolla
cp globals.yml /etc/kolla/globals.yml
if [ -d config ]; then
    cp -r config/ /etc/kolla/config/
fi

echo "=== 7. Generate passwords ==="
KOLLA_SHARE="/opt/kolla-venv/share/kolla-ansible"
if [ ! -f /etc/kolla/passwords.yml ]; then
    # kolla-genpwd requires the template file to exist first
    cp "$KOLLA_SHARE/etc_examples/kolla/passwords.yml" /etc/kolla/passwords.yml
    kolla-genpwd -p /etc/kolla/passwords.yml
    echo "passwords.yml generated — copy back to your local repo!"
else
    echo "passwords.yml already exists, skipping"
fi

echo "=== 8. Set up self-SSH (required for AIO) ==="
if [ ! -f ~/.ssh/id_rsa ]; then
    ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
fi
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
sort -u ~/.ssh/authorized_keys -o ~/.ssh/authorized_keys
HOST_IP=$(hostname -I | awk '{print $1}')
ssh -o StrictHostKeyChecking=no root@"$HOST_IP" 'echo "Self-SSH OK"'

echo ""
echo "=== 9. Check for leftover state ==="
# Check for OVS bridges, Docker containers from previous attempts
if command -v ovs-vsctl &>/dev/null; then
    echo "OVS bridges: $(ovs-vsctl list-br 2>/dev/null || echo 'none')"
fi
if command -v docker &>/dev/null; then
    KOLLA_CONTAINERS=$(docker ps -aq --filter label=kolla_service 2>/dev/null | wc -l)
    echo "Existing kolla containers: $KOLLA_CONTAINERS"
fi

echo ""
echo "=== Preparation complete ==="
echo ""
echo "Next steps:"
echo "  source /opt/kolla-venv/bin/activate"
echo "  ./deploy.sh"
echo ""
echo "IMPORTANT: Copy /etc/kolla/passwords.yml back to your local repo!"

Deploy Script

Create a deploy.sh for repeatable deployments:

#!/usr/bin/env bash
set -euo pipefail

INVENTORY="inventory/hosts"

echo "=== Step 1: Bootstrap servers ==="
kolla-ansible bootstrap-servers -i "$INVENTORY"

echo "=== Step 2: Prechecks ==="
kolla-ansible prechecks -i "$INVENTORY"

echo "=== Step 3: Pull images ==="
kolla-ansible pull -i "$INVENTORY"

echo "=== Step 4: Deploy ==="
kolla-ansible deploy -i "$INVENTORY"

echo "=== Step 5: Post-deploy ==="
kolla-ansible post-deploy -i "$INVENTORY"

echo "=== Deployment complete ==="
echo "Run 'source /etc/kolla/admin-openrc.sh' to use the OpenStack CLI."

AIO Resource Requirements

  • Minimum: 8GB RAM, 40GB disk, 2 NICs
  • Recommended: 16GB+ RAM, 100GB+ SSD, 2 NICs
  • OS: Rocky Linux 9/10, Ubuntu 22.04/24.04

Using the Full globals.yml Template

For AIO deployments, it's often better to start with the full kolla-ansible globals.yml template rather than a minimal one. This gives the operator visibility into all available options:

# Get the full template
pip show kolla-ansible | grep Location
# Copy from: <location>/kolla_ansible/etc_examples/kolla/globals.yml

Then uncomment and modify only what you need. The key settings for AIO are: - kolla_base_distro - kolla_internal_vip_address (= host's IP) - network_interface - neutron_external_interface - neutron_plugin_agent - enable_haproxy: "no"