Learn OpenStack · core/foundation/configuration

OpenStack Configuration

Comprehensive reference for OpenStack configuration: oslo.config format, paste.ini WSGI pipelines, policy.yaml RBAC, logging, per-service config file locations, and validation.


oslo.config

Every OpenStack service uses oslo.config to parse configuration files and CLI options. oslo.config enforces a declared schema — each option is registered by the service code with a type, default value, and help text. Unknown options in config files produce a warning but do not cause failures.

INI Format

Config files use Python-style INI format with [SECTION] headings and key = value pairs:

[DEFAULT]
debug = false
log_file = /var/log/nova/nova-api.log

[database]
connection = mysql+pymysql://nova:secret@10.0.0.5/nova

[keystone_authtoken]
www_authenticate_uri = http://10.0.0.5:5000
auth_url = http://10.0.0.5:5000
memcached_servers = 10.0.0.5:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = nova_service_password

Rules: - Section names are case-sensitive: [DEFAULT] not [default]. - Option names are case-insensitive but lowercase by convention. - Inline comments use # or ; — but do not put a comment on the same line as a value. - Multi-value options use repeated keys or comma-separated values depending on the option type. - Boolean values: true / false (oslo.config also accepts 1/0, yes/no, on/off).

--config-file Flag

All oslo.config services accept --config-file on the command line. Multiple files are merged, with later files taking priority:

nova-api --config-file /etc/nova/nova.conf \
         --config-file /etc/nova/nova-api-extra.conf

