Kolla-Ansible

Kolla-Ansible is the deployment automation layer for OpenStack. It uses Ansible to configure hosts and uses containers to run OpenStack services such as Keystone, Nova, Neutron, Glance, Cinder, Horizon, RabbitMQ, MariaDB, HAProxy and others.

In your homelab, ctrl is now both:

OpenStack control node
Kolla-Ansible deployment node

That means ctrl will run the deployment tooling and SSH into:

ctrl  → control / network / monitoring
cmp → compute
gpu → compute / future GPU passthrough

Kolla-Ansible’s normal workflow is:

install Kolla-Ansible
copy globals.yml + passwords.yml
prepare inventory
install Galaxy dependencies
generate passwords
bootstrap servers
run prechecks
deploy OpenStack
post-deploy
test OpenStack CLI

The official quickstart recommends using a Python virtual environment for Kolla-Ansible to avoid conflicts with system Python packages, and it copies globals.yml and passwords.yml into /etc/kolla. It also uses kolla-ansible install-deps to install Ansible Galaxy requirements.


1. What Kolla-Ansible actually does

Kolla-Ansible is not OpenStack itself. It is the tool that deploys and manages OpenStack.

It handles:

Host preparation
Container runtime setup
OpenStack service configuration
Container image selection
Service deployment
Service restart/reconfigure
Password generation
HAProxy configuration
RabbitMQ setup
MariaDB setup
OpenStack API service deployment
Post-deployment admin credentials

Kolla-Ansible deploys OpenStack services as containers. So instead of installing nova-api, keystone, glance-api, neutron-server, etc. directly as system packages, it creates containerised services managed through Docker or Podman depending on the deployment configuration and release.

For your lab, that means later you should expect containers such as:

keystone
nova_api
nova_scheduler
nova_conductor
nova_compute
neutron_server
neutron_openvswitch_agent or ovn components
glance_api
cinder_api
cinder_scheduler
rabbitmq
mariadb
memcached
haproxy
horizon

The important mental model is:

Kolla-Ansible = installer / orchestrator
Docker = container runtime
OpenStack = cloud control plane running inside containers
Ceph = storage backend
Proxmox = physical/virtual lab substrate

2. Important Kolla-Ansible directories on ctrl

Your playbook created a layout like this:

/opt/kolla-venv

This is the Python virtual environment containing:

kolla-ansible
ansible
ansible-galaxy
openstack client
Python dependencies

Then:

/etc/kolla

This is the main configuration directory.

It should contain:

/etc/kolla/globals.yml
/etc/kolla/passwords.yml

globals.yml is the main Kolla-Ansible configuration file. The quickstart explicitly describes it as the main config file and notes that it is stored by default at /etc/kolla/globals.yml.

passwords.yml stores generated service passwords. The quickstart says the passwords are blank initially and can be filled using kolla-genpwd.

Then:

/opt/kolla-ansible/inventory

This is where your copied inventories live:

all-in-one
multinode
multinode-homelab

The official multinode documentation says the inventory determines which services land on which hosts, and that IP addresses or hostnames must be added to key groups such as control, network, compute, monitoring, and storage.

Then:

/opt/kolla-ansible/kolla-env.sh

This is your helper file so you can do:

source /opt/kolla-ansible/kolla-env.sh

and get:

kolla-ansible
openstack
ka
osc

in your shell path.


3. First test: log into ctrl

From your workstation:

ssh sont@192.168.1.51

Confirm you are on the correct VM:

hostname
hostname -f
ip -br addr

Expected:

ctrl

Then load your Kolla environment:

source /opt/kolla-ansible/kolla-env.sh

Verify the path:

echo $PATH
which kolla-ansible
which ansible
which ansible-playbook
which ansible-galaxy
which openstack

Expected examples:

/opt/kolla-venv/bin/kolla-ansible
/opt/kolla-venv/bin/ansible
/opt/kolla-venv/bin/ansible-playbook
/opt/kolla-venv/bin/ansible-galaxy
/opt/kolla-venv/bin/openstack

If which kolla-ansible does not point to /opt/kolla-venv/bin/kolla-ansible, your shell is not using the venv correctly.


4. Test Kolla-Ansible and Ansible versions

Run:

kolla-ansible --version
ansible --version
ansible-playbook --version
ansible-galaxy --version
openstack --version

You are looking for:

kolla-ansible works
ansible works
ansible-galaxy works
openstack client works

For the issue you hit earlier, pay special attention to:

ansible --version

The first line should show a compatible Ansible core version for your installed Kolla-Ansible. Your earlier error said it expected Ansible between 2.15 and 2.16, so anything outside that range will fail install-deps.

Useful check:

/opt/kolla-venv/bin/python -m pip list | egrep 'kolla|ansible|openstack'

5. Test that Kolla example files exist

Run:

ls -l /etc/kolla

Expected:

globals.yml
passwords.yml

Then:

ls -l /opt/kolla-ansible/inventory

Expected:

all-in-one
multinode
multinode-homelab

Also check where Kolla installed its shared files:

find /opt/kolla-venv/share/kolla-ansible \
\( -name globals.yml -o -name passwords.yml -o -name multinode -o -name all-in-one -o -name requirements.yml \) \
-print

This should show the source examples copied from the Kolla-Ansible installation.


6. Test Ansible inventory from ctrl

You need to prove that the deployment node can interpret the Kolla inventory and reach the target hosts.

Start with your starter inventory:

ansible-inventory \
-i /opt/kolla-ansible/inventory/multinode-homelab \
--graph

You want to see groups like:

@control:
|--ctrl
@network:
|--ctrl
@compute:
|--cmp
|--gpu
@monitoring:
|--ctrl
@storage:
|--ctrl
|--cmp
|--gpu
@deployment:
|--localhost

Then list hosts:

ansible \
-i /opt/kolla-ansible/inventory/multinode-homelab \
all \
--list-hosts

Expected:

ctrl
cmp
gpu
localhost

For actual Kolla later, use the official multinode inventory after you have edited it properly. The starter multinode-homelab is good for verifying the idea, but the official multinode file contains many child groups that Kolla roles expect.


7. Test SSH from ctrl to all OpenStack nodes

Kolla-Ansible depends on SSH from the deployment node to the target nodes. The official multinode docs state that Ansible uses SSH from the deployment host to the target hosts.

On ctrl, test:

ssh -i ~/.ssh/id_ed25519_kolla sont@192.168.1.51 hostname
ssh -i ~/.ssh/id_ed25519_kolla sont@192.168.1.52 hostname
ssh -i ~/.ssh/id_ed25519_kolla sont@192.168.1.53 hostname

Expected:

ctrl
cmp
gpu

Then test with Ansible:

ansible \
-i /opt/kolla-ansible/inventory/multinode-homelab \
openstack \
-m ping

This may fail if your starter inventory does not define an openstack group. In that case, test the explicit groups:

ansible \
-i /opt/kolla-ansible/inventory/multinode-homelab \
control,compute \
-m ping

Expected:

ctrl | SUCCESS => {"ping": "pong"}
cmp | SUCCESS => {"ping": "pong"}
gpu | SUCCESS => {"ping": "pong"}

If this fails, run:

ansible \
-i /opt/kolla-ansible/inventory/multinode-homelab \
control,compute \
-m ping \
-vvv

The -vvv output will usually reveal whether it is an SSH key, sudo, hostname, Python, or inventory problem.


8. Test privilege escalation

Kolla-Ansible needs privilege escalation because it configures Docker, networking, kernel settings, config directories and host-level services.

Run:

ansible \
-i /opt/kolla-ansible/inventory/multinode-homelab \
control,compute \
-m command \
-a "whoami" \
-b

Expected:

root

Then:

ansible \
-i /opt/kolla-ansible/inventory/multinode-homelab \
control,compute \
-m command \
-a "docker ps" \
-b

Expected: successful output on all three nodes.


9. Test Docker on all nodes from ctrl

Run:

ansible \
-i /opt/kolla-ansible/inventory/multinode-homelab \
control,compute \
-m shell \
-a "hostname; docker --version; docker ps --format '{{.Names}}' | head" \
-b

Expected:

Docker version ...

No OpenStack containers exist yet, so an empty container list is fine.

Also check Docker daemon state:

ansible \
-i /opt/kolla-ansible/inventory/multinode-homelab \
control,compute \
-m systemd \
-a "name=docker state=started enabled=true" \
-b

10. Test the Kolla requirements.yml

Your current blocker has been:

error: pathspec 'stable/2024.2' did not match any file(s) known to git

So inspect the file before rerunning install-deps:

grep -n -A4 -B4 "ansible-collection-kolla" \
/opt/kolla-venv/share/kolla-ansible/requirements.yml

If you still see:

version: stable/2024.2

that is likely to fail in your current environment.

After applying the patch we discussed, test the Galaxy install directly:

PATH=/opt/kolla-venv/bin:$PATH \
VIRTUAL_ENV=/opt/kolla-venv \
HOME=/home/sont \
kolla-ansible install-deps

If it succeeds, verify collections:

ansible-galaxy collection list | grep -E 'kolla|openstack|community'

You should see the Kolla collection and related dependencies.


11. Test kolla-genpwd

Once the install/dependency layer is working, test password generation.

First back up the password file:

sudo cp /etc/kolla/passwords.yml /etc/kolla/passwords.yml.bak.$(date +%F-%H%M%S)

Then run:

kolla-genpwd

Check that passwords were populated:

grep -n "^[a-zA-Z0-9_].*: $" /etc/kolla/passwords.yml | head

If that returns nothing, good: it means the blank values were likely filled.

Better check:

grep -n "keystone_admin_password" /etc/kolla/passwords.yml
grep -n "database_password" /etc/kolla/passwords.yml
grep -n "rabbitmq_password" /etc/kolla/passwords.yml

Do not paste your real passwords.yml into chat.


12. Test globals.yml is editable and valid YAML

Before Phase 7.5/7.6, check the file exists and parses:

python3 - <<'PY'
import yaml
with open('/etc/kolla/globals.yml') as f:
yaml.safe_load(f)
print("globals.yml parses as YAML")
PY

If python3-yaml is missing:

sudo apt install -y python3-yaml

Also inspect key values:

grep -nE "^(kolla_base_distro|network_interface|api_interface|neutron_external_interface|kolla_internal_vip_address|enable_horizon|enable_cinder|enable_ceph)" /etc/kolla/globals.yml

Most of these may still be commented out at this stage. That is fine. You are only testing that the file exists and is readable.


13. Dry-run style checks before real deployment

Once you have a proper Kolla inventory, run these from ctrl.

Check inventory resolution

ansible-inventory \
-i /opt/kolla-ansible/inventory/multinode \
--graph

Ping all Kolla hosts

ansible \
-i /opt/kolla-ansible/inventory/multinode \
all \
-m ping

Check remote facts

ansible \
-i /opt/kolla-ansible/inventory/multinode \
all \
-m setup \
-a "filter=ansible_default_ipv4"

Check Docker

ansible \
-i /opt/kolla-ansible/inventory/multinode \
all \
-m shell \
-a "hostname; docker --version; systemctl is-active docker" \
-b

14. Do not run these yet unless inventory and globals are ready

These are the next official deployment commands, but they belong to later stages:

kolla-ansible bootstrap-servers -i /opt/kolla-ansible/inventory/multinode
kolla-ansible prechecks -i /opt/kolla-ansible/inventory/multinode
kolla-ansible deploy -i /opt/kolla-ansible/inventory/multinode
kolla-ansible post-deploy

The quickstart’s deployment sequence is bootstrap-servers, then prechecks, then deploy; after deployment, post-deploy generates the OpenStack client configuration file.

At your current point, I would only run bootstrap-servers after:

multinode inventory is correct
globals.yml has correct interfaces
passwords.yml has been generated
SSH works from ctrl to ctrl/cmp/gpu
Docker works on ctrl/cmp/gpu

15. Useful health-check script to run on ctrl

Create this on ctrl:

cat > ~/test-kolla-install.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

source /opt/kolla-ansible/kolla-env.sh

echo "== Host =="
hostname
hostname -I

echo
echo "== Binaries =="
for b in kolla-ansible ansible ansible-playbook ansible-galaxy openstack; do
echo -n "$b -> "
command -v "$b"
done

echo
echo "== Versions =="
kolla-ansible --version
ansible --version | head -n 1
ansible-galaxy --version | head -n 1
openstack --version

echo
echo "== Kolla config files =="
ls -l /etc/kolla/globals.yml /etc/kolla/passwords.yml

echo
echo "== Kolla inventory files =="
ls -l /opt/kolla-ansible/inventory

echo
echo "== Kolla requirements =="
grep -n -A4 -B2 "ansible-collection-kolla" /opt/kolla-venv/share/kolla-ansible/requirements.yml || true

echo
echo "== Ansible inventory graph =="
ansible-inventory -i /opt/kolla-ansible/inventory/multinode-homelab --graph

echo
echo "== SSH ping test =="
ansible -i /opt/kolla-ansible/inventory/multinode-homelab control,compute -m ping

echo
echo "== Become/root test =="
ansible -i /opt/kolla-ansible/inventory/multinode-homelab control,compute -m command -a "whoami" -b

echo
echo "== Docker test =="
ansible -i /opt/kolla-ansible/inventory/multinode-homelab control,compute -m shell -a "hostname; docker --version; systemctl is-active docker" -b

echo
echo "Kolla-Ansible deployment node looks ready."
EOF

chmod +x ~/test-kolla-install.sh

Run:

~/test-kolla-install.sh

If that passes, your ctrl VM is correctly prepared as a Kolla-Ansible deployment node.


The success criteria for Phase 7.4

You can consider Phase 7.4 complete when all of this is true:

/opt/kolla-venv/bin/kolla-ansible exists
/opt/kolla-venv/bin/ansible-galaxy exists
/etc/kolla/globals.yml exists
/etc/kolla/passwords.yml exists
/opt/kolla-ansible/inventory/multinode exists
/opt/kolla-ansible/inventory/multinode-homelab exists
kolla-ansible install-deps succeeds
kolla-genpwd succeeds
ctrl can SSH to ctrl/cmp/gpu using ~/.ssh/id_ed25519_kolla
Ansible ping from ctrl to ctrl/cmp/gpu succeeds
Ansible become/root test succeeds
Docker is active on ctrl/cmp/gpu

At that point you are ready for:

Phase 7.5 — Configure Kolla multinode inventory
Phase 7.6 — Configure globals.yml
Phase 7.7 — bootstrap-servers
Phase 7.8 — prechecks
Phase 7.9 — deploy

Kolla-Ansible Cheat Sheet

Kolla-Ansible Cheat Sheet (2025.2+)

Basic & Advanced Commands

The following reflects the newer Kolla-Ansible command syntax where the inventory option comes after the subcommand:

kolla-ansible <subcommand> -i "$KOLLA_INVENTORY"

1. Loading Environment

Activate Python Virtual Environment

source /opt/kolla-venv/bin/activate

Export Environment Variables

export KOLLA_CONFIG_DIR=/etc/kolla
export KOLLA_INVENTORY=/etc/kolla/multinode

Verify Environment

echo $KOLLA_CONFIG_DIR
echo $KOLLA_INVENTORY

Verify Software Versions

kolla-ansible --version
ansible --version
docker --version

or

podman --version

2. Validating Inventory

Display Inventory

ansible-inventory -i "$KOLLA_INVENTORY" --list

Display Inventory Graph

ansible-inventory -i "$KOLLA_INVENTORY" --graph

Display Specific Host

ansible-inventory \
-i "$KOLLA_INVENTORY" \
--host ctrl

List Hosts

ansible all \
-i "$KOLLA_INVENTORY" \
--list-hosts

Syntax Check

ansible-playbook \
-i "$KOLLA_INVENTORY" \
--syntax-check playbook.yml

3. Connectivity Checks

Ping All Hosts

ansible all \
-i "$KOLLA_INVENTORY" \
-m ping

Verify SSH

ansible all \
-i "$KOLLA_INVENTORY" \
-m shell \
-a hostname

Verify Sudo Access

ansible all \
-i "$KOLLA_INVENTORY" \
-b \
-m command \
-a whoami

DNS Resolution

ansible all \
-i "$KOLLA_INVENTORY" \
-m shell \
-a "getent hosts ctrl"

Time Synchronization

ansible all \
-i "$KOLLA_INVENTORY" \
-m shell \
-a "timedatectl status"

SSH Port

ansible all \
-i "$KOLLA_INVENTORY" \
-m wait_for \
-a "port=22 timeout=5"

MariaDB Port

ansible ctrl \
-i "$KOLLA_INVENTORY" \
-m wait_for \
-a "port=3306 timeout=5"

etcd Port

ansible ctrl \
-i "$KOLLA_INVENTORY" \
-m wait_for \
-a "port=2379 timeout=5"

System Facts

Kernel

ansible all \
-i "$KOLLA_INVENTORY" \
-m setup \
-a "filter=ansible_kernel"

Memory

ansible all \
-i "$KOLLA_INVENTORY" \
-m setup \
-a "filter=ansible_memtotal_mb"

CPUs

ansible all \
-i "$KOLLA_INVENTORY" \
-m setup \
-a "filter=ansible_processor_vcpus"

4. Password Generation

Generate Passwords

kolla-genpwd

Force Regenerate

rm /etc/kolla/passwords.yml

kolla-genpwd

Regenerate One Password

kolla-genpwd \
-p keystone_admin_password

Display Password

grep keystone_admin_password \
/etc/kolla/passwords.yml

or

yq '.keystone_admin_password' \
/etc/kolla/passwords.yml

Backup Password File

cp \
/etc/kolla/passwords.yml \
/etc/kolla/passwords.yml.bak

5. Deployment Workflows

A. Basic Deployment

Install Dependencies

kolla-ansible install-deps \
-i "$KOLLA_INVENTORY"

Validate Inventory

ansible-inventory \
-i "$KOLLA_INVENTORY" \
--graph

Generate Passwords

kolla-genpwd

Bootstrap Servers

kolla-ansible bootstrap-servers \
-i "$KOLLA_INVENTORY"

Pull Images

kolla-ansible pull \
-i "$KOLLA_INVENTORY"

Run Prechecks

kolla-ansible prechecks \
-i "$KOLLA_INVENTORY"

Deploy

kolla-ansible deploy \
-i "$KOLLA_INVENTORY"

Generate Admin Credentials

kolla-ansible post-deploy \
-i "$KOLLA_INVENTORY"

Validate Generated Configuration

kolla-ansible validate-config \
-i "$KOLLA_INVENTORY"

Load Credentials

source /etc/kolla/admin-openrc.sh

or

export OS_CLIENT_CONFIG_FILE=/etc/kolla/clouds.yaml
export OS_CLOUD=kolla-admin

B. Advanced Operations

Reconfigure

kolla-ansible reconfigure \
-i "$KOLLA_INVENTORY"

Upgrade

kolla-ansible upgrade \
-i "$KOLLA_INVENTORY"

Rolling Upgrade

kolla-ansible rolling-upgrade \
-i "$KOLLA_INVENTORY"

Upgrade Check

kolla-ansible upgrade-check \
-i "$KOLLA_INVENTORY"

Scale Out

(Update inventory first)

kolla-ansible deploy \
-i "$KOLLA_INVENTORY"

Deploy Selected Services

kolla-ansible deploy \
-i "$KOLLA_INVENTORY" \
--tags nova,neutron

Skip Services

kolla-ansible deploy \
-i "$KOLLA_INVENTORY" \
--skip-tags horizon

Restart Services

kolla-ansible restart \
-i "$KOLLA_INVENTORY"

Stop Services

kolla-ansible stop \
-i "$KOLLA_INVENTORY"

Start Services

kolla-ansible start \
-i "$KOLLA_INVENTORY"

C. Image Management

Pull Images

kolla-ansible pull \
-i "$KOLLA_INVENTORY"

Pull Specific Tag

kolla-ansible pull \
-i "$KOLLA_INVENTORY" \
--tag 2025.2

Push Images

kolla-ansible push \
-i "$KOLLA_INVENTORY"

D. Destroy Deployment

Remove Deployment

kolla-ansible destroy \
-i "$KOLLA_INVENTORY"

Destroy Everything

kolla-ansible destroy \
-i "$KOLLA_INVENTORY" \
--yes-i-really-really-mean-it

Remove Old Images

Docker

docker image prune -a

Podman

podman image prune -a

6. Post-Deployment Checks

Verify Authentication

openstack token issue

List Services

openstack service list

List Endpoints

openstack endpoint list

Compute Services

openstack compute service list

Hypervisors

openstack hypervisor list

Images

openstack image list

Networks

openstack network list

Routers

openstack router list

Neutron Agents

openstack network agent list

Volume Services

openstack volume service list

Container Checks

Docker

docker ps

Podman

podman ps

Container Status

docker stats

Container Logs

docker logs nova_api

docker logs neutron_server

docker logs keystone

docker logs glance_api

docker logs horizon

Container Health

docker inspect \
--format='{{.State.Health.Status}}' \
keystone

Host Health

Disk

df -h

Memory

free -h

CPU

top

or

htop

Complete Deployment Workflow

source /opt/kolla-venv/bin/activate

export KOLLA_CONFIG_DIR=/etc/kolla
export KOLLA_INVENTORY=/etc/kolla/multinode

kolla-ansible install-deps -i "$KOLLA_INVENTORY"

ansible-inventory -i "$KOLLA_INVENTORY" --graph

ansible all -i "$KOLLA_INVENTORY" -m ping

kolla-genpwd

kolla-ansible bootstrap-servers -i "$KOLLA_INVENTORY"

kolla-ansible pull -i "$KOLLA_INVENTORY"

kolla-ansible prechecks -i "$KOLLA_INVENTORY"

kolla-ansible deploy -i "$KOLLA_INVENTORY"

kolla-ansible post-deploy -i "$KOLLA_INVENTORY"

kolla-ansible validate-config -i "$KOLLA_INVENTORY"

source /etc/kolla/admin-openrc.sh

openstack token issue
openstack service list
openstack endpoint list
openstack compute service list
openstack hypervisor list
openstack network agent list

This ordering matches the current Kolla-Ansible deployment workflow for the 2025.2 (Flamingo) release and newer, incorporating the install-deps, post-deploy, and validate-config stages as well as the preferred subcommand-first CLI syntax.