`idm-01` a prouve le routage inter-zone dans le VRF (10.27.19.21 -> 10.27.17.11, deux passerelles anycast) et leve trois defauts qu'aucun devis ne pouvait montrer : 1. Le handler de `client_pki` rechargeait `slapd` avant son installation — consequence directe de l'ordre retabli. Un consommateur absent n'est pas une erreur ; un vrai echec de rechargement reste fatal. 2. `resoudre_base` ne trouvait aucune base de portee `application` : Keycloak declare `consommateur: keycloak`, le role cherchait `serveur_keycloak`. Le lien est declare dans applications.yml — on le suit au lieu de retirer un prefixe a la main. 3. Keycloak attend PostgreSQL, pas encore deploye. Pas un defaut : `deployer` ne connait que l'ordre intra-hote, l'ordre inter-hotes est celui de `site`. Et deux attentes, sans lesquelles on ne peut pas enchainer creation et deploiement — donc sans lesquelles `myDay` ne reconstruit pas seul : SSH, puis cloud-init et les maj automatiques. `creer-vm` rend desormais une VM PRETE. `lock_timeout: 300` sur chaque tache apt complete l'attente : le verrou peut etre repris ENTRE deux taches, ce qu'une verification en amont ne previent pas. Defaut dans l'attente elle-meme : `unattended-upgrades` est un demon, toujours actif — l'inclure rendait la condition impossible a satisfaire. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
66 lines
3.4 KiB
YAML
66 lines
3.4 KiB
YAML
---
|
|
# Rôle utilitaire (pas un groupe déployable) : résout l'entrée de base d'un
|
|
# consommateur depuis le registre partagé plan/bases-donnees.yml.
|
|
#
|
|
# Entrée : resoudre_base_groupe — le groupe consommateur (ex. serveur_keycloak).
|
|
# Sorties (facts) :
|
|
# resoudre_base_entree — l'entrée du registre {base, proprietaire, secret, serveur, ...}
|
|
# resoudre_base_db_password — mot de passe déréférencé depuis la voûte (no_log)
|
|
# resoudre_base_db_host — hôte du serveur de base
|
|
# resoudre_base_db_port — port du serveur de base (défaut 5432)
|
|
#
|
|
# Le secret ne quitte jamais le rôle consommateur (déréférencé par lookup('vars', ...)).
|
|
- name: Charger le registre des bases applicatives
|
|
ansible.builtin.include_vars:
|
|
file: "{{ setops_plan_dir }}/bases-donnees.yml"
|
|
|
|
# Le `consommateur` d'une base n'est PAS toujours un groupe : le validateur du registre
|
|
# (inventory_rules.py) accepte deux portées — `groupe` désigne un groupe opérationnel,
|
|
# `application` désigne une APPLICATION de plan/applications.yml. Chercher uniquement le
|
|
# nom du groupe faisait donc échouer toute base de portée `application` : Keycloak
|
|
# déclare `consommateur: keycloak`, le rôle demandait `serveur_keycloak`.
|
|
#
|
|
# Le lien entre les deux est DÉCLARÉ — chaque application nomme son `groupe`. On le suit
|
|
# plutôt que de retirer un préfixe à la main : une convention de nommage se contredit un
|
|
# jour, une déclaration se corrige.
|
|
- name: Charger le registre des applications (lien application → groupe)
|
|
ansible.builtin.include_vars:
|
|
file: "{{ setops_plan_dir }}/applications.yml"
|
|
|
|
- name: Établir les noms sous lesquels ce groupe peut être consommateur
|
|
ansible.builtin.set_fact:
|
|
resoudre_base_noms: >-
|
|
{{ [resoudre_base_groupe] + ((applications | default({})) | dict2items
|
|
| selectattr('value.groupe', 'defined')
|
|
| selectattr('value.groupe', 'equalto', resoudre_base_groupe)
|
|
| map(attribute='key') | list) }}
|
|
|
|
- name: Résoudre l'entrée de base (par consommateur, groupe ou application)
|
|
ansible.builtin.set_fact:
|
|
resoudre_base_entree: >-
|
|
{{ ((bases_donnees | default({})) | dict2items
|
|
| selectattr('value.consommateur', 'defined')
|
|
| selectattr('value.consommateur', 'in', resoudre_base_noms)
|
|
| map(attribute='value') | list | first) | default({}) }}
|
|
|
|
- name: Exiger une entrée de registre et son secret
|
|
ansible.builtin.assert:
|
|
that:
|
|
- resoudre_base_entree.base is defined
|
|
- resoudre_base_entree.proprietaire is defined
|
|
- resoudre_base_entree.secret is defined
|
|
fail_msg: >-
|
|
Aucune base dont le `consommateur` soit l'un de {{ resoudre_base_noms }}
|
|
dans instance/plan/bases-donnees.yml (portée `groupe` ou `application`).
|
|
|
|
- name: Résoudre le mot de passe de base (Vault)
|
|
ansible.builtin.set_fact:
|
|
resoudre_base_db_password: "{{ lookup('vars', resoudre_base_entree.secret) }}"
|
|
no_log: true
|
|
|
|
- name: Résoudre l'hôte (FQDN) et le port du serveur de base (registre)
|
|
ansible.builtin.set_fact:
|
|
# FQDN (pas le nom court) : non ambigu en fédération (data-sql-01 existe chez
|
|
# plusieurs tenants) + nom canonique pour la vérif TLS. Résolu par le plancher /etc/hosts.
|
|
resoudre_base_db_host: "{{ (serveurs_bd | default({}))[resoudre_base_entree.serveur].hote }}.{{ domaine_interne }}"
|
|
resoudre_base_db_port: "{{ (serveurs_bd | default({}))[resoudre_base_entree.serveur].port | default(5432) }}"
|