Nova role for OpenStack-Ansible

tags:

openstack, nova, cloud, ansible

category:

*nix

This role will install the following Systemd services:
  • nova-server

  • nova-compute

To clone or view the source code for this repository, visit the role repository for os_nova.

Default variables

# Enable/Disable barbican configurations
nova_barbican_enabled:"{{(groups['barbican_all']isdefined)and(groups['barbican_all']|length>0)}}"
# Enable/Disable blazar configurations
nova_blazar_enabled:"{{(groups['blazar_all']isdefined)and(groups['blazar_all']|length>0)}}"
# Enable/Disable designate configurations
nova_designate_enabled:"{{(groups['designate_all']isdefined)and(groups['designate_all']|length>0)}}"
# Notification topics for designate.
nova_notifications_designate:notifications_designate
# Enable/Disable ceilometer configurations
nova_ceilometer_enabled:"{{(groups['ceilometer_all']isdefined)and(groups['ceilometer_all']|length>0)}}"
# Enable/Disable nova versioned notification
nova_versioned_notification_enabled:false
# Caching
nova_cache_servers:"{{nova_memcached_servers|default(memcached_servers)}}"
nova_cache_backend:"{{openstack_cache_backend|default('oslo_cache.memcache_pool')}}"
nova_cache_backend_map:"{{openstack_cache_backend_map|default(_nova_cache_backend_map)}}"
## Verbosity Options
debug:false
# Set the host which will execute the shade modules
# for the service setup. The host must already have
# clouds.yaml properly configured.
nova_service_setup_host:"{{openstack_service_setup_host|default('localhost')}}"
nova_service_setup_host_python_interpreter:>-
{{
openstack_service_setup_host_python_interpreter | default(
(nova_service_setup_host == 'localhost') | ternary(ansible_playbook_python, ansible_facts['python']['executable']))
}}
# Set the host which will run compute initialization tasks such as checking
# for a compute node to be up and running cell discovery.
nova_conductor_setup_host:"{{groups[nova_services['nova-conductor']['group']][0]}}"
# Set the package install state for distribution packages
# Options are 'present' and 'latest'
nova_package_state:"{{package_state|default('latest')}}"
# Set installation method.
nova_install_method:"{{service_install_method|default('source')}}"
nova_venv_python_executable:"{{openstack_venv_python_executable|default('python3')}}"
nova_git_repo:https://opendev.org/openstack/nova
nova_git_install_branch:master
nova_upper_constraints_url:>-
{{ requirements_git_url | default('https://releases.openstack.org/constraints/upper/' ~ requirements_git_install_branch | default('master')) }}
nova_git_constraints:
-"--constraint{{nova_upper_constraints_url}}"
nova_pip_install_args:"{{pip_install_options|default('')}}"
# Name of the virtual env to deploy into
nova_venv_tag:"{{venv_tag|default('untagged')}}"
nova_bin:"{{_nova_bin}}"
## Nova user information
nova_system_user_name:nova
nova_system_group_name:nova
nova_system_shell:/bin/bash
nova_system_comment:nova system user
nova_system_home_folder:"/var/lib/{{nova_system_user_name}}"
nova_system_slice_name:nova
nova_libvirt_save_path:"{{nova_system_home_folder}}/save"
nova_lock_dir:"{{openstack_lock_dir|default('/run/lock')}}"
nova_management_address:"127.0.0.1"
## Manually specified nova UID/GID
# Deployers can specify a UID for the nova user as well as the GID for the
# nova group if needed. This is commonly used in environments where shared
# storage is used, such as NFS or GlusterFS, and nova UID/GID values must be
# in sync between multiple servers.
#
# WARNING: Changing these values on an existing deployment can lead to
# failures, errors, and instability.
#
# nova_system_user_uid = <UID>
# nova_system_group_gid = <GID>
## Database info
nova_db_setup_host:"{{openstack_db_setup_host|default('localhost')}}"
nova_db_setup_python_interpreter:>-
{{
openstack_db_setup_python_interpreter | default(
(nova_db_setup_host == 'localhost') | ternary(ansible_playbook_python, ansible_facts['python']['executable']))
}}
nova_galera_address:"{{galera_address|default('127.0.0.1')}}"
nova_galera_user:nova
nova_galera_database:nova
nova_db_max_overflow:"{{openstack_db_max_overflow|default('50')}}"
nova_db_max_pool_size:"{{openstack_db_max_pool_size|default('5')}}"
nova_db_pool_timeout:"{{openstack_db_pool_timeout|default('30')}}"
nova_db_connection_recycle_time:"{{openstack_db_connection_recycle_time|default('600')}}"
nova_galera_port:"{{galera_port|default('3306')}}"
# Toggle whether nova connects via an encrypted connection
nova_galera_use_ssl:"{{galera_use_ssl|default(False)}}"
# The path where to store the database server CA certificate
nova_galera_ssl_ca_cert:"{{galera_ssl_ca_cert|default('')}}"
## DB API
nova_api_galera_address:"{{nova_galera_address}}"
nova_api_galera_user:nova_api
nova_api_galera_database:nova_api
nova_api_galera_port:"{{galera_port|default('3306')}}"
nova_api_db_max_overflow:"{{openstack_db_max_overflow|default('50')}}"
nova_api_db_max_pool_size:"{{openstack_db_max_pool_size|default('5')}}"
nova_api_db_pool_timeout:"{{openstack_db_pool_timeout|default('30')}}"
nova_api_db_connection_recycle_time:"{{openstack_db_connection_recycle_time|default('600')}}"
## DB Cells
nova_cell0_database:"nova_cell0"
nova_cell1_name:"cell1"
nova_cell_force_update:false
## Oslo Messaging
# RabbitMQ
nova_oslomsg_heartbeat_in_pthread:"{{oslomsg_heartbeat_in_pthread|default(False)}}"
# RPC
nova_oslomsg_rpc_host_group:"{{oslomsg_rpc_host_group|default('rabbitmq_all')}}"
nova_oslomsg_rpc_setup_host:"{{(nova_oslomsg_rpc_host_groupingroups)|ternary(groups[nova_oslomsg_rpc_host_group][0],'localhost')}}"
nova_oslomsg_rpc_transport:"{{oslomsg_rpc_transport|default('rabbit')}}"
nova_oslomsg_rpc_servers:"{{oslomsg_rpc_servers|default('127.0.0.1')}}"
nova_oslomsg_rpc_port:"{{oslomsg_rpc_port|default('5672')}}"
nova_oslomsg_rpc_use_ssl:"{{oslomsg_rpc_use_ssl|default(False)}}"
nova_oslomsg_rpc_userid:nova
nova_oslomsg_rpc_policies:[]
nova_oslomsg_rpc_vhost:
-name:/nova
state:"{{(nova_oslomsg_rabbit_quorum_queues|bool)|ternary('absent','present')}}"
-name:nova
state:"{{(nova_oslomsg_rabbit_quorum_queues|bool)|ternary('present','absent')}}"
nova_oslomsg_rpc_ssl_version:"{{oslomsg_rpc_ssl_version|default('TLSv1_2')}}"
nova_oslomsg_rpc_ssl_ca_file:"{{oslomsg_rpc_ssl_ca_file|default('')}}"
# Notify
nova_oslomsg_notify_configure:"{{oslomsg_notify_configure|default(nova_ceilometer_enabled)}}"
nova_oslomsg_notify_host_group:"{{oslomsg_notify_host_group|default('rabbitmq_all')}}"
nova_oslomsg_notify_setup_host:"{{(nova_oslomsg_notify_host_groupingroups)|ternary(groups[nova_oslomsg_notify_host_group][0],'localhost')}}"
nova_oslomsg_notify_transport:"{{oslomsg_notify_transport|default('rabbit')}}"
nova_oslomsg_notify_servers:"{{oslomsg_notify_servers|default('127.0.0.1')}}"
nova_oslomsg_notify_port:"{{oslomsg_notify_port|default('5672')}}"
nova_oslomsg_notify_use_ssl:"{{oslomsg_notify_use_ssl|default(False)}}"
nova_oslomsg_notify_userid:"{{nova_oslomsg_rpc_userid}}"
nova_oslomsg_notify_password:"{{nova_oslomsg_rpc_password}}"
nova_oslomsg_notify_vhost:"{{nova_oslomsg_rpc_vhost}}"
nova_oslomsg_notify_ssl_version:"{{oslomsg_notify_ssl_version|default('TLSv1_2')}}"
nova_oslomsg_notify_ssl_ca_file:"{{oslomsg_notify_ssl_ca_file|default('')}}"
nova_oslomsg_notify_policies:[]
###
### RabbitMQ info
###
nova_oslomsg_rabbit_quorum_queues:"{{oslomsg_rabbit_quorum_queues|default(True)}}"
nova_oslomsg_rabbit_stream_fanout:"{{oslomsg_rabbit_stream_fanout|default(nova_oslomsg_rabbit_quorum_queues)}}"
nova_oslomsg_rabbit_transient_quorum_queues:"{{oslomsg_rabbit_transient_quorum_queues|default(nova_oslomsg_rabbit_stream_fanout)}}"
nova_oslomsg_rabbit_qos_prefetch_count:"{{oslomsg_rabbit_qos_prefetch_count|default(nova_oslomsg_rabbit_stream_fanout|ternary(10,0))}}"
nova_oslomsg_rabbit_queue_manager:"{{oslomsg_rabbit_queue_manager|default(nova_oslomsg_rabbit_quorum_queues)}}"
nova_oslomsg_rabbit_quorum_delivery_limit:"{{oslomsg_rabbit_quorum_delivery_limit|default(0)}}"
nova_oslomsg_rabbit_quorum_max_memory_bytes:"{{oslomsg_rabbit_quorum_max_memory_bytes|default(0)}}"
## Nova virtualization Types
# The nova_virt_types dictionary contains global overrides used for
# specific compute types. Every variable inside of this dictionary
# will become an ansible fact. This gives the user the option to set
# or customize things based on their needs without having to redefine
# this entire data structure. Every supported compute type will be
# have its specific variable requirements set under its short name.
nova_virt_types:
ironic:
nova_compute_driver:ironic.IronicDriver
nova_reserved_host_memory_mb:0
nova_scheduler_tracks_instance_changes:false
kvm:
nova_compute_driver:libvirt.LibvirtDriver
nova_reserved_host_memory_mb:2048
nova_scheduler_tracks_instance_changes:true
qemu:
nova_compute_driver:libvirt.LibvirtDriver
nova_reserved_host_memory_mb:2048
nova_scheduler_tracks_instance_changes:true
nova_cpu_mode:"none"
# If this is not set, then the playbook will try to guess it.
# nova_virt_type: kvm
# Enable Kernel Shared Memory (KSM)
nova_compute_ksm_enabled:false
# if set, nova_virt_type must be one of these:
nova_supported_virt_types:
-qemu
-kvm
-ironic
## Nova Auth
nova_service_region:"{{service_region|default('RegionOne')}}"
nova_service_project_name:"service"
nova_service_project_domain_id:default
nova_service_user_domain_id:default
nova_service_user_name:"nova"
nova_service_role_names:
-admin
-service
nova_service_token_roles:
-service
nova_service_token_roles_required:"{{openstack_service_token_roles_required|default(True)}}"
## Keystone authentication middleware
nova_keystone_auth_plugin:password
## Nova enabled apis
nova_enabled_apis:"osapi_compute,metadata"
## Domain name used to configure FQDN for instances. When empty, only the hostname without
## a domain will be configured.
nova_dhcp_domain:"{{dhcp_domain|default('')}}"
## Nova v2.1
nova_service_name:nova
nova_service_type:compute
nova_service_proto:http
nova_service_publicuri_proto:"{{openstack_service_publicuri_proto|default(nova_service_proto)}}"
nova_service_adminuri_proto:"{{openstack_service_adminuri_proto|default(nova_service_proto)}}"
nova_service_internaluri_proto:"{{openstack_service_internaluri_proto|default(nova_service_proto)}}"
nova_service_bind_address:"{{openstack_service_bind_address|default('0.0.0.0')}}"
nova_service_port:8774
nova_service_description:"NovaComputeService"
nova_service_publicuri:"{{nova_service_publicuri_proto}}://{{external_lb_vip_address}}:{{nova_service_port}}"
nova_service_publicurl:"{{nova_service_publicuri}}/v2.1"
nova_service_adminuri:"{{nova_service_adminuri_proto}}://{{internal_lb_vip_address}}:{{nova_service_port}}"
nova_service_adminurl:"{{nova_service_adminuri}}/v2.1"
nova_service_internaluri:"{{nova_service_internaluri_proto}}://{{internal_lb_vip_address}}:{{nova_service_port}}"
nova_service_internalurl:"{{nova_service_internaluri}}/v2.1"
## Nova spice
nova_spice_html5proxy_base_proto:"{{openstack_service_publicuri_proto|default('http')}}"
nova_spice_html5proxy_base_port:6082
nova_spice_html5proxy_base_uri:"{{nova_spice_html5proxy_base_proto}}://{{external_lb_vip_address}}:{{nova_spice_html5proxy_base_port}}"
nova_spice_html5proxy_base_url:"{{nova_spice_html5proxy_base_uri}}/spice_auto.html"
nova_spice_console_agent_enabled:true
nova_spicehtml5_git_repo:"{{spicehtml5_git_repo|default('https://gitlab.freedesktop.org/spice/spice-html5.git')}}"
nova_spicehtml5_git_install_branch:"{{spicehtml5_git_install_branch|default('master')}}"
## Nova novnc
nova_novncproxy_proto:"{{openstack_service_publicuri_proto|default('http')}}"
nova_novncproxy_port:6080
nova_novncproxy_host:"{{openstack_service_bind_address|default('0.0.0.0')}}"
nova_novncproxy_base_uri:"{{nova_novncproxy_proto}}://{{external_lb_vip_address}}:{{nova_novncproxy_port}}"
nova_novncproxy_base_url:"{{nova_novncproxy_base_uri}}/vnc_lite.html"
nova_novncproxy_vncserver_proxyclient_address:"{{_nova_my_ip}}"
nova_novncproxy_vncserver_listen:"{{_nova_my_ip}}"
nova_novncproxy_git_repo:"{{novncproxy_git_repo|default('https://github.com/novnc/noVNC')}}"
nova_novncproxy_git_install_branch:"{{novncproxy_git_install_branch|default('master')}}"
## Nova serialconsole
nova_serialconsoleproxy_proto:"ws"
nova_serialconsoleproxy_port:6083
nova_serialconsoleproxy_port_range:10000:20000
nova_serialconsoleproxy_base_uri:"{{nova_serialconsoleproxy_proto}}://{{external_lb_vip_address}}:{{nova_serialconsoleproxy_port}}"
nova_serialconsoleproxy_base_url:"{{nova_serialconsoleproxy_base_uri}}"
nova_serialconsoleproxy_serialconsole_proxyserver_proxyclient_address:"{{nova_management_address}}"
## Nova metadata
nova_metadata_proxy_enabled:true
nova_metadata_bind_address:"{{openstack_service_bind_address|default('0.0.0.0')}}"
nova_metadata_port:8775
## Nova compute
nova_nested_virt_enabled:false
# Uwsgi settings
nova_wsgi_processes_max:16
nova_wsgi_processes:"{{[[ansible_facts['processor_vcpus']|default(1),1]|max*2,nova_wsgi_processes_max]|min}}"
nova_wsgi_threads:1
nova_uwsgi_tls:
crt:"{{nova_ssl_cert}}"
key:"{{nova_ssl_key}}"
## Nova libvirt
# Warning: If nova_libvirt_inject_key or nova_libvirt_inject_password are enabled for Ubuntu compute hosts
# then the kernel will be made readable to nova user (a requirement for libguestfs).
# See Launchpad bugs 1507915 (Nova), 759725 (Ubuntu), and http://libguestfs.org/guestfs-faq.1.html
nova_libvirt_inject_key:false
# inject partition options:
# -2 => disable, -1 => inspect (libguestfs only), 0 => not partitioned, >0 => partition number
nova_libvirt_inject_partition:-2
nova_libvirt_inject_password:false
nova_libvirt_disk_cachemodes:'{{(nova_libvirt_images_rbd_pool|length>0)|ternary("network=writeback","")}}'
nova_libvirt_hw_disk_discard:'{{(nova_libvirt_images_rbd_pool|length>0)|ternary("unmap","ignore")}}'
nova_libvirt_live_migration_inbound_addr:"{{_nova_my_ip}}"
## Nova console
# Set the console type for the compute host. Presently the only options are ["spice", "novnc", "serialconsole", "disabled"].
nova_console_type:"{{(ansible_facts['architecture']=='aarch64')|ternary('serialconsole','novnc')}}"
## Nova ironic console
# Set the console type. Presently the only options are ["serialconsole", "disabled"].
nova_ironic_console_type:"disabled"
nova_ironic_used:"{{_nova_ironic_used}}"
## Nova console proxies
# Set the console proxy types.
nova_console_proxy_types:
-"{{nova_console_type}}"
-"{{nova_ironic_console_type}}"
# Nova console ssl info, presently only used by novnc console type
nova_console_ssl_dir:"{{nova_system_home_folder}}/console_ssl"
nova_console_ssl_cert:"{{nova_console_ssl_dir}}/nova-console.pem"
nova_console_ssl_key:"{{nova_console_ssl_dir}}/nova-console.key"
# Enable TLS on VNC connection from novnc to compute hosts
nova_qemu_vnc_tls:1
nova_vencrypt_client_key:"/etc/pki/nova-novncproxy/client-key.pem"
nova_vencrypt_client_cert:"/etc/pki/nova-novncproxy/client-cert.pem"
nova_vencrypt_ca_certs:"/etc/pki/nova-novncproxy/ca-cert.pem"
# The auth_schemes values should be listed in order of preference.
# If enabling VeNCrypt on an existing deployment which already has instances running,
# the noVNC proxy server must initially be allowed to use vencrypt and none.
# Once it is confirmed that all Compute nodes have VeNCrypt enabled for VNC,
# it is possible to remove the none option from the list
nova_vencrypt_auth_scheme:"vencrypt,none"
## Nova global config
nova_image_cache_manager_interval:0
# Nova Scheduler
nova_cpu_allocation_ratio:2.0
nova_disk_allocation_ratio:1.0
nova_max_io_ops_per_host:10
nova_ram_allocation_ratio:1.0
nova_reserved_host_disk_mb:2048
nova_scheduler_host_subset_size:"{{((((groups['compute_hosts']|default([])|length)*0.3)|round|int,10)|min,1)|max}}"
nova_scheduler_max_attempts:5
nova_scheduler_default_filters:
-ComputeFilter
-AggregateNumInstancesFilter
-AggregateIoOpsFilter
-ComputeCapabilitiesFilter
-ImagePropertiesFilter
-ServerGroupAntiAffinityFilter
-ServerGroupAffinityFilter
-NUMATopologyFilter
nova_blazar_scheduler_filters:
-BlazarFilter
nova_scheduler_extra_filters:[]
# This should be tuned depending on the number of compute hosts present in the
# deployment. Large clouds may wish to disable automatic discovery by setting
# this value to -1.
nova_discover_hosts_in_cells_interval:"{{300ifgroups['nova_compute']|length>10else60}}"
# Define nfs information to enable nfs shares as mounted directories for
# nova. The ``nova_nfs_client`` value is a list of dictionaries that must
# be filled out completely to enable the persistent NFS mounts.
#
# Example of the expected dict structure:
# nova_nfs_client:
# - server: "127.0.0.1" ## Hostname or IP address of NFS Server
# remote_path: "/instances" ## Remote path from the NFS server's export
# local_path: "/var/lib/nova/instances" ## Local path on machine
# type: "nfs" ## This can be nfs or nfs4
# options: "_netdev,auto" ## Mount options
# config_overrides: "{}" ## Override dictionary for unit file
nova_nfs_client:[]
# Nova Ceph rbd
# Enble and define nova_libvirt_images_rbd_pool to use rbd as nova backend
# nova_libvirt_images_rbd_pool: vms
nova_libvirt_images_rbd_pool:""
nova_ceph_client:"{{cinder_ceph_client}}"
# Enabled upstream if RBD is in use on cinder backends, which requires that
# ceph be deployed on the nova compute hosts to enable volume backed instances.
nova_cinder_rbd_inuse:false
# Enable compute nodes to retrieve images from RBD directly rather then through
# HTTP if images_type is NOT set to RBD. Must be False if nova images stored in RBD.
nova_glance_rbd_inuse:false
nova_glance_images_rbd_pool:"{{glance_rbd_store_pool|default('images')}}"
# Used to determine if we need a Ceph client
nova_rbd_inuse:"{{(nova_libvirt_images_rbd_pool|length>0)or(nova_cinder_rbd_inuse|bool)}}"
## General Nova configuration
# If ``nova_conductor_workers`` is unset the system will use half the number of available VCPUS to
# compute the number of api workers to use.
# nova_conductor_workers: 16
# If ``nova_scheduler_workers`` is unset the system will use half the number of available VCPUS to
# compute the number of api workers to use.
# nova_scheduler_workers: 16
## Cap the maximun number of threads / workers when a user value is unspecified.
nova_api_threads_max:16
nova_api_threads:>-
{{ [[(ansible_facts['processor_vcpus'] // ansible_facts['processor_threads_per_core']) | default(1), 1] | max * 2, nova_api_threads_max] | min }}
## Policy vars
# Provide a list of access controls to update the default policy.json with. These changes will be merged
# with the access controls in the default policy.json. E.g.
# nova_policy_overrides:
# "compute:create": ""
# "compute:create:attach_network": ""
## Resource provider vars
# Optionally specify a set of resource providers that a particular compute node exposes
# See https://docs.openstack.org/nova/latest/admin/managing-resource-providers.html
nova_provider_overrides:[]
# nova_provider_overrides:
# - name: my_provider
# content:
# meta:
# schema_version: '1.0'
# providers:
# - identification:
# name: 'EXAMPLE_RESOURCE_PROVIDER'
# inventories:
# additional:
# - CUSTOM_EXAMPLE_RESOURCE_CLASS:
# total: 100
# reserved: 0
# min_unit: 1
# max_unit: 10
# step_size: 1
# allocation_ratio: 1.0
# traits:
# additional:
# - 'CUSTOM_EXAMPLE_TRAIT'
nova_service_in_ldap:"{{service_ldap_backend_enabled|default(False)}}"
## libvirtd config options
nova_libvirtd_listen_tls:1
nova_libvirtd_listen_tcp:0
nova_libvirtd_auth_tcp:sasl
nova_libvirtd_debug_log_filters:"3:remote4:event3:json3:rpc"
nova_api_metadata_init_overrides:{}
nova_api_os_compute_init_overrides:{}
nova_compute_init_overrides:{}
nova_conductor_init_overrides:{}
nova_novncproxy_init_overrides:{}
nova_scheduler_init_overrides:{}
nova_spicehtml5proxy_init_overrides:{}
nova_serialproxy_init_overrides:{}
## Service Name-Group Mapping
nova_services:
nova-api-metadata:
group:nova_api_metadata
service_name:nova-api-metadata
init_config_overrides:"{{nova_api_metadata_init_overrides}}"
start_order:5
wsgi_app:true
uwsgi_overrides:"{{nova_api_metadata_uwsgi_ini_overrides}}"
uwsgi_bind_address:"{{nova_metadata_bind_address}}"
uwsgi_port:"{{nova_metadata_port}}"
uwsgi_tls:"{{nova_backend_ssl|ternary(nova_uwsgi_tls,{})}}"
wsgi:"nova.wsgi.metadata:application"
nova-api-os-compute:
group:nova_api_os_compute
service_name:nova-api-os-compute
init_config_overrides:"{{{'Install':{'Alias':'nova-api.service'}}|combine(nova_api_os_compute_init_overrides,recursive=True)}}"
start_order:4
wsgi_app:true
uwsgi_overrides:"{{nova_api_os_compute_uwsgi_ini_overrides}}"
uwsgi_bind_address:"{{nova_service_bind_address}}"
uwsgi_port:"{{nova_service_port}}"
uwsgi_tls:"{{nova_backend_ssl|ternary(nova_uwsgi_tls,{})}}"
wsgi:"nova.wsgi.osapi_compute:application"
nova-compute:
group:nova_compute
service_name:nova-compute
init_config_overrides:"{{nova_compute_init_overrides}}"
start_order:6
execstarts:"{{nova_bin}}/nova-compute"
execreloads:"/bin/kill-HUP$MAINPID"
after_targets:
-libvirtd.service
-syslog.target
-network.target
nova-conductor:
group:nova_conductor
service_name:nova-conductor
init_config_overrides:"{{nova_conductor_init_overrides}}"
start_order:2
execstarts:"{{nova_bin}}/nova-conductor"
execreloads:"/bin/kill-HUP$MAINPID"
nova-novncproxy:
group:nova_console
service_name:nova-novncproxy
init_config_overrides:"{{nova_novncproxy_init_overrides}}"
condition:"{{'novnc'innova_console_proxy_types}}"
start_order:5
execstarts:"{{nova_bin}}/nova-novncproxy{{nova_backend_ssl|ternary('--ssl_only--cert'~nova_ssl_cert~'--key'~nova_ssl_key,'')}}"
nova-scheduler:
group:nova_scheduler
service_name:nova-scheduler
init_config_overrides:"{{nova_scheduler_init_overrides}}"
start_order:3
execstarts:"{{nova_bin}}/nova-scheduler"
execreloads:"/bin/kill-HUP$MAINPID"
nova-spicehtml5proxy:
group:nova_console
service_name:nova-spicehtml5proxy
init_config_overrides:"{{{'Install':{'Alias':'nova-spiceproxy.service'}}|combine(nova_spicehtml5proxy_init_overrides,recursive=True)}}"
condition:"{{'spice'innova_console_proxy_types}}"
start_order:5
execstarts:"{{nova_bin}}/nova-spicehtml5proxy{{nova_backend_ssl|ternary('--ssl_only--cert'~nova_ssl_cert~'--key'~nova_ssl_key,'')}}"
nova-serialconsole-proxy:
group:nova_console
service_name:nova-serialproxy
init_config_overrides:"{{nova_serialproxy_init_overrides}}"
condition:"{{'serialconsole'innova_console_proxy_types}}"
start_order:5
execstarts:"{{nova_bin}}/nova-serialproxy{{nova_backend_ssl|ternary('--ssl_only--cert'~nova_ssl_cert~'--key'~nova_ssl_key,'')}}"
nova_ironic_sericalconsole-proxy:
group:ironic_console
service_name:nova-serialproxy
init_config_overrides:"{{nova_serialproxy_init_overrides}}"
condition:"{{'serialconsole'innova_console_proxy_types}}"
start_order:5
execstarts:"{{nova_bin}}/nova-serialproxy{{nova_backend_ssl|ternary('--ssl_only--cert'~nova_ssl_cert~'--key'~nova_ssl_key,'')}}"
nova_blazar_pip_packages:
-blazar-nova
nova_novnc_pip_packages:
-websockify
nova_compute_ironic_pip_packages:
-python-ironicclient
# Common pip packages
nova_pip_packages:
-"git+{{nova_git_repo}}@{{nova_git_install_branch}}#egg=nova"
-osprofiler
-PyMySQL
-"{{_nova_cache_backend_package}}"
-systemd-python
# Specific pip packages provided by the user
nova_user_pip_packages:[]
nova_qemu_user:libvirt-qemu
nova_qemu_group:kvm
# Define the following variable to drop a replacement
# file for /etc/libvirt/qemu.conf
qemu_conf_dict:{}
## Tunable overrides
nova_nova_conf_overrides:{}
nova_rootwrap_conf_overrides:{}
nova_api_paste_ini_overrides:{}
nova_policy_overrides:{}
nova_vendor_data_overrides:{}
nova_api_metadata_uwsgi_ini_overrides:{}
nova_api_os_compute_uwsgi_ini_overrides:{}
# Attempt to auto-discover available vGPU devices.
# It is recommended to define them explicitly through ``nova_enabled_mdev_types``.
# Doing so has precedence over discovered ones and does not require to
# disable the variable explicitly.
nova_discover_mdev_types:true
# Enabled vGPU Types - dict defining 'type' and 'address' (optional) of vGPU
# an address is only required when supporting more than one physical GPU on the host
# Example 1:
# nova_enabled_mdev_types:
# - type: nvidia-35
#
# Example 2:
# nova_enabled_mdev_types:
# - type: nvidia-35
# address: "<device address.0>,<device address.1>"
# - type: nvidia-36
# address:
# - "<another device address.0>"
# - "<another device address.1>"
nova_enabled_mdev_types:"{{nova_enabled_vgpu_types|default({})}}"
# PCI devices passthrough to nova
# Example:
# nova_device_spec:
# - '{ "physical_network": "physnet1", "devname": "p1p1" }'
nova_device_spec:"{{nova_pci_passthrough_whitelist|default([])}}"
# PCI alias,
# Example:
# nova_pci_alias:
# - '{ "name": "card-alias1", "product_id": "XXXX", "vendor_id": "XXXX" }'
# - '{ "name": "card-alias2", "product_id": "XXXY", "vendor_id": "XXXY" }'
nova_pci_alias:[]
# Storage location for SSL certificate authority
nova_pki_dir:"{{openstack_pki_dir}}"
# Delegated host for operating the certificate authority
nova_pki_setup_host:"{{openstack_pki_setup_host|default('localhost')}}"
# Nova server certificate
nova_pki_keys_path:"{{nova_pki_dir~'/certs/private/'}}"
nova_pki_certs_path:"{{nova_pki_dir~'/certs/certs/'}}"
nova_pki_intermediate_cert_name:"{{openstack_pki_service_intermediate_cert_name}}"
nova_pki_intermediate_chain_path:>-
{{ nova_pki_dir ~ '/roots/' ~ nova_pki_intermediate_cert_name ~ '/certs/' ~ nova_pki_intermediate_cert_name ~ '-chain.crt' }}
nova_pki_regen_cert:""
nova_pki_san:"{{openstack_pki_san|default('DNS:'~ansible_facts['hostname']~',IP:'~management_address)}}"
nova_pki_compute_san:>-
{{
'DNS:' ~ ansible_facts['hostname'] ~ ',DNS:' ~ ansible_facts['nodename'] ~ ',IP:' ~ _nova_my_ip ~ (
nova_libvirt_live_migration_inbound_addr != nova_management_address) |ternary(',IP:' ~ nova_libvirt_live_migration_inbound_addr, '')
}}
# Create client and server cert for compute hosts
# This certiticate is used to secure TLS live migrations and VNC sessions
nova_pki_compute_certificates:
-name:"nova_{{ansible_facts['hostname']}}"
provider:ownca
cn:"{{ansible_facts['nodename']}}"
san:"{{nova_pki_compute_san}}"
signed_by:"{{nova_pki_intermediate_cert_name}}"
key_usage:
-digitalSignature
-keyAgreement
-keyEncipherment
extended_key_usage:
-clientAuth
-serverAuth
# libvirt default destination files for SSL certificates
nova_libvirt_ssl_dir:/etc/pki/libvirt
# QEMU default destination files for SSL certificates
nova_qemu_ssl_dir:/etc/pki/qemu
# Installation details for SSL certificates for compute hosts TLS live migration
nova_pki_compute_install_certificates:
-src:"{{nova_user_ssl_cert|default(nova_pki_certs_path~'nova_'~ansible_facts['hostname']~'-chain.crt')}}"
dest:"{{nova_libvirt_ssl_dir}}/servercert.pem"
owner:"root"
group:"root"
mode:"0640"
# Server certificate key used by libvirt for live migrations
-src:"{{nova_user_ssl_key|default(nova_pki_keys_path~'nova_'~ansible_facts['hostname']~'.key.pem')}}"
dest:"{{nova_libvirt_ssl_dir}}/private/serverkey.pem"
owner:"root"
group:"root"
mode:"0640"
# Client certificate used by libvirt for live migrations
# Defaults to using the server certificate which is signed for both clientAuth and serverAuth
-src:"{{nova_user_ssl_cert|default(nova_pki_certs_path~'nova_'~ansible_facts['hostname']~'-chain.crt')}}"
dest:"{{nova_libvirt_ssl_dir}}/clientcert.pem"
owner:"root"
group:"root"
mode:"0640"
# Client certificate key used by libvirt for live migrations
-src:"{{nova_user_ssl_key|default(nova_pki_keys_path~'nova_'~ansible_facts['hostname']~'.key.pem')}}"
dest:"{{nova_libvirt_ssl_dir}}/private/clientkey.pem"
owner:"root"
group:"root"
mode:"0640"
# Server certificate used by QEMU for live migrations
-src:"{{nova_user_ssl_cert|default(nova_pki_certs_path~'nova_'~ansible_facts['hostname']~'-chain.crt')}}"
dest:"{{nova_qemu_ssl_dir}}/server-cert.pem"
owner:"root"
group:"{{nova_qemu_group}}"
mode:"0640"
# Server certificate key used by QEMU for live migrations
-src:"{{nova_user_ssl_key|default(nova_pki_keys_path~'nova_'~ansible_facts['hostname']~'.key.pem')}}"
dest:"{{nova_qemu_ssl_dir}}/server-key.pem"
owner:"root"
group:"{{nova_qemu_group}}"
mode:"0640"
# Client certificate used by QEMU for live migrations
# Defaults to using the server certificate which is signed for both clientAuth and serverAuth
-src:"{{nova_user_ssl_cert|default(nova_pki_certs_path~'nova_'~ansible_facts['hostname']~'-chain.crt')}}"
dest:"{{nova_qemu_ssl_dir}}/client-cert.pem"
owner:"root"
group:"{{nova_qemu_group}}"
mode:"0640"
# Client certificate key used by QEMU for live migrations
-src:"{{nova_user_ssl_key|default(nova_pki_keys_path~'nova_'~ansible_facts['hostname']~'.key.pem')}}"
dest:"{{nova_qemu_ssl_dir}}/client-key.pem"
owner:"root"
group:"{{nova_qemu_group}}"
mode:"0640"
# Root CA for libvirt
# libvirt requires that the CA cert file has any intermediate certificates for the server cert,
# so defaults to using the intermediate chain, which contains the intermediate and Root CA
-src:"{{nova_user_ssl_ca_cert|default(nova_pki_intermediate_chain_path)}}"
dest:"/etc/pki/CA/cacert.pem"
owner:"root"
group:"root"
mode:"0644"
# Root CA for qemu
-src:"{{nova_user_ssl_ca_cert|default(nova_pki_intermediate_chain_path)}}"
dest:"{{nova_qemu_ssl_dir}}/ca-cert.pem"
owner:"root"
group:"root"
mode:"0644"
# Define user-provided SSL certificates in:
# /etc/openstack_deploy/user_variables.yml
# nova_user_ssl_cert: <path to cert on ansible deployment host>
# nova_user_ssl_key: <path to cert on ansible deployment host>
# nova_user_ssl_ca_cert: <path to cert on ansible deployment host>
# TLS certficates for console hosts
nova_pki_console_condition:"{{nova_qemu_vnc_tls==1andnova_console_type=='novnc'and'nova_console'ingroup_names}}"
nova_pki_console_certificates:
# Client certificate used by novnv proxy to authenticate with compute hosts using vencrypt
-name:"nova_{{ansible_facts['hostname']}}-client"
provider:ownca
cn:"{{ansible_facts['nodename']}}"
san:"{{nova_pki_compute_san}}"
signed_by:"{{nova_pki_intermediate_cert_name}}"
key_usage:
-digitalSignature
-keyAgreement
-keyEncipherment
extended_key_usage:
-clientAuth
condition:"{{nova_pki_console_condition|bool}}"
# Installation details for SSL certificates for console hosts
nova_pki_console_install_certificates:
-src:"{{nova_user_ssl_cert|default(nova_pki_certs_path~'nova_'~ansible_facts['hostname']~'-client-chain.crt')}}"
dest:"{{nova_vencrypt_client_cert}}"
owner:"root"
group:"{{nova_system_group_name}}"
mode:"0640"
condition:"{{nova_pki_console_condition|bool}}"
-src:"{{nova_user_ssl_key|default(nova_pki_keys_path~'nova_'~ansible_facts['hostname']~'-client.key.pem')}}"
dest:"{{nova_vencrypt_client_key}}"
owner:"root"
group:"{{nova_system_group_name}}"
mode:"0640"
condition:"{{nova_pki_console_condition|bool}}"
-src:"{{nova_user_ssl_ca_cert|default(nova_pki_intermediate_chain_path)}}"
dest:"{{nova_vencrypt_ca_certs}}"
owner:"root"
group:"{{nova_system_group_name}}"
mode:"0640"
condition:"{{nova_pki_console_condition|bool}}"
# Extra settings which will be applied for `nova` user for offline
# migrations and resizes. Example:
# nova_ssh_custom_config:
# Port: 2022
nova_ssh_custom_config:{}
# host which holds the ssh certificate authority
nova_ssh_keypairs_setup_host:"{{openstack_ssh_keypairs_setup_host|default('localhost')}}"
# directory on the deploy host to create and store SSH keypairs
nova_ssh_keypairs_dir:"{{openstack_ssh_keypairs_dir|default('/etc/openstack_deploy/ssh_keypairs')}}"
# Each compute host needs a signed ssh certificate to log into the others
nova_ssh_keypairs:
-name:"nova-{{inventory_hostname}}"
cert:
signed_by:"{{openstack_ssh_signing_key}}"
principals:"{{nova_ssh_key_principals|default('nova')}}"
valid_from:"{{nova_ssh_key_valid_from|default('always')}}"
valid_to:"{{nova_ssh_key_valid_to|default('forever')}}"
# Each compute host needs the signed ssh certificate installing to the nova user
nova_ssh_keypairs_install_keys:
owner:"{{nova_system_user_name}}"
group:"{{nova_system_group_name}}"
keys:
-cert:"nova-{{inventory_hostname}}"
dest:"{{nova_system_home_folder}}/.ssh/id_rsa"
# Each compute host must trust the SSHD certificate authoritiy in the sshd configuration
nova_ssh_keypairs_install_ca:"{{openstack_ssh_keypairs_authorities}}"
# Each compute host must allow SSH certificates with the appropriate principal to log into the nova user
nova_ssh_keypairs_principals:
-user:"{{nova_system_user_name}}"
principals:"{{nova_ssh_key_principals|default(['nova'])}}"
###
### Backend TLS
###
# Define if communication between haproxy and service backends should be
# encrypted with TLS.
nova_backend_ssl:"{{openstack_service_backend_ssl|default(False)}}"
nova_pki_certificates_condition:>-
{{
nova_backend_ssl and (
'nova_console' in group_names or
'nova_api_metadata' in group_names or
'nova_api_os_compute' in group_names
)
}}
nova_pki_certificates:
# Used to encrypt traffic between haproxy and nova backends
-name:"nova_{{ansible_facts['hostname']}}_api"
provider:ownca
cn:"{{ansible_facts['hostname']}}"
san:"{{nova_pki_san}}"
signed_by:"{{nova_pki_intermediate_cert_name}}"
condition:"{{nova_pki_certificates_condition|bool}}"
# nova destination files for SSL certificates
nova_ssl_cert:"{{nova_system_home_folder}}/nova.pem"
nova_ssl_key:"{{nova_system_home_folder}}/nova.key"
# Installation details for SSL certificates
nova_pki_install_certificates:
-src:"{{nova_user_ssl_cert|default(nova_pki_certs_path~'nova_'~ansible_facts['hostname']~'_api-chain.crt')}}"
dest:"{{nova_ssl_cert}}"
owner:"{{nova_system_user_name}}"
group:"{{nova_system_user_name}}"
mode:"0644"
condition:"{{nova_pki_certificates_condition|bool}}"
-src:"{{nova_user_ssl_key|default(nova_pki_keys_path~'nova_'~ansible_facts['hostname']~'_api.key.pem')}}"
dest:"{{nova_ssl_key}}"
owner:"{{nova_system_user_name}}"
group:"{{nova_system_user_name}}"
mode:"0600"
condition:"{{nova_pki_certificates_condition|bool}}"
# Periodically move records for deleted resources to shadow tables
nova_archive_deleted:false
# When to start archive task. Reffer to Systemd Calendar Events for guidance
# on format:
# https://www.freedesktop.org/software/systemd/man/systemd.time.html#Calendar%20Events
nova_archive_deleted_on_calendar:"*-*-*00:00:00"
# Archive events that are older then the timeframe below.
# Should be in a format of bash date string
nova_archive_deleted_before:"6monthago"
# Delete records instead of moving them to shadow tables
nova_archive_deleted_purge:false
# Archive instance task log
nova_archive_task_log:false
# Delay the timer by a randomly selected amount of time.
nova_archive_deleted_randomized_delay_sec:0
# Periodically purge shadow tables, where archived records are stored
nova_purge_deleted:false
# When to start purge task.
nova_purge_deleted_on_calendar:"*-*-*01:00:00"
# Purge events that are older then the timeframe below.
nova_purge_deleted_before:"24monthago"
# Delay the timer by a randomly selected amount of time.
nova_purge_deleted_randomized_delay_sec:0

Dependencies

This role needs pip >= 7.1 installed on the target host.

Example playbook

---
-name:Installation and setup of Nova
hosts:nova_all
user:root
roles:
-role:"os_nova"
tags:
-os-nova
vars:
nova_galera_address:"{{internal_lb_vip_address}}"
galera_root_user:root
vars_prompt:
-name:"galera_root_password"
prompt:"Whatisgalera_root_password?"

Tags

This role supports two tags: nova-install and nova-config

The nova-install tag can be used to install and upgrade.

The nova-config tag can be used to manage configuration.

CPU platform compatibility

This role supports multiple CPU architecture types. At least one repo_build node must exist for each CPU type that is in use in the deployment.

Currently supported CPU architectures:
  • x86_64 / amd64

  • ppc64le

At this time, ppc64le is only supported for the Compute node type. It can not be used to manage the OpenStack-Ansible management nodes.

Compute driver compatibility

This role supports multiple nova compute driver types. The following compute drivers are supported:

  • libvirt (default)

  • ironic

The driver type is automatically detected by the OpenStack Ansible Nova role for the following compute driver types:

  • libvirt (kvm / qemu)

Any mix and match of compute node types can be used for those platforms, except for ironic.

The nova_virt_type may be set in /etc/openstack_deploy/user_variables.yml, for example:

nova_virt_type: ironic

You can set nova_virt_type per host by using host_vars in /etc/openstack_deploy/openstack_user_config.yml. For example:

compute_hosts:
 aio1:
 ip: 172.29.236.100
 host_vars:
 nova_virt_type: ironic

If nova_virt_type is set in /etc/openstack_deploy/user_variables.yml, all nodes in the deployment are set to that hypervisor type. Setting nova_virt_type in both /etc/openstack_deploy/user_variables.yml and /etc/openstack_deploy/openstack_user_config.yml will always result in the value specified in /etc/openstack_deploy/user_variables.yml being set on all hosts.