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
deploy.ymlavecaction=apply— environ 3 minutes.- Attendre la fin de cloud-init :
ssh [email protected] 'cloud-init status --wait'. - Lancer le modèle Semaphore
site.yml— 10 à 20 minutes. - Déposer les exports d'Enclume, relancer le modèle
--tags clapi. - Pour repartir propre :
destroy.ymlavec la confirmationDETRUIRE, puis reprendre à l'étape 1.