c2139a7db2
Since we moved to containerized UC, TLS Everywhere deployments are broken. Namely we miss two things: A. The NAT iptables rule for the nova metadata service to be reachable B. The setting 'service_metadata_proxy=false' needs to be set for nova metadata otherwise the curl calls to setup ipa will fail with the following: [root@overcloud-controller-0 log]# curl http://169.254.169.254/openstack/2016-10-06 <html> <head> <title>400 Bad Request</title> </head> <body> <h1>400 Bad Request</h1> X-Instance-ID header is missing from request.<br /><br /> </body> </html> A. Is fixed by adding a conditional iptables rule that is only triggered when deploying an undercloud (where we set MetadataNATRule to true) B. Is fixed by setting NeutronMetadataProxySharedSecret to '' on the undercloud and then setting the corresponding hiera keys only when the parameter != ''. We tried alternative simpler approaches like setting NeutronMetadataProxySharedSecret to null but that will break heat as the parameter is required and setting it to null breaks heat validation (we also tried to make the parameter optional with a default: '', but that broke as well) While we're at it we also remove the neutron metadata service from the undercloud as it is not needed. Tested by deploying an undercloud with this change and observing: A. Chain PREROUTING (policy ACCEPT 106 packets, 6698 bytes) pkts bytes target prot opt in out source destination 0 0 REDIRECT tcp -- br-ctlplane * 0.0.0.0/0 169.254.169.254 multiport dports 80 state NEW /* 999 undercloud nat ipv4 */ redir ports 8775 B. grep -ir ^service_metadata_proxy /var/lib/config-data/puppet-generated/nova/etc/nova/nova.conf service_metadata_proxy=False Also a deployment of a TLS overcloud was successful. Change-Id: Id48df6db012fb433f9a0e618d0269196f4cfc2c6 Co-Authored-By: Martin Schuppert <mschuppe@redhat.com> Closes-Bug: #1795722
343 lines
14 KiB
YAML
343 lines
14 KiB
YAML
heat_template_version: rocky
|
|
|
|
description: >
|
|
OpenStack Nova API service configured with Puppet
|
|
|
|
parameters:
|
|
ServiceData:
|
|
default: {}
|
|
description: Dictionary packing service data
|
|
type: json
|
|
ServiceNetMap:
|
|
default: {}
|
|
description: Mapping of service_name -> network name. Typically set
|
|
via parameter_defaults in the resource registry. This
|
|
mapping overrides those in ServiceNetMapDefaults.
|
|
type: json
|
|
DefaultPasswords:
|
|
default: {}
|
|
type: json
|
|
RoleName:
|
|
default: ''
|
|
description: Role name on which the service is applied
|
|
type: string
|
|
RoleParameters:
|
|
default: {}
|
|
description: Parameters specific to the role
|
|
type: json
|
|
EndpointMap:
|
|
default: {}
|
|
description: Mapping of service endpoint -> protocol. Typically set
|
|
via parameter_defaults in the resource registry.
|
|
type: json
|
|
NovaWorkers:
|
|
default: 0
|
|
description: Number of workers for Nova services.
|
|
type: number
|
|
NovaPassword:
|
|
description: The password for the nova service and db account
|
|
type: string
|
|
hidden: true
|
|
KeystoneRegion:
|
|
type: string
|
|
default: 'regionOne'
|
|
description: Keystone region for endpoint
|
|
NeutronMetadataProxySharedSecret:
|
|
description: Shared secret to prevent spoofing
|
|
type: string
|
|
hidden: true
|
|
InstanceNameTemplate:
|
|
default: 'instance-%08x'
|
|
description: Template string to be used to generate instance names
|
|
type: string
|
|
NovaEnableDBPurge:
|
|
default: true
|
|
description: |
|
|
Whether to create cron job for purging soft deleted rows in Nova database.
|
|
type: boolean
|
|
NovaEnableDBArchive:
|
|
default: true
|
|
description: |
|
|
Whether to create cron job for archiving soft deleted rows in Nova database.
|
|
type: boolean
|
|
MonitoringSubscriptionNovaApi:
|
|
default: 'overcloud-nova-api'
|
|
type: string
|
|
NovaApiLoggingSource:
|
|
type: json
|
|
default:
|
|
tag: openstack.nova.api
|
|
path: /var/log/nova/nova-api.log
|
|
EnableInternalTLS:
|
|
type: boolean
|
|
default: false
|
|
NovaDefaultFloatingPool:
|
|
default: 'public'
|
|
description: Default pool for floating IP addresses
|
|
type: string
|
|
NovaDbSyncTimeout:
|
|
default: 300
|
|
description: Timeout for Nova db sync
|
|
type: number
|
|
NovaApiPolicies:
|
|
description: |
|
|
A hash of policies to configure for Nova API.
|
|
e.g. { nova-context_is_admin: { key: context_is_admin, value: 'role:admin' } }
|
|
default: {}
|
|
type: json
|
|
NovaCronDBArchivedMinute:
|
|
type: string
|
|
description: >
|
|
Cron to move deleted instances to another table that doesn't need backup - Minute
|
|
default: '1'
|
|
NovaCronDBArchivedHour:
|
|
type: string
|
|
description: >
|
|
Cron to move deleted instances to another table that doesn't need backup - Hour
|
|
default: '0'
|
|
NovaCronDBArchivedMonthday:
|
|
type: string
|
|
description: >
|
|
Cron to move deleted instances to another table that doesn't need backup - Month Day
|
|
default: '*'
|
|
NovaCronDBArchivedMonth:
|
|
type: string
|
|
description: >
|
|
Cron to move deleted instances to another table that doesn't need backup - Month
|
|
default: '*'
|
|
NovaCronDBArchivedWeekday:
|
|
type: string
|
|
description: >
|
|
Cron to move deleted instances to another table that doesn't need backup - Week Day
|
|
default: '*'
|
|
|
|
conditions:
|
|
nova_workers_zero: {equals : [{get_param: NovaWorkers}, 0]}
|
|
is_neutron_shared_metadata_notempty: {not: {equals: [{get_param: NeutronMetadataProxySharedSecret}, '']}}
|
|
|
|
resources:
|
|
ApacheServiceBase:
|
|
type: ./apache.yaml
|
|
properties:
|
|
ServiceNetMap: {get_param: ServiceNetMap}
|
|
DefaultPasswords: {get_param: DefaultPasswords}
|
|
EndpointMap: {get_param: EndpointMap}
|
|
RoleName: {get_param: RoleName}
|
|
RoleParameters: {get_param: RoleParameters}
|
|
EnableInternalTLS: {get_param: EnableInternalTLS}
|
|
|
|
NovaBase:
|
|
type: ./nova-base.yaml
|
|
properties:
|
|
ServiceData: {get_param: ServiceData}
|
|
ServiceNetMap: {get_param: ServiceNetMap}
|
|
DefaultPasswords: {get_param: DefaultPasswords}
|
|
EndpointMap: {get_param: EndpointMap}
|
|
RoleName: {get_param: RoleName}
|
|
RoleParameters: {get_param: RoleParameters}
|
|
|
|
outputs:
|
|
role_data:
|
|
description: Role data for the Nova API service.
|
|
value:
|
|
service_name: nova_api
|
|
monitoring_subscription: {get_param: MonitoringSubscriptionNovaApi}
|
|
config_settings:
|
|
map_merge:
|
|
- get_attr: [NovaBase, role_data, config_settings]
|
|
- get_attr: [ApacheServiceBase, role_data, config_settings]
|
|
- nova::cron::archive_deleted_rows::hour: '*/12'
|
|
nova::cron::archive_deleted_rows::destination: '/dev/null'
|
|
tripleo.nova_api.firewall_rules:
|
|
'113 nova_api':
|
|
dport:
|
|
- 8774
|
|
- 13774
|
|
- 8775
|
|
nova::keystone::authtoken::project_name: 'service'
|
|
nova::keystone::authtoken::user_domain_name: 'Default'
|
|
nova::keystone::authtoken::project_domain_name: 'Default'
|
|
nova::keystone::authtoken::password: {get_param: NovaPassword}
|
|
nova::keystone::authtoken::www_authenticate_uri: {get_param: [EndpointMap, KeystoneInternal, uri_no_suffix] }
|
|
nova::keystone::authtoken::auth_uri: {get_param: [EndpointMap, KeystoneInternal, uri_no_suffix] }
|
|
nova::keystone::authtoken::auth_url: {get_param: [EndpointMap, KeystoneInternal, uri_no_suffix]}
|
|
nova::api::enabled: true
|
|
nova::api::default_floating_pool: {get_param: NovaDefaultFloatingPool}
|
|
nova::api::sync_db_api: true
|
|
nova::api::enable_proxy_headers_parsing: true
|
|
nova::api::api_bind_address:
|
|
str_replace:
|
|
template:
|
|
"%{hiera('fqdn_$NETWORK')}"
|
|
params:
|
|
$NETWORK: {get_param: [ServiceNetMap, NovaApiNetwork]}
|
|
nova_wsgi_enabled: true
|
|
nova::api::service_name: 'httpd'
|
|
nova::wsgi::apache_api::ssl: {get_param: EnableInternalTLS}
|
|
# NOTE: bind IP is found in hiera replacing the network name with the local node IP
|
|
# for the given network; replacement examples (eg. for internal_api):
|
|
# internal_api -> IP
|
|
# internal_api_uri -> [IP]
|
|
# internal_api_subnet - > IP/CIDR
|
|
nova::wsgi::apache_api::bind_host:
|
|
str_replace:
|
|
template:
|
|
"%{hiera('$NETWORK')}"
|
|
params:
|
|
$NETWORK: {get_param: [ServiceNetMap, NovaApiNetwork]}
|
|
nova::wsgi::apache_api::servername:
|
|
str_replace:
|
|
template:
|
|
"%{hiera('fqdn_$NETWORK')}"
|
|
params:
|
|
$NETWORK: {get_param: [ServiceNetMap, NovaApiNetwork]}
|
|
nova::api::instance_name_template: {get_param: InstanceNameTemplate}
|
|
nova_enable_db_purge: {get_param: NovaEnableDBPurge}
|
|
nova::cron::archive_deleted_rows::minute: {get_param: NovaCronDBArchivedMinute}
|
|
nova::cron::archive_deleted_rows::hour: {get_param: NovaCronDBArchivedHour}
|
|
nova::cron::archive_deleted_rows::monthday: {get_param: NovaCronDBArchivedMonthday}
|
|
nova::cron::archive_deleted_rows::month: {get_param: NovaCronDBArchivedMonth}
|
|
nova::cron::archive_deleted_rows::weekday: {get_param: NovaCronDBArchivedWeekday}
|
|
nova_enable_db_archive: {get_param: NovaEnableDBArchive}
|
|
nova::policy::policies: {get_param: NovaApiPolicies}
|
|
-
|
|
if:
|
|
- nova_workers_zero
|
|
- {}
|
|
- nova::api::osapi_compute_workers: {get_param: NovaWorkers}
|
|
nova::wsgi::apache_api::workers: {get_param: NovaWorkers}
|
|
-
|
|
if:
|
|
- is_neutron_shared_metadata_notempty
|
|
- nova::api::neutron_metadata_proxy_shared_secret: {get_param: NeutronMetadataProxySharedSecret}
|
|
- {}
|
|
step_config: |
|
|
include tripleo::profile::base::nova::api
|
|
service_config_settings:
|
|
fluentd:
|
|
tripleo_fluentd_groups_nova_api:
|
|
- nova
|
|
tripleo_fluentd_sources_nova_api:
|
|
- {get_param: NovaApiLoggingSource}
|
|
mysql:
|
|
map_merge:
|
|
- {get_attr: [NovaBase, role_data, service_config_settings, mysql]}
|
|
- nova::db::mysql::password: {get_param: NovaPassword}
|
|
nova::db::mysql::user: nova
|
|
nova::db::mysql::host: {get_param: [EndpointMap, MysqlInternal, host_nobrackets]}
|
|
nova::db::mysql::dbname: nova
|
|
nova::db::mysql::allowed_hosts:
|
|
- '%'
|
|
- "%{hiera('mysql_bind_host')}"
|
|
nova::db::mysql_api::password: {get_param: NovaPassword}
|
|
nova::db::mysql_api::user: nova_api
|
|
nova::db::mysql_api::host: {get_param: [EndpointMap, MysqlInternal, host_nobrackets]}
|
|
nova::db::mysql_api::dbname: nova_api
|
|
nova::db::mysql_api::allowed_hosts:
|
|
- '%'
|
|
- "%{hiera('mysql_bind_host')}"
|
|
keystone:
|
|
nova::keystone::auth::tenant: 'service'
|
|
nova::keystone::auth::public_url: {get_param: [EndpointMap, NovaPublic, uri]}
|
|
nova::keystone::auth::internal_url: {get_param: [EndpointMap, NovaInternal, uri]}
|
|
nova::keystone::auth::admin_url: {get_param: [EndpointMap, NovaAdmin, uri]}
|
|
nova::keystone::auth::password: {get_param: NovaPassword}
|
|
nova::keystone::auth::region: {get_param: KeystoneRegion}
|
|
metadata_settings:
|
|
get_attr: [ApacheServiceBase, role_data, metadata_settings]
|
|
upgrade_tasks:
|
|
list_concat:
|
|
- get_attr: [ApacheServiceBase, role_data, upgrade_tasks]
|
|
-
|
|
- name: get bootstrap nodeid
|
|
tags: common
|
|
command: hiera bootstrap_nodeid
|
|
register: bootstrap_node
|
|
- name: set is_bootstrap_node fact
|
|
tags: common
|
|
set_fact: is_bootstrap_node={{bootstrap_node.stdout|lower == ansible_hostname|lower}}
|
|
- name: Extra migration for nova tripleo/+bug/1656791
|
|
tags: pre-upgrade
|
|
when:
|
|
- step|int == 0
|
|
- is_bootstrap_node|bool
|
|
command: nova-manage db online_data_migrations
|
|
- name: Stop and disable nova_api service (pre-upgrade not under httpd)
|
|
when: step|int == 2
|
|
service: name=openstack-nova-api state=stopped enabled=no
|
|
- name: Create puppet manifest to set transport_url in nova.conf
|
|
when:
|
|
- step|int == 5
|
|
- is_bootstrap_node|bool
|
|
copy:
|
|
dest: /root/nova-api_upgrade_manifest.pp
|
|
mode: 0600
|
|
content: >
|
|
$transport_url = os_transport_url({
|
|
'transport' => hiera('oslo_messaging_rpc_scheme', 'rabbit'),
|
|
'hosts' => any2array(hiera('oslo_messaging_rpc_node_names', undef)),
|
|
'port' => sprintf('%s',hiera('oslo_messaging_rpc_port', '5672') ),
|
|
'username' => hiera('oslo_messaging_rpc_user_name', 'guest'),
|
|
'password' => hiera('oslo_messaging_rpc_password'),
|
|
'ssl' => sprintf('%s', bool2num(str2bool(hiera('oslo_messaging_rpc_use_ssl', '0'))))
|
|
})
|
|
oslo::messaging::default { 'nova_config':
|
|
transport_url => $transport_url
|
|
}
|
|
- name: Run puppet apply to set tranport_url in nova.conf
|
|
when:
|
|
- step|int == 5
|
|
- is_bootstrap_node|bool
|
|
command: puppet apply --summarize --modulepath /etc/puppet/modules:/opt/stack/puppet-modules:/usr/share/openstack-puppet/modules --detailed-exitcodes /root/nova-api_upgrade_manifest.pp
|
|
register: puppet_apply_nova_api_upgrade
|
|
failed_when: puppet_apply_nova_api_upgrade.rc not in [0,2]
|
|
changed_when: puppet_apply_nova_api_upgrade.rc == 2
|
|
- name: Setup cell_v2 (map cell0)
|
|
when:
|
|
- step|int == 5
|
|
- is_bootstrap_node|bool
|
|
shell: nova-manage cell_v2 map_cell0 --database_connection=$(hiera nova::cell0_database_connection)
|
|
- name: Setup cell_v2 (create default cell)
|
|
when:
|
|
- step|int == 5
|
|
- is_bootstrap_node|bool
|
|
# (owalsh) puppet-nova expects the cell name 'default'
|
|
# (owalsh) pass the db uri explicitly to avoid https://bugs.launchpad.net/tripleo/+bug/1662344
|
|
shell: nova-manage cell_v2 create_cell --name='default' --database_connection=$(hiera nova::database_connection)
|
|
register: nova_api_create_cell
|
|
failed_when: nova_api_create_cell.rc not in [0,2]
|
|
changed_when: nova_api_create_cell.rc == 0
|
|
- name: Setup cell_v2 (sync nova/cell DB)
|
|
when:
|
|
- step|int == 5
|
|
- is_bootstrap_node|bool
|
|
command: nova-manage db sync
|
|
async: {get_param: NovaDbSyncTimeout}
|
|
poll: 10
|
|
- name: Setup cell_v2 (get cell uuid)
|
|
when:
|
|
- step|int == 5
|
|
- is_bootstrap_node|bool
|
|
shell: nova-manage cell_v2 list_cells | sed -e '1,3d' -e '$d' | awk -F ' *| *' '$2 == "default" {print $4}'
|
|
register: nova_api_cell_uuid
|
|
- name: Setup cell_v2 (migrate hosts)
|
|
when:
|
|
- step|int == 5
|
|
- is_bootstrap_node|bool
|
|
command: nova-manage cell_v2 discover_hosts --cell_uuid {{nova_api_cell_uuid.stdout}} --verbose
|
|
- name: Setup cell_v2 (migrate instances)
|
|
when:
|
|
- step|int == 5
|
|
- is_bootstrap_node|bool
|
|
command: nova-manage cell_v2 map_instances --cell_uuid {{nova_api_cell_uuid.stdout}}
|
|
- name: Sync nova_api DB
|
|
command: nova-manage api_db sync
|
|
when:
|
|
- step|int == 5
|
|
- is_bootstrap_node|bool
|
|
- name: Online data migration for nova
|
|
when:
|
|
- step|int == 5
|
|
- is_bootstrap_node|bool
|
|
command: nova-manage db online_data_migrations
|