Files
hcornet 442b018f5d
Terraform - plan / plan (push) Failing after 16s
Renommer le repertoire cles en key
2026-09-14 12:33:39 +02:00

4.6 KiB

CI/CD — dépôt centreon-terraform

La chaîne s'arrête à la création du serveur. Ansible n'est pas déclenché par la CI : il est joué depuis Semaphore, indépendamment.

Répartition

Étape Outil Déclencheur
fmt, validate, plan Gitea Actions pull request et push sur main
apply Gitea Actions lancement manuel, action=apply
destroy Gitea Actions lancement manuel, confirmation littérale DETRUIRE
Installation Centreon Semaphore manuel, après la fin de cloud-init

Préalables

1. OpenBao

Une clé est à ajouter au secret existant secret/proxmox : le dépôt du snippet cloud-init passe par SSH, le mot de passe du nœud est donc nécessaire.

bao kv patch secret/proxmox ssh_password='<mot de passe root du nœud pve>'

Le secret doit finir par contenir : api_url, api_token, node_name, ssh_password. L'adresse du nœud est déduite de api_url, il n'y a rien d'autre à saisir.

Politique et AppRole dédiés au projet, en lecture seule sur les deux secrets utiles :

bao policy write centreon-lab - <<'POLICY'
path "secret/data/proxmox"     { capabilities = ["read"] }
path "secret/metadata/proxmox" { capabilities = ["read"] }
path "secret/data/aws"         { capabilities = ["read"] }
path "secret/metadata/aws"     { capabilities = ["read"] }
POLICY

bao write auth/approle/role/centreon-lab \
    token_policies=centreon-lab token_ttl=1h token_max_ttl=4h

bao read  auth/approle/role/centreon-lab/role-id
bao write -f auth/approle/role/centreon-lab/secret-id

Le mot de passe admin de Centreon n'apparaît pas ici : il sert à Ansible, pas à Terraform. Le stocker à part, par exemple secret/centreon-lab avec la clé centreon_admin_password, et le récupérer côté Semaphore.

2. Secrets et variables Gitea

Gitea ne détient que de quoi ouvrir OpenBao.

Secrets du dépôt (Paramètres → Actions → Secrets) :

Nom Valeur
OPENBAO_ROLE_ID sortie de role-id
OPENBAO_SECRET_ID sortie de secret-id

Variables du dépôt (Paramètres → Actions → Variables) :

Nom Exemple
OPENBAO_ADDR https://openbao.tips-of-mine.com
TF_BACKEND_BUCKET nom du bucket S3 déjà utilisé par lab-ad
TF_BACKEND_KEY centreon-lab/terraform.tfstate
TF_BACKEND_REGION région du bucket
TF_VERSION facultatif, 1.9.8 par défaut

TF_BACKEND_KEY doit être différente de celle de lab-ad, sans quoi les deux projets se partageraient le même état.

3. Bit d'exécution du script

Le piège déjà rencontré sur proxmox-create-vm : le transfert depuis Windows perd le bit d'exécution, et le job échoue sur un « Permission denied ».

git update-index --chmod=+x scripts/openbao-env.sh
git commit -m "Rendre openbao-env.sh executable"

Le fichier .gitattributes livré fige les fins de ligne en LF, pour la même raison.

4. Clé publique

Chaque fichier vms/<nom>.tfvars est versionné et référence les clés publiques : vérifier le ssh-ed25519 AAAA... d'exemple avant le premier apply. Sans quoi la VM sera créée avec une clé inutilisable et il faudra la recréer — cloud-init ne rejoue rien.

Fonctionnement des workflows

scripts/openbao-env.sh s'authentifie en AppRole, lit les deux secrets et pousse dans l'environnement du job : TF_VAR_pve_endpoint, TF_VAR_pve_api_token, TF_VAR_pve_node, TF_VAR_pve_node_address, TF_VAR_pve_ssh_password, AWS_ACCESS_KEY_ID et AWS_SECRET_ACCESS_KEY. Chaque valeur sensible est passée en ::add-mask:: avant d'être exportée : elle apparaît en *** si un outil l'affiche.

Le script s'arrête avec un message explicite quand une clé manque dans OpenBao, plutôt que de laisser Terraform échouer sur une authentification vide.

deploy.yml calcule toujours un plan, et ne l'applique que si action=apply — c'est le plan enregistré qui est appliqué, pas un second calcul. À la fin, l'inventaire Ansible est publié en artefact (inventaire-ansible), utile surtout comme trace : l'adresse étant fixe, Semaphore peut se contenter d'un inventaire statique.

Côté Semaphore

La configuration Semaphore est décrite dans le dépôt qu'elle concerne : ansible/CICD.md.

Enchaînement d'un test complet

  1. deploy.yml avec action=apply — environ 3 minutes.
  2. Attendre la fin de cloud-init : ssh [email protected] 'cloud-init status --wait'.
  3. Lancer le modèle Semaphore site.yml — 10 à 20 minutes.
  4. Déposer les exports d'Enclume, relancer le modèle --tags clapi.
  5. Pour repartir propre : destroy.yml avec la confirmation DETRUIRE, puis reprendre à l'étape 1.