Lesson 4 · OpenStack Production Engineer
Kolla-Ansible Configuration — Making a Change That Survives
Where OpenStack configuration actually comes from in a Kolla-Ansible deployment, how overrides are merged, and how to scope a change so it does not touch the whole cloud.
Objectives
- Identify the source of truth for every configuration value in a Kolla deployment
- Write an override at the correct scope — global, service, or host
- Preview generated configuration before applying it
- Scope a reconfigure so it touches only the intended services and hosts
The mistake everyone makes once
You need to change a Nova setting. You find /etc/kolla/nova-scheduler/nova.conf on the control
node, edit it, restart the container, and it works.
Three weeks later somebody runs a reconfigure for an unrelated reason, and your change is gone. Nothing failed. Nobody was told. The setting simply reverted, and the incident it was preventing comes back.
The three sources of truth
Configuration is assembled from three places, in increasing specificity:
/etc/kolla/globals.yml deployment-wide: enabled services, networks,
the VIP, TLS, backend selection
/etc/kolla/passwords.yml every generated credential
back this up -- without it you cannot redeploy
/etc/kolla/config/ per-service overrides merged into the templates
All three belong in version control, except passwords.yml, which belongs in a secret store. A
change to any of them is a reviewable change, which is the point.
Override scoping
Overrides live under /etc/kolla/config/ and the path determines what they apply to:
/etc/kolla/config/nova.conf → every nova service
/etc/kolla/config/nova/nova-scheduler.conf → the scheduler only
/etc/kolla/config/nova/compute-01/nova.conf → nova on that host only
Three levels: all services in a project, one service, or one service on one host.
Kolla merges overrides into its generated template rather than replacing the file, so you specify only what differs:
# /etc/kolla/config/nova/nova-scheduler.conf
[filter_scheduler]
enabled_filters = AvailabilityZoneFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter
max_attempts = 5
Everything else in the generated nova.conf remains as Kolla produced it.
Preview before you apply
genconfig generates configuration without deploying it. This is the step that separates a
confident change from a hopeful one.
# Keep a copy of what is currently deployed
sudo cp -r /etc/kolla/nova-scheduler /etc/kolla/nova-scheduler.before
# Generate, without deploying
kolla-ansible genconfig -i /etc/kolla/inventory --tags nova
# What actually changed?
diff -r /etc/kolla/nova-scheduler.before /etc/kolla/nova-scheduler
The diff catches something you cannot otherwise see: unrelated changes that would be applied
alongside yours. If somebody edited globals.yml a month ago and nobody has reconfigured since,
that change is sitting in the templates waiting for the next run.
You want to find that out from a diff, not from an outage.
Applying, scoped
# Everything -- full risk, rarely necessary
kolla-ansible reconfigure -i /etc/kolla/inventory
# One project
kolla-ansible reconfigure -i /etc/kolla/inventory --tags nova
# One project, one host
kolla-ansible reconfigure -i /etc/kolla/inventory --tags nova --limit compute-02
# One host group
kolla-ansible reconfigure -i /etc/kolla/inventory --tags nova --limit compute
--tags and --limit are what make configuration changes safe to make during business hours. A
full reconfigure regenerates configuration and restarts services across the entire deployment; a
change to a Nova scheduler setting has no business restarting Neutron.
Verifying the change landed
Do not assume. Check the running container.
# 1. The generated file on the host
grep -A3 '\[filter_scheduler\]' /etc/kolla/nova-scheduler/nova.conf
# 2. The file inside the running container -- this is what the service reads
docker exec nova_scheduler grep -A3 '\[filter_scheduler\]' /etc/nova/nova.conf
# 3. The service restarted and came back
docker ps --filter name=nova_scheduler --format '{{.Names}}\t{{.Status}}'
# 4. It is still registered
openstack compute service list --service nova-scheduler
Step 2 is the one that matters. Steps 1 and 2 differing means the container did not get the new configuration — usually because the reconfigure did not restart it.
Adding a compute node, correctly
# 1. Add the host to [compute] in the inventory
# 2. Prepare the host
kolla-ansible bootstrap-servers -i /etc/kolla/inventory --limit compute-04
# 3. Pull images first, so the deploy window is short and predictable
kolla-ansible pull -i /etc/kolla/inventory --limit compute-04
# 4. Deploy -- scoped to the new host only
kolla-ansible deploy -i /etc/kolla/inventory --limit compute-04
# 5. Verify it joined everything it needs to join
openstack compute service list --host compute-04
openstack network agent list --host compute-04
openstack hypervisor list | grep compute-04
openstack resource provider list | grep compute-04
Step 5’s last line is the one people skip. A compute node can deploy successfully, register as a compute service, and never appear as a resource provider in placement — in which case it will never receive an instance and nothing will report a problem.
Rollback
Because the source of truth is a set of files, rollback is a file revert plus the same scoped command:
# Revert the override
git checkout HEAD~1 -- /etc/kolla/config/nova/nova-scheduler.conf
# Apply with exactly the same scope you used to deploy it
kolla-ansible reconfigure -i /etc/kolla/inventory --tags nova
Using the same --tags and --limit for the rollback as for the change is important. A narrower
rollback leaves some hosts on the new configuration; a wider one applies unrelated pending
changes.
Exercise
Change max_attempts in the Nova scheduler configuration from its default to 5.
- Write the override at the service scope, not the project scope
- Run
genconfigand diff against the currently deployed configuration - Confirm the diff contains only your change — investigate anything else it shows
- Apply with
--tags nova - Verify the value inside the running container, not just on the host
- Revert it, and confirm the revert landed the same way
The point of step 3 is the habit. Most of the value of genconfig is finding the change you did
not know was pending.
Verification status
This resource has not been executed end to end in a lab environment. Commands and configuration are reviewed by an engineer, but treat them as reference rather than as a tested procedure.
Author
James Joyner
Builds and operates the infrastructure layers underneath production AI systems.
James founded Inside The AI Stack to publish the kind of infrastructure and operations material he wanted while running production systems: specific, tested where it claims to be tested, and written by someone who has had to fix the thing at 3am. He works across AI infrastructure, private cloud, and platform engineering, and reviews every technical resource published here before it is marked as verified.
- AI infrastructure
- OpenStack operations
- Kubernetes
- Terraform
- Linux systems engineering
- Observability
Primary sources
- Kolla-Ansible advanced configuration — OpenStack Foundation
Continue from here
Related resources chosen because they are the next thing you would actually need — not because they share a keyword.
Kolla-Ansible Production Architecture
How Kolla-Ansible actually structures an OpenStack deployment, where configuration comes from, and how to make changes without discovering them during an outage.
OpenStack Production Engineer
A sequenced learning path for engineers who operate OpenStack in production — architecture, service-by-service depth, deployment, and troubleshooting under pressure.
Newsletter
Inside The AI Stack Brief
A practical weekly briefing on AI engineering, infrastructure, production operations, and the technologies powering the AI stack.
One email a week. No sponsorship placements inside the technical sections. Unsubscribe in one click.