blob: 5201613f871665f7483ed9f2905954f2680d63c9 [file] [log] [blame]
Mohammed Naserb7b97d62022-03-12 16:30:00 -05001# Copyright (c) 2022 VEXXHOST, Inc.
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
14
guilhermesteinmuller4980b132023-01-24 18:50:14 +000015- name: Uninstall the legacy HelmRelease
16 run_once: true
17 block:
18 - name: Suspend the existing HelmRelease
Mohammed Naserf0314a82023-04-11 18:53:30 +000019 failed_when: false
guilhermesteinmuller4980b132023-01-24 18:50:14 +000020 kubernetes.core.k8s:
21 state: patched
22 api_version: helm.toolkit.fluxcd.io/v2beta1
23 kind: HelmRelease
Mohammed Naser2145fc32023-01-29 23:23:03 +000024 name: "{{ keystone_helm_release_name }}"
25 namespace: "{{ keystone_helm_release_namespace }}"
guilhermesteinmuller4980b132023-01-24 18:50:14 +000026 definition:
27 spec:
28 suspend: true
29
30 - name: Remove the existing HelmRelease
Mohammed Naserf0314a82023-04-11 18:53:30 +000031 failed_when: false
guilhermesteinmuller4980b132023-01-24 18:50:14 +000032 kubernetes.core.k8s:
33 state: absent
34 api_version: helm.toolkit.fluxcd.io/v2beta1
35 kind: HelmRelease
Mohammed Naser2145fc32023-01-29 23:23:03 +000036 name: "{{ keystone_helm_release_name }}"
37 namespace: "{{ keystone_helm_release_namespace }}"
Mohammed Naserb7b97d62022-03-12 16:30:00 -050038
Oleksandr Kozachenkob0093492023-09-06 21:43:47 +020039- name: Create Keycloak realms
Mohammed Naser59853d42023-11-29 20:32:24 -050040 no_log: true
Oleksandr Kozachenkob0093492023-09-06 21:43:47 +020041 run_once: true
42 delegate_to: localhost
43 changed_when: false
44 community.general.keycloak_realm:
45 # Keycloak settings
46 auth_keycloak_url: "{{ item.keycloak_server_url }}"
47 auth_realm: "{{ item.keycloak_user_realm_name }}"
48 auth_client_id: "{{ item.keycloak_admin_client_id }}"
49 auth_username: "{{ item.keycloak_admin_user }}"
50 auth_password: "{{ item.keycloak_admin_password }}"
51 validate_certs: "{{ cluster_issuer_type != 'self-signed' }}"
52 # Realm settings
53 id: "{{ item.keycloak_realm }}"
54 realm: "{{ item.keycloak_realm }}"
55 display_name: "{{ item.label }}"
56 enabled: true
57 loop: "{{ keystone_domains }}"
58 loop_control:
59 label: "{{ item.name }}"
60
61- name: Create ConfigMap with all OpenID connect configurations
62 run_once: true
63 kubernetes.core.k8s:
64 template: configmap-openid-metadata.yml.j2
65
66- name: Create Keycloak clients
67 run_once: true
68 delegate_to: localhost
69 community.general.keycloak_client:
70 # Keycloak settings
71 auth_keycloak_url: "{{ item.keycloak_server_url }}"
72 auth_realm: "{{ item.keycloak_user_realm_name }}"
73 auth_client_id: "{{ item.keycloak_admin_client_id }}"
74 auth_username: "{{ item.keycloak_admin_user }}"
75 auth_password: "{{ item.keycloak_admin_password }}"
76 validate_certs: "{{ cluster_issuer_type != 'self-signed' }}"
77 # Realm settings
78 realm: "{{ item.keycloak_realm }}"
79 client_id: "{{ item.keycloak_client_id }}"
80 secret: "{{ item.keycloak_client_secret }}"
81 redirect_uris:
82 - "{{ keystone_oidc_redirect_uri }}"
83 - "https://{{ openstack_helm_endpoints_horizon_api_host }}/auth/logout/"
84 loop: "{{ keystone_domains }}"
85 loop_control:
86 label: "{{ item.name }}"
87
Mohammed Naserb7b97d62022-03-12 16:30:00 -050088- name: Deploy Helm chart
guilhermesteinmuller4980b132023-01-24 18:50:14 +000089 run_once: true
90 kubernetes.core.helm:
Mohammed Naser2145fc32023-01-29 23:23:03 +000091 name: "{{ keystone_helm_release_name }}"
92 chart_ref: "{{ keystone_helm_chart_ref }}"
93 release_namespace: "{{ keystone_helm_release_namespace }}"
guilhermesteinmuller4980b132023-01-24 18:50:14 +000094 create_namespace: true
95 kubeconfig: /etc/kubernetes/admin.conf
Mohammed Naser2145fc32023-01-29 23:23:03 +000096 values: "{{ _keystone_helm_values | combine(keystone_helm_values, recursive=True) }}"
Mohammed Naserb7b97d62022-03-12 16:30:00 -050097
98- name: Create Ingress
99 ansible.builtin.include_role:
100 name: openstack_helm_ingress
101 vars:
102 openstack_helm_ingress_endpoint: identity
103 openstack_helm_ingress_service_name: keystone-api
104 openstack_helm_ingress_service_port: 5000
Mohammed Naser2145fc32023-01-29 23:23:03 +0000105 openstack_helm_ingress_annotations: "{{ keystone_ingress_annotations }}"
Oleksandr Kozachenkob0093492023-09-06 21:43:47 +0200106
Michiel Piscaer9ce6e892023-11-16 09:02:35 +0100107- name: Validate if ingress is reachable
108 ansible.builtin.uri:
109 url: "https://{{ openstack_helm_endpoints_keystone_api_host }}"
110 status_code: [300]
111 register: keystone_ingress_validate
112 until: keystone_ingress_validate.status == 300
113 retries: 60
114 delay: 1
115
Oleksandr Kozachenko7299c982023-11-23 10:48:14 +0100116- name: Wait until identity service ready
117 kubernetes.core.k8s_info:
118 api_version: apps/v1
119 kind: Deployment
120 name: keystone-api
121 namespace: openstack
122 wait_sleep: 10
123 wait_timeout: 600
124 wait: true
125 wait_condition:
126 type: Available
127 status: true
128
Oleksandr Kozachenkob0093492023-09-06 21:43:47 +0200129- name: Create Keystone domains
130 run_once: true
Oleksandr Kozachenkob0093492023-09-06 21:43:47 +0200131 vexxhost.atmosphere.identity_domain:
132 name: "{{ item.name }}"
Oleksandr Kozachenkob0093492023-09-06 21:43:47 +0200133 loop: "{{ keystone_domains }}"
134 loop_control:
135 label: "{{ item.name }}"
Oleksandr Kozachenko7299c982023-11-23 10:48:14 +0100136 # NOTE: This often fails since it takes time for the keystone api ready.
137 retries: 60
138 delay: 5
139 register: keystone_domains_result
140 until: keystone_domains_result is not failed
Oleksandr Kozachenkob0093492023-09-06 21:43:47 +0200141
142- name: Create Keystone identity providers
143 run_once: true
Oleksandr Kozachenkob0093492023-09-06 21:43:47 +0200144 vexxhost.atmosphere.federation_idp:
145 name: "{{ item.domain.name }}"
146 domain_id: "{{ item.domain.id }}"
147 remote_ids:
148 - "{{ item.item | vexxhost.atmosphere.issuer_from_domain }}"
149 loop: "{{ keystone_domains_result.results }}"
150 loop_control:
151 label: "{{ item.domain.name }}"
152
153- name: Create Keystone federation mappings
154 run_once: true
Oleksandr Kozachenkob0093492023-09-06 21:43:47 +0200155 vexxhost.atmosphere.federation_mapping:
156 name: "{{ item.name }}-openid"
157 rules:
158 - local:
159 - user:
160 type: local
161 id: "{0}"
162 domain:
163 name: "{{ item.name }}"
164 remote:
165 - type: OIDC-sub
166 loop: "{{ keystone_domains }}"
167 loop_control:
168 label: "{{ item.name }}"
169
170- name: Create Keystone federation protocols
171 run_once: true
Oleksandr Kozachenkob0093492023-09-06 21:43:47 +0200172 vexxhost.atmosphere.keystone_federation_protocol:
173 name: openid
174 idp_id: "{{ item.name }}"
175 mapping_id: "{{ item.name }}-openid"
176 loop: "{{ keystone_domains }}"
177 loop_control:
178 label: "{{ item.name }}"