The default config file path per service is /etc/<service>/<service>.conf (e.g., /etc/nova/nova.conf). Services also read /etc/<service>/<service>.conf.d/*.conf if that directory exists, in lexicographic order.

Generate a Sample Config

Use oslo-config-generator to produce a sample config showing every option with its default value and docstring:

# Install the generator
pip install oslo.config

# Generate for nova (uses the config-generator entry point registered by nova)
oslo-config-generator --config-file /usr/share/nova/nova-config-generator.conf \
  --output-file /tmp/nova-sample.conf

# Or generate for a single namespace:
oslo-config-generator --namespace nova.conf \
  --output-file /tmp/nova-sample.conf

# Show all options for a namespace in the terminal:
oslo-config-generator --namespace oslo.messaging --format ini

Generated samples are annotated:

#
# From nova.conf
#

# Enable verbose output (boolean value)
# Deprecated group/name - [DEFAULT]/verbose
#verbose = false

# Default log levels for nova (list value)
#default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,...

Uncommented options are required or have non-trivial defaults. Commented-out options show the default.


Common Config Sections

[DEFAULT]

Global options not belonging to a specific subsystem.

[DEFAULT]
# Logging
debug = false
log_file = /var/log/nova/nova-api.log
log_dir = /var/log/nova
use_journal = false
use_syslog = false

# Transport URL for oslo.messaging (RabbitMQ)
transport_url = rabbit://openstack:rabbit_password@10.0.0.5:5672/

# Service-specific: Nova API workers
osapi_compute_workers = 4

# Service binding
my_ip = 10.0.0.20

[database]

SQLAlchemy connection string and pool settings. Used by every service.

[database]
connection = mysql+pymysql://nova:nova_db_password@10.0.0.5/nova
connection_recycle_time = 3600
max_pool_size = 10
max_overflow = 20
pool_timeout = 30
# For MariaDB Galera — use all three nodes:
# connection = mysql+pymysql://nova:nova_db_password@10.0.0.5,10.0.0.6,10.0.0.7/nova

Driver prefixes: - mysql+pymysql:// — MariaDB or MySQL via PyMySQL (recommended; no native C dependency) - mysql+mysqldb:// — MariaDB/MySQL via MySQLdb (requires python3-mysqldb) - postgresql+psycopg2:// — PostgreSQL via psycopg2

[keystone_authtoken]

Configures keystonemiddleware.auth_token for validating inbound API tokens. Present in every service except Keystone itself.

[keystone_authtoken]
www_authenticate_uri = http://10.0.0.5:5000
auth_url = http://10.0.0.5:5000
memcached_servers = 10.0.0.5:11211,10.0.0.6:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = nova_service_password
service_token_roles = service
service_token_roles_required = true

Key options: - www_authenticate_uri: Public Keystone endpoint, returned in WWW-Authenticate headers on 401. - auth_url: Keystone endpoint used by the middleware itself to fetch tokens. - memcached_servers: Token cache. Critical for performance; prevents per-request Keystone calls. - service_token_roles_required: Enforce that service-to-service calls carry a valid service role token. Set to true in production.

[oslo_messaging_rabbit]

RabbitMQ-specific settings for oslo.messaging (used when transport_url is a rabbit:// URI).

[oslo_messaging_rabbit]
rabbit_ha_queues = true
heartbeat_timeout_threshold = 60
heartbeat_rate = 2
# TLS for RabbitMQ
# ssl = true
# ssl_ca_file = /etc/ssl/certs/ca.pem
# ssl_certfile = /etc/ssl/certs/client.pem
# ssl_keyfile = /etc/ssl/private/client.key
kombu_reconnect_delay = 1.0
rabbit_retry_interval = 1
rabbit_retry_backoff = 2
rabbit_interval_max = 30

Note: transport_url in [DEFAULT] is the primary setting. The [oslo_messaging_rabbit] section provides tuning, not the connection URL.

[oslo_concurrency]

Controls locking behavior for concurrent operations.

[oslo_concurrency]
lock_path = /var/lib/nova/tmp

lock_path must be a writable directory. Used by Nova for file-based locks during concurrent disk operations. If unset, oslo.concurrency uses tempfile.gettempdir(), which may be cleaned up by the OS.

[cache]

Configures oslo.cache (dogpile.cache) for service-level caching (separate from keystonemiddleware's Memcached config).

[cache]
enabled = true
backend = oslo_cache.memcache_pool
memcache_servers = 10.0.0.5:11211,10.0.0.6:11211
expiration_time = 600
tls_enabled = false

Common backends: - oslo_cache.memcache_pool — Memcached with connection pooling (production). - dogpile.cache.memory — In-process memory (single-process testing only). - dogpile.cache.null — Disables caching (debugging).


paste.ini / WSGI Pipelines

OpenStack API services are WSGI applications deployed behind a web server (Apache + mod_wsgi, uwsgi, or gunicorn). The WSGI pipeline is defined in a paste.ini file using PasteDeploy syntax.

What paste.ini Does

paste.ini defines a chain of WSGI middleware and the application endpoint. Each request passes through the middleware chain before reaching the service's application object.

Example — Nova api-paste.ini

[composite:osapi_compute]
use = call:nova.api.openstack.urlmap:urlmap_factory
/                        oscomputeversions
/v2                      osapi_compute_app_v21
/v2.1                    osapi_compute_app_v21

[app:osapi_compute_app_v21]
paste.app_factory = nova.api.openstack.compute:APIRouterV21.factory

[pipeline:osapi_compute_app_v21]
pipeline = cors http_proxy_to_wsgi compute_req_id faultwrap request_log sizelimit osprofiler authtoken keystonecontext osapi_compute_app_v21

[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory

[filter:keystonecontext]
paste.filter_factory = nova.api.auth:NovaKeystoneContext.factory

[filter:cors]
paste.filter_factory = oslo_middleware.cors:filter_factory
oslo_config_config = nova.conf.CONF

[filter:http_proxy_to_wsgi]
paste.filter_factory = oslo_middleware.http_proxy_to_wsgi:HTTPProxyToWSGI.factory

Key pipeline elements: - authtokenkeystonemiddleware.auth_token: validates the X-Auth-Token header. - keystonecontext — populates the service's request context from the token data injected by authtoken. - cors — adds CORS headers for browser-based clients (Horizon). - faultwrap — catches unhandled exceptions and returns proper JSON error responses. - sizelimit — rejects requests with bodies exceeding max_request_body_size.

File Locations

Service paste.ini path
Nova /etc/nova/api-paste.ini
Neutron /etc/neutron/api-paste.ini
Glance /etc/glance/glance-api-paste.ini
Cinder /etc/cinder/api-paste.ini
Keystone /etc/keystone/keystone-paste.ini

Do not modify paste.ini files unless adding or removing middleware. The default pipelines are correct for standard deployments.


policy.yaml

oslo.policy implements Role-Based Access Control (RBAC) for every OpenStack API action. Rules are read from policy.yaml (or the legacy policy.json) at service startup and can be reloaded without restart.

Rule Syntax

# policy.yaml

# Simple role check
"admin_required": "role:admin"

# OR logic
"admin_or_owner": "rule:admin_required or project_id:%(project_id)s"

# Always allow
"allow_all": "@"

# Always deny
"deny_all": "!"

# Compound rule
"compute:create": "rule:admin_or_owner"

# Scope-based rule (system scope)
"compute:create_flavor": "role:admin and system_scope:all"

Scope Concepts

OpenStack introduced scope types in Queens / Rocky to distinguish between cloud-wide and project-scoped operations:

Scope system_scope value Use case
System all Cloud-wide admin operations (create flavors, manage hypervisors)
Project %(project_id)s Tenant operations (create instances, manage own networks)
Domain %(domain_id)s Domain admin operations (manage users within a domain)

Enable scope enforcement and new defaults in service config:

[oslo_policy]
enforce_scope = true
enforce_new_defaults = true

Setting enforce_scope = true causes requests without a matching scope to be rejected. Migrate to new defaults before enabling in production — use the oslopolicy-checker to audit current policies first.

Generate Sample Policies

# Generate sample policy for nova
oslopolicy-sample-generator --config-file /usr/share/nova/nova-policy-generator.conf \
  --output-file /etc/nova/policy.yaml.sample

# Or via the registered entry point:
oslopolicy-sample-generator --namespace nova \
  --output-file /tmp/nova-policy.yaml

The generated file contains every policy rule with its default value, a docstring, and the scope type.

Check a Policy Rule

# Check if user with role 'member' in project 'abc123' can create an instance
oslopolicy-checker \
  --config-file /etc/nova/nova.conf \
  --policy /etc/nova/policy.yaml \
  --rule "os_compute_api:servers:create" \
  --credentials '{"roles": ["member"], "project_id": "abc123ef-..."}'

Override Only What You Need

policy.yaml is a delta — you only need to include rules you want to override. Empty file = all defaults. Example: allow members to create flavors (normally admin-only):

# /etc/nova/policy.yaml
"compute:create_flavor": "role:member and system_scope:all"

Reload Policies Without Restart

oslo.policy watches policy.yaml for changes. Most services reload on the next request after a file modification. Some services require a SIGHUP:

kill -HUP $(pgrep -f nova-api)

Logging

oslo.log Configuration

Logging is configured in the [DEFAULT] section of <service>.conf:

[DEFAULT]
# Log to file (mutually exclusive with log_dir for log file name generation)
log_file = /var/log/nova/nova-api.log

# OR: log to directory (oslo.log names the file by service binary)
log_dir = /var/log/nova

# OR: log to syslog
use_syslog = true
syslog_log_facility = LOG_LOCAL0

# OR: log to systemd journal
use_journal = true

# Log level
debug = false          # If true, sets level to DEBUG; otherwise INFO

# Verbose was removed in Pike — debug=true replaces it

# Include timestamps in log output (default: true when not using journal)
log_date_format = %Y-%m-%d %H:%M:%S

Log Levels

oslo.log supports standard Python log levels. Set per-module level overrides:

[DEFAULT]
# Override log levels for specific loggers (comma-separated key=value)
default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN,taskflow=WARN,keystoneauth=WARN,oslo.cache=INFO,oslo_policy=WARN

Log Format

oslo.log uses a structured format that includes request IDs:

2025-10-15 14:32:01.456 12345 INFO nova.api.openstack.compute.servers [req-abc123 user_id project_id - - -] Create called for server web-01

Fields: timestamp PID LEVEL module [req-id user_id project_id domain_id user_domain_id project_domain_id]

Custom format:

[DEFAULT]
logging_context_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
logging_default_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s

Service Config File Locations

Standard paths for per-service configuration files:

Service Main Config Additional Configs
Keystone /etc/keystone/keystone.conf /etc/keystone/keystone-paste.ini, /etc/keystone/policy.yaml, /etc/keystone/logging.conf
Nova /etc/nova/nova.conf /etc/nova/api-paste.ini, /etc/nova/policy.yaml
Neutron /etc/neutron/neutron.conf /etc/neutron/api-paste.ini, /etc/neutron/policy.yaml, /etc/neutron/plugins/ml2/ml2_conf.ini, /etc/neutron/l3_agent.ini, /etc/neutron/dhcp_agent.ini, /etc/neutron/metadata_agent.ini
Glance /etc/glance/glance-api.conf /etc/glance/glance-api-paste.ini, /etc/glance/policy.yaml
Cinder /etc/cinder/cinder.conf /etc/cinder/api-paste.ini, /etc/cinder/policy.yaml
Placement /etc/placement/placement.conf /etc/placement/policy.yaml
Heat /etc/heat/heat.conf /etc/heat/api-paste.ini, /etc/heat/policy.yaml
Octavia /etc/octavia/octavia.conf /etc/octavia/api-paste.ini, /etc/octavia/policy.yaml
Barbican /etc/barbican/barbican.conf /etc/barbican/api-paste.ini, /etc/barbican/policy.yaml
Designate /etc/designate/designate.conf /etc/designate/api-paste.ini, /etc/designate/policy.yaml
Ironic /etc/ironic/ironic.conf /etc/ironic/api-paste.ini, /etc/ironic/policy.yaml
Magnum /etc/magnum/magnum.conf /etc/magnum/api-paste.ini, /etc/magnum/policy.yaml
Manila /etc/manila/manila.conf /etc/manila/api-paste.ini, /etc/manila/policy.yaml
Swift /etc/swift/swift.conf /etc/swift/proxy-server.conf, /etc/swift/account-server.conf, /etc/swift/container-server.conf, /etc/swift/object-server.conf
Horizon /etc/openstack-dashboard/local_settings.py (Django settings, not INI)

Kolla-Ansible Config Override Directory

In kolla-ansible deployments, per-service config overrides go in /etc/kolla/config/<service>/. These are merged into the container at deploy time:

/etc/kolla/config/
├── nova/
│   └── nova.conf          # Merged into container's /etc/nova/nova.conf
├── neutron/
│   └── ml2_conf.ini
└── keystone/
    └── keystone.conf

Validate Configs Before Restarting Services

1. oslo-config-validator

# Validate nova.conf against the nova option schema
oslo-config-validator --config-file /etc/nova/nova.conf \
  --namespace nova.conf \
  --namespace oslo.messaging \
  --namespace oslo.db \
  --namespace keystonemiddleware.auth_token

Reports: unknown options, options with wrong types, deprecated options.

2. Service-Specific Validation Commands

Most services have a --config-file check or a verify subcommand:

# Nova: run nova-status upgrade check to catch config issues
nova-manage config verify
nova-status upgrade check

# Neutron: validate neutron.conf before restart
neutron-db-manage --config-file /etc/neutron/neutron.conf check_migration

# Keystone: validate and check token signing keys
keystone-manage doctor

# Glance: check config
glance-manage config validate

# Cinder: DB and config check
cinder-manage config list

3. DB Migration Status Check

Before restarting after a config change that touches the database section:

nova-manage db version           # Current migration version
nova-manage db sync              # Apply pending migrations (safe to re-run)

neutron-db-manage current        # Show current migration head
neutron-db-manage check_migration

keystone-manage db_sync

4. Syntax Check Without Starting the Service

Run the service binary with --help — oslo.config parses and validates the config file during option processing:

nova-api --config-file /etc/nova/nova.conf --help > /dev/null

Any unknown options or type errors print to stderr before the help text. Exit code is 0 on success.

5. Policy Validation

# Check all rules in policy.yaml parse correctly
oslopolicy-checker --config-file /etc/nova/nova.conf \
  --policy /etc/nova/policy.yaml --all-rules

# List all effective rules (default + overrides)
oslopolicy-list-redundant --config-file /etc/nova/nova.conf \
  --policy /etc/nova/policy.yaml

oslopolicy-list-redundant identifies rules in policy.yaml that exactly match the compiled-in defaults — safe to remove.


Realistic Complete Config Example — Nova

[DEFAULT]
debug = false
log_file = /var/log/nova/nova-api.log
transport_url = rabbit://openstack:rabbit_pass@10.0.0.5:5672/
my_ip = 10.0.0.20
use_neutron = true
firewall_driver = nova.virt.firewall.NoopFirewallDriver
osapi_compute_workers = 4
metadata_workers = 2

[api]
auth_strategy = keystone

[api_database]
connection = mysql+pymysql://nova_api:nova_api_pass@10.0.0.5/nova_api

[database]
connection = mysql+pymysql://nova:nova_pass@10.0.0.5/nova
connection_recycle_time = 3600

[keystone_authtoken]
www_authenticate_uri = http://10.0.0.5:5000
auth_url = http://10.0.0.5:5000
memcached_servers = 10.0.0.5:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = nova_service_password
service_token_roles = service
service_token_roles_required = true

[service_user]
send_service_user_token = true
auth_url = http://10.0.0.5:5000
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = nova_service_password

[placement]
auth_url = http://10.0.0.5:5000
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = placement
password = placement_service_password
region_name = RegionOne

[glance]
api_servers = http://10.0.0.5:9292

[neutron]
auth_url = http://10.0.0.5:5000
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = neutron
password = neutron_service_password
region_name = RegionOne
service_metadata_proxy = true
metadata_proxy_shared_secret = metadata_proxy_secret

[oslo_concurrency]
lock_path = /var/lib/nova/tmp

[oslo_messaging_rabbit]
rabbit_ha_queues = true
heartbeat_timeout_threshold = 60

[cache]
enabled = true
backend = oslo_cache.memcache_pool
memcache_servers = 10.0.0.5:11211

[libvirt]
virt_type = kvm
cpu_mode = host-model

[vnc]
enabled = true
server_listen = 0.0.0.0
server_proxyclient_address = 10.0.0.20
novncproxy_base_url = http://10.0.0.5:6080/vnc_auto.html

Cross-Reference

  • Architecture and service relationships → core/foundation/architecture/
  • Deployment method config specifics → core/foundation/deployment-overview/
  • Keystone-specific config (federation, LDAP) → core/identity/
  • Neutron ML2 config → core/networking/
  • Cinder backend config → core/storage/block/