
This pull request adds support for the OpenID Connect authentication flow in Keystone and enables both ID and access token authentication flows. The ID token configuration is designed to allow users to authenticate via Horizon using an identity federation; whereas the Access token is used to allow users to authenticate in the OpenStack CLI using a federated user. Without this PR, if one wants to configure OpenStack to use identity federation, he/she needs to do a lot of configurations in the keystone, Horizon, and register quite a good number of different parameters using the CLI such as mappings, identity providers, federated protocols, and so on. Therefore, with this PR, we propose a method for operators to introduce/present the IdP's metadata to Kolla-ansible, and based on the presented metadata, Kolla-ansible takes care of all of the configurations to prepare OpenStack to work in a federated environment. Implements: blueprint add-openid-support Co-Authored-By: Jason Anderson <jasonanderson@uchicago.edu> Change-Id: I0203a3470d7f8f2a54d5e126d947f540d93b8210
204 lines
9.6 KiB
YAML
204 lines
9.6 KiB
YAML
---
|
|
project_name: "keystone"
|
|
|
|
keystone_services:
|
|
keystone:
|
|
container_name: "keystone"
|
|
group: "keystone"
|
|
enabled: true
|
|
image: "{{ keystone_image_full }}"
|
|
volumes: "{{ keystone_default_volumes + keystone_extra_volumes }}"
|
|
dimensions: "{{ keystone_dimensions }}"
|
|
healthcheck: "{{ keystone_healthcheck }}"
|
|
haproxy:
|
|
keystone_internal:
|
|
enabled: "{{ enable_keystone }}"
|
|
mode: "http"
|
|
external: false
|
|
tls_backend: "{{ keystone_enable_tls_backend }}"
|
|
port: "{{ keystone_public_port }}"
|
|
listen_port: "{{ keystone_public_listen_port }}"
|
|
backend_http_extra: "{{ ['balance source'] if enable_keystone_federation | bool else [] }}"
|
|
keystone_external:
|
|
enabled: "{{ enable_keystone }}"
|
|
mode: "http"
|
|
external: true
|
|
tls_backend: "{{ keystone_enable_tls_backend }}"
|
|
port: "{{ keystone_public_port }}"
|
|
listen_port: "{{ keystone_public_listen_port }}"
|
|
backend_http_extra: "{{ ['balance source'] if enable_keystone_federation | bool else [] }}"
|
|
keystone_admin:
|
|
enabled: "{{ enable_keystone }}"
|
|
mode: "http"
|
|
external: false
|
|
tls_backend: "{{ keystone_enable_tls_backend }}"
|
|
port: "{{ keystone_admin_port }}"
|
|
listen_port: "{{ keystone_admin_listen_port }}"
|
|
keystone-ssh:
|
|
container_name: "keystone_ssh"
|
|
group: "keystone"
|
|
enabled: "{{ keystone_token_provider == 'fernet' }}"
|
|
image: "{{ keystone_ssh_image_full }}"
|
|
volumes:
|
|
- "{{ node_config_directory }}/keystone-ssh/:{{ container_config_directory }}/:ro"
|
|
- "/etc/localtime:/etc/localtime:ro"
|
|
- "{{ '/etc/timezone:/etc/timezone:ro' if ansible_os_family == 'Debian' else '' }}"
|
|
- "kolla_logs:/var/log/kolla/"
|
|
- "keystone_fernet_tokens:/etc/keystone/fernet-keys"
|
|
dimensions: "{{ keystone_ssh_dimensions }}"
|
|
healthcheck: "{{ keystone_ssh_healthcheck }}"
|
|
keystone-fernet:
|
|
container_name: "keystone_fernet"
|
|
group: "keystone"
|
|
enabled: "{{ keystone_token_provider == 'fernet' }}"
|
|
image: "{{ keystone_fernet_image_full }}"
|
|
volumes:
|
|
- "{{ node_config_directory }}/keystone-fernet/:{{ container_config_directory }}/:ro"
|
|
- "/etc/localtime:/etc/localtime:ro"
|
|
- "{{ '/etc/timezone:/etc/timezone:ro' if ansible_os_family == 'Debian' else '' }}"
|
|
- "kolla_logs:/var/log/kolla/"
|
|
- "keystone_fernet_tokens:/etc/keystone/fernet-keys"
|
|
dimensions: "{{ keystone_fernet_dimensions }}"
|
|
|
|
####################
|
|
# Database
|
|
####################
|
|
keystone_database_name: "keystone"
|
|
keystone_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}keystone{% endif %}"
|
|
keystone_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
|
|
|
|
|
|
####################
|
|
# Fernet
|
|
####################
|
|
keystone_username: "keystone"
|
|
keystone_groupname: "keystone"
|
|
|
|
|
|
####################
|
|
# Docker
|
|
####################
|
|
keystone_install_type: "{{ kolla_install_type }}"
|
|
keystone_tag: "{{ openstack_tag }}"
|
|
|
|
keystone_image: "{{ docker_registry ~ '/' if docker_registry else '' }}{{ docker_namespace }}/{{ kolla_base_distro }}-{{ keystone_install_type }}-keystone"
|
|
keystone_service_tag: "{{ keystone_tag }}"
|
|
keystone_image_full: "{{ keystone_image }}:{{ keystone_service_tag }}"
|
|
|
|
keystone_fernet_image: "{{ docker_registry ~ '/' if docker_registry else '' }}{{ docker_namespace }}/{{ kolla_base_distro }}-{{ keystone_install_type }}-keystone-fernet"
|
|
keystone_fernet_tag: "{{ keystone_tag }}"
|
|
keystone_fernet_image_full: "{{ keystone_fernet_image }}:{{ keystone_fernet_tag }}"
|
|
|
|
keystone_ssh_image: "{{ docker_registry ~ '/' if docker_registry else '' }}{{ docker_namespace }}/{{ kolla_base_distro }}-{{ keystone_install_type }}-keystone-ssh"
|
|
keystone_ssh_tag: "{{ keystone_tag }}"
|
|
keystone_ssh_image_full: "{{ keystone_ssh_image }}:{{ keystone_ssh_tag }}"
|
|
|
|
keystone_dimensions: "{{ default_container_dimensions }}"
|
|
keystone_fernet_dimensions: "{{ default_container_dimensions }}"
|
|
keystone_ssh_dimensions: "{{ default_container_dimensions }}"
|
|
|
|
keystone_enable_healthchecks: "{{ enable_container_healthchecks }}"
|
|
keystone_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
|
|
keystone_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
|
|
keystone_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
|
|
keystone_healthcheck_test: ["CMD-SHELL", "healthcheck_curl {{ 'https' if keystone_enable_tls_backend | bool else 'http' }}://{{ api_interface_address | put_address_in_context('url') }}:{{ keystone_public_listen_port }}"]
|
|
keystone_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
|
|
keystone_healthcheck:
|
|
interval: "{{ keystone_healthcheck_interval }}"
|
|
retries: "{{ keystone_healthcheck_retries }}"
|
|
start_period: "{{ keystone_healthcheck_start_period }}"
|
|
test: "{% if keystone_enable_healthchecks | bool %}{{ keystone_healthcheck_test }}{% else %}NONE{% endif %}"
|
|
timeout: "{{ keystone_healthcheck_timeout }}"
|
|
|
|
keystone_ssh_enable_healthchecks: "{{ enable_container_healthchecks }}"
|
|
keystone_ssh_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
|
|
keystone_ssh_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
|
|
keystone_ssh_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
|
|
keystone_ssh_healthcheck_test: ["CMD-SHELL", "healthcheck_listen sshd {{ keystone_ssh_port }}"]
|
|
keystone_ssh_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
|
|
keystone_ssh_healthcheck:
|
|
interval: "{{ keystone_ssh_healthcheck_interval }}"
|
|
retries: "{{ keystone_ssh_healthcheck_retries }}"
|
|
start_period: "{{ keystone_ssh_healthcheck_start_period }}"
|
|
test: "{% if keystone_ssh_enable_healthchecks | bool %}{{ keystone_ssh_healthcheck_test }}{% else %}NONE{% endif %}"
|
|
timeout: "{{ keystone_ssh_healthcheck_timeout }}"
|
|
|
|
keystone_default_volumes:
|
|
- "{{ node_config_directory }}/keystone/:{{ container_config_directory }}/:ro"
|
|
- "/etc/localtime:/etc/localtime:ro"
|
|
- "{{ '/etc/timezone:/etc/timezone:ro' if ansible_os_family == 'Debian' else '' }}"
|
|
- "{{ kolla_dev_repos_directory ~ '/keystone/keystone:/var/lib/kolla/venv/lib/python' ~ distro_python_version ~ '/site-packages/keystone' if keystone_dev_mode | bool else '' }}"
|
|
- "kolla_logs:/var/log/kolla/"
|
|
- "{% if keystone_token_provider == 'fernet' %}keystone_fernet_tokens:/etc/keystone/fernet-keys{% endif %}"
|
|
|
|
keystone_extra_volumes: "{{ default_extra_volumes }}"
|
|
|
|
####################
|
|
# OpenStack
|
|
####################
|
|
keystone_logging_debug: "{{ openstack_logging_debug }}"
|
|
|
|
openstack_keystone_auth: "{{ openstack_auth }}"
|
|
|
|
|
|
####################
|
|
# Kolla
|
|
####################
|
|
keystone_git_repository: "{{ kolla_dev_repos_git }}/{{ project_name }}"
|
|
keystone_dev_repos_pull: "{{ kolla_dev_repos_pull }}"
|
|
keystone_dev_mode: "{{ kolla_dev_mode }}"
|
|
keystone_source_version: "{{ kolla_source_version }}"
|
|
|
|
|
|
####################
|
|
# Notifications
|
|
####################
|
|
keystone_default_notifications_topic_enabled: "{{ enable_ceilometer | bool }}"
|
|
keystone_default_notifications_topic_name: "notifications"
|
|
|
|
keystone_notification_topics:
|
|
- name: "{{ keystone_default_notifications_topic_name }}"
|
|
enabled: "{{ keystone_default_notifications_topic_enabled | bool }}"
|
|
- name: barbican_notifications
|
|
enabled: "{{ enable_barbican | bool }}"
|
|
|
|
keystone_enabled_notification_topics: "{{ keystone_notification_topics | selectattr('enabled', 'equalto', true) | list }}"
|
|
|
|
|
|
####################
|
|
# Keystone
|
|
####################
|
|
keystone_ks_services:
|
|
- name: "keystone"
|
|
type: "identity"
|
|
description: "Openstack Identity Service"
|
|
endpoints:
|
|
- {'interface': 'admin', 'url': '{{ keystone_admin_url }}'}
|
|
- {'interface': 'internal', 'url': '{{ keystone_internal_url }}'}
|
|
- {'interface': 'public', 'url': '{{ keystone_public_url }}'}
|
|
|
|
####################
|
|
# TLS
|
|
####################
|
|
keystone_enable_tls_backend: "{{ kolla_enable_tls_backend }}"
|
|
|
|
###############################
|
|
# OpenStack identity federation
|
|
###############################
|
|
# Default OpenID Connect remote attribute key
|
|
keystone_remote_id_attribute_oidc: "HTTP_OIDC_ISS"
|
|
keystone_container_federation_oidc_metadata_folder: "{{ '/etc/apache2/metadata' if kolla_base_distro in ['debian', 'ubuntu'] else '/etc/httpd/metadata' }}"
|
|
keystone_container_federation_oidc_idp_certificate_folder: "{{ '/etc/apache2/cert' if kolla_base_distro in ['debian', 'ubuntu'] else '/etc/httpd/cert' }}"
|
|
keystone_container_federation_oidc_attribute_mappings_folder: "{{ container_config_directory }}/federation/oidc/attribute_maps"
|
|
keystone_host_federation_oidc_metadata_folder: "{{ node_config_directory }}/keystone/federation/oidc/metadata"
|
|
keystone_host_federation_oidc_idp_certificate_folder: "{{ node_config_directory }}/keystone/federation/oidc/cert"
|
|
keystone_host_federation_oidc_attribute_mappings_folder: "{{ node_config_directory }}/keystone/federation/oidc/attribute_maps"
|
|
|
|
# These variables are used to define multiple trusted Horizon dashboards.
|
|
# keystone_trusted_dashboards: ['<https://dashboardServerOne/auth/websso/>', '<https://dashboardServerTwo/auth/websso/>', '<https://dashboardServerN/auth/websso/>']
|
|
keystone_trusted_dashboards: "{{ ['%s://%s/auth/websso/' % (public_protocol, kolla_external_fqdn), '%s/auth/websso/' % (horizon_public_endpoint)] if enable_horizon | bool else [] }}"
|
|
keystone_enable_federation_openid: "{{ enable_keystone_federation | bool and keystone_identity_providers | selectattr('protocol','equalto','openid') | list | count > 0 }}"
|
|
keystone_should_remove_attribute_mappings: False
|
|
keystone_should_remove_identity_providers: False
|
|
keystone_federation_oidc_scopes: "openid email profile"
|