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