|
10 | 10 | resources: "{{ managed_clusters['resources'] }}" |
11 | 11 |
|
12 | 12 | - name: Do nothing when no managed clusters are found |
13 | | - ansible.builtin.meta: end_play |
| 13 | + ansible.builtin.set_fact: |
| 14 | + have_managed_clusters: false |
14 | 15 | when: resources | length == 0 or managed_clusters.failed or not managed_clusters.api_found |
15 | 16 |
|
16 | 17 | # These three loops are not done in one pass because sometimes the managedCluster is not fully |
|
21 | 22 | {'caBundle': item.spec.managedClusterClientConfigs[0].caBundle | b64decode, |
22 | 23 | 'name': item.metadata.name}}) }}" |
23 | 24 | loop: "{{ resources }}" |
24 | | - when: item.spec.managedClusterClientConfigs[0].caBundle is defined |
| 25 | + when: |
| 26 | + - have_managed_clusters |
| 27 | + - item.spec.managedClusterClientConfigs[0].caBundle is defined |
25 | 28 | loop_control: |
26 | 29 | label: "{{ item.metadata.name }}" |
27 | 30 |
|
28 | 31 | - name: Extract ClusterGroup |
29 | 32 | ansible.builtin.set_fact: |
30 | 33 | clusters: "{{ clusters | default({}) | combine({item.metadata.name: {'clusterGroup': item.metadata.labels.clusterGroup}}, recursive=True) }}" |
31 | | - when: "'clusterGroup' in item.metadata.labels" |
| 34 | + when: |
| 35 | + - have_managed_clusters |
| 36 | + - "'clusterGroup' in item.metadata.labels" |
32 | 37 | loop: "{{ resources }}" |
33 | 38 | loop_control: |
34 | 39 | label: "{{ item.metadata.name }}" |
|
43 | 48 | _cluster_fqdn: "{{ item.status.clusterClaims | selectattr('name', 'equalto', 'consoleurl.cluster.open-cluster-management.io') |
44 | 49 | | map(attribute='value') |
45 | 50 | | first | ansible.builtin.urlsplit('hostname') | regex_replace('console-openshift-console\\.apps\\.', '') }}" |
46 | | - when: item.spec.managedClusterClientConfigs[0].url is defined |
| 51 | + when: |
| 52 | + - have_managed_clusters |
| 53 | + - item.spec.managedClusterClientConfigs[0].url is defined |
47 | 54 | loop_control: |
48 | 55 | label: "{{ item.metadata.name }}" |
49 | 56 |
|
|
55 | 62 | loop: "{{ clusters | dict2items }}" |
56 | 63 | loop_control: |
57 | 64 | label: "{{ item.key }}" |
| 65 | + when: |
| 66 | + - have_managed_clusters |
58 | 67 |
|
59 | 68 | # These three steps will only work on ACM 2.12 which uses these secrets to connect to the spokes |
60 | 69 | - name: Fetch all ACM secrets |
|
63 | 72 | label_selectors: |
64 | 73 | - "apps.open-cluster-management.io/secret-type=acm-cluster" |
65 | 74 | register: acm_secrets_raw |
| 75 | + when: |
| 76 | + - have_managed_clusters |
66 | 77 |
|
67 | 78 | - name: Set acm secrets fact |
68 | 79 | ansible.builtin.set_fact: |
69 | 80 | acm_secrets: "{{ acm_secrets_raw.resources }}" |
| 81 | + when: |
| 82 | + - have_managed_clusters |
70 | 83 |
|
71 | 84 | - name: Set cleaned_acm_secrets fact |
72 | 85 | ansible.builtin.set_fact: |
73 | 86 | cleaned_acm_secrets: "{{ acm_secrets | rhvp.cluster_utils.parse_acm_secrets }}" |
74 | | - when: acm_secrets | length > 0 |
| 87 | + when: |
| 88 | + - have_managed_clusters |
| 89 | + - acm_secrets | length > 0 |
75 | 90 |
|
76 | 91 | - name: Merge the two dicts together |
77 | 92 | ansible.builtin.set_fact: |
78 | 93 | clusters_info: "{{ clusters | default({}) | combine(cleaned_acm_secrets, recursive=True) }}" |
79 | | - when: acm_secrets | length > 0 |
80 | | - |
| 94 | + when: |
| 95 | + - have_managed_clusters |
| 96 | + - acm_secrets | length > 0 |
81 | 97 | # These steps will only work on ACM >= 2.13 which uses managed service accounts to connect to remote spokes |
82 | 98 | # ACM creates a namespace named like the remote cluster and we loop those |
83 | 99 | - name: Get the ACM secrets when on ACM >=2.13 |
|
87 | 103 | name: application-manager |
88 | 104 | register: msa_secrets |
89 | 105 | loop: "{{ resources }}" |
90 | | - when: acm_secrets | length == 0 |
| 106 | + when: |
| 107 | + - have_managed_clusters |
| 108 | + - acm_secrets | length == 0 |
91 | 109 | loop_control: |
92 | 110 | label: "{{ item.metadata.name }}" |
93 | 111 |
|
|
98 | 116 | clusters: "{{ clusters | default({}) | combine({item.item.metadata.name: {'bearerToken': item.resources[0].data.token | b64decode}}, recursive=True) }}" |
99 | 117 | loop: "{{ msa_secrets.results }}" |
100 | 118 | when: |
| 119 | + - have_managed_clusters |
101 | 120 | - acm_secrets | length == 0 |
102 | 121 | - msa_secrets.results | length > 0 |
103 | 122 | loop_control: |
|
106 | 125 | - name: Set cluster_info fact |
107 | 126 | ansible.builtin.set_fact: |
108 | 127 | clusters_info: "{{ clusters }}" |
109 | | - when: acm_secrets | length == 0 |
| 128 | + when: |
| 129 | + - have_managed_clusters |
| 130 | + - acm_secrets | length == 0 |
110 | 131 |
|
111 | 132 | - name: Write out CAs |
112 | 133 | ansible.builtin.copy: |
113 | 134 | content: "{{ item.value['caBundle'] }}" |
114 | 135 | dest: "/tmp/{{ item.key }}.ca" |
115 | 136 | mode: "0640" |
116 | 137 | loop: "{{ clusters_info | dict2items }}" |
117 | | - when: item.value['caBundle'] is defined |
| 138 | + when: |
| 139 | + - have_managed_clusters |
| 140 | + - item.value['caBundle'] is defined |
118 | 141 | loop_control: |
119 | 142 | label: "{{ item.key }}" |
120 | 143 |
|
|
124 | 147 | - name: If we are using letsencrypt on the API endpoints we cannot use the validate_certs later |
125 | 148 | ansible.builtin.set_fact: |
126 | 149 | validate_certs_api_endpoint: "{{ not letsencrypt.api_endpoint | default(True) | bool }}" |
| 150 | + when: |
| 151 | + - have_managed_clusters |
127 | 152 |
|
128 | 153 | - name: Fetch remote external secrets from remote cluster |
129 | 154 | kubernetes.core.k8s_info: |
|
147 | 172 | # https://serverfault.com/questions/1059530/how-to-not-print-items-in-an-ansible-loop-error-without-no-log) |
148 | 173 | no_log: '{{ hide_sensitive_output | default(true) }}' |
149 | 174 | when: |
| 175 | + - have_managed_clusters |
150 | 176 | - clusters_info[item.key]['bearerToken'] is defined |
151 | 177 | - clusters_info[item.key]['server_api'] is defined |
152 | 178 | - clusters_info[item.key]['caBundle'] is defined |
|
176 | 202 | # https://serverfault.com/questions/1059530/how-to-not-print-items-in-an-ansible-loop-error-without-no-log) |
177 | 203 | no_log: '{{ hide_sensitive_output | default(true) }}' |
178 | 204 | when: |
| 205 | + - have_managed_clusters |
179 | 206 | - clusters_info[item.key]['bearerToken'] is defined |
180 | 207 | - clusters_info[item.key]['server_api'] is defined |
181 | 208 | - clusters_info[item.key]['caBundle'] is defined |
|
189 | 216 | ansible.builtin.set_fact: |
190 | 217 | clusters_info: "{{ clusters_info | default({}) | combine({item['item']['key']: {'esoToken': item['resources'][0]['data']['token'] | b64decode, 'activeExternalSecretsNs': external_secrets_ns, 'activeExternalSecretsSa': external_secrets_sa}}, recursive=True) }}" |
191 | 218 | loop: "{{ remote_external_secrets_sa.results }}" |
192 | | - when: item['resources'][0]['data']['token'] is defined |
| 219 | + when: |
| 220 | + - have_managed_clusters |
| 221 | + - item['resources'][0]['data']['token'] is defined |
193 | 222 | loop_control: |
194 | 223 | label: "{{ item['item']['key'] }}" |
195 | 224 |
|
|
200 | 229 | clusters_info: "{{ clusters_info | default({}) | combine({item['item']['key']: {'esoToken': item['resources'][0]['data']['token'] | b64decode, 'activeExternalSecretsNs': legacy_external_secrets_ns, 'activeExternalSecretsSa': legacy_external_secrets_sa}}, recursive=True) }}" |
201 | 230 | loop: "{{ remote_legacy_external_secrets_sa.results }}" |
202 | 231 | when: |
| 232 | + - have_managed_clusters |
203 | 233 | - item['resources'][0]['data']['token'] is defined |
204 | 234 | - clusters_info[item['item']['key']]['esoToken'] is not defined |
205 | 235 | loop_control: |
|
223 | 253 | command: bash -e -c "echo '{{ item.value['caBundle'] }}' > /tmp/{{ item.value['vault_path'] }}.ca" |
224 | 254 | loop: "{{ clusters_info | dict2items }}" |
225 | 255 | when: |
| 256 | + - have_managed_clusters |
226 | 257 | - item.value['esoToken'] is defined |
227 | 258 | - item.key != "local-cluster" |
228 | 259 | loop_control: |
|
238 | 269 | vault auth enable -path='{{ item.value['vault_path'] }}' kubernetes; fi" |
239 | 270 | loop: "{{ clusters_info | dict2items }}" |
240 | 271 | when: |
| 272 | + - have_managed_clusters |
241 | 273 | - item.value['esoToken'] is defined |
242 | 274 | - item.key != "local-cluster" |
243 | 275 | loop_control: |
|
254 | 286 | kubernetes_ca_cert=@/tmp/{{ item.value['vault_path'] }}.ca" |
255 | 287 | loop: "{{ clusters_info | dict2items }}" |
256 | 288 | when: |
| 289 | + - have_managed_clusters |
257 | 290 | - item.value['esoToken'] is defined |
258 | 291 | - item.key != "local-cluster" |
259 | 292 | loop_control: |
|
268 | 301 | capabilities = {{ vault_spoke_capabilities }} }\" > /tmp/policy-{{ item.value['vault_path'] }}.hcl" |
269 | 302 | loop: "{{ clusters_info | dict2items }}" |
270 | 303 | when: |
| 304 | + - have_managed_clusters |
271 | 305 | - item.value['esoToken'] is defined |
272 | 306 | - item.key != "local-cluster" |
273 | 307 | loop_control: |
|
282 | 316 | capabilities = {{ vault_pushsecrets_capabilities }} }\" >> /tmp/policy-{{ item.value['vault_path'] }}.hcl" |
283 | 317 | loop: "{{ clusters_info | dict2items }}" |
284 | 318 | when: |
| 319 | + - have_managed_clusters |
285 | 320 | - item.value['esoToken'] is defined |
286 | 321 | - item.key != "local-cluster" |
287 | 322 | loop_control: |
|
296 | 331 | capabilities = {{ vault_pushsecrets_capabilities }} }\" >> /tmp/policy-{{ item.value['vault_path'] }}.hcl" |
297 | 332 | loop: "{{ clusters_info | dict2items }}" |
298 | 333 | when: |
| 334 | + - have_managed_clusters |
299 | 335 | - item.value['esoToken'] is defined |
300 | 336 | - item.key != "local-cluster" |
301 | 337 | loop_control: |
|
308 | 344 | command: "vault policy write {{ item.value['vault_path'] }}-secret /tmp/policy-{{ item.value['vault_path'] }}.hcl" |
309 | 345 | loop: "{{ clusters_info | dict2items }}" |
310 | 346 | when: |
| 347 | + - have_managed_clusters |
311 | 348 | - item.value['esoToken'] is defined |
312 | 349 | - item.key != "local-cluster" |
313 | 350 | loop_control: |
|
324 | 361 | policies="default,{{ vault_global_policy }}-secret,{{ vault_pushsecrets_policy }}-secret,{{ item.value['vault_path'] }}-secret" ttl="{{ vault_spoke_ttl }}" |
325 | 362 | loop: "{{ clusters_info | dict2items }}" |
326 | 363 | when: |
| 364 | + - have_managed_clusters |
327 | 365 | - item.value['esoToken'] is defined |
328 | 366 | - item.key != "local-cluster" |
329 | 367 | loop_control: |
|
0 commit comments