Architecture CI/CD Multi-Environnements
Vue d'ensemble
ProbatioVault utilise une architecture Option C : Un runner par environnement pour garantir l'isolation complète entre les environnements DEV, TEST et PROD.
┌─────────────────────────────────────────────────────────────────────────────┐
│ GitLab CI/CD │
│ │
│ Branche DEV Branche TEST Branche MAIN │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ terraform: │ │ terraform: │ │ terraform: │ │
│ │ plan:dev │ │ plan:test │ │ plan:prod │ │
│ │ apply:dev │ │ apply:test │ │ apply:prod │ │
│ │ ansible: │ │ ansible: │ │ ansible: │ │
│ │ check:dev │ │ check:test │ │ check:prod │ │
│ │ deploy:dev │ │ deploy:test │ │ deploy:prod │ │
│ │ keycloak:dev│ │ keycloak: │ │ keycloak: │ │
│ └──────┬───────┘ │ test │ │ prod │ │
│ │ └──────┬───────┘ └──────┬───────┘ │
└─────────│───────────────────────│───────────────────────│───────────────────┘
│ │ │
│ ovh-shell-dev │ ovh-shell-test │ ovh-shell-prod
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ VPS DEV │ │ VPS TEST │ │ VPS PROD │
│ │ │ │ │ │
│ GitLab Runner │ │ GitLab Runner │ │ GitLab Runner │
│ HashiCorp Vault │ │ HashiCorp Vault │ │ HashiCorp Vault │
│ Application │ │ Application │ │ Application │
└─────────────────┘ └─────────────────┘ └─────────────────┘
Environnements
| Environnement | Branche Git | Runner Tag | Vault URL | VPS |
| DEV | dev | ovh-shell-dev | vault.dev.probatiovault.com | 51.68.126.160 |
| TEST | test | ovh-shell-test | vault.test.probatiovault.com | (à créer) |
| PROD | main | ovh-shell-prod | vault.probatiovault.com | (à créer) |
Jobs CI/CD par environnement
| Job | Environnement | Déclenchement | Action |
terraform:plan:dev | DEV | Auto (branche dev) | Plan infrastructure |
terraform:apply:dev | DEV | Manuel | Applique les changements |
terraform:plan:test | TEST | Auto (branche test) | Plan infrastructure |
terraform:apply:test | TEST | Manuel | Applique les changements |
terraform:plan:prod | PROD | Auto (branche main) | Plan infrastructure |
terraform:apply:prod | PROD | Manuel | Applique les changements |
Stage Ansible
| Job | Environnement | Déclenchement | Action |
ansible:check:dev | DEV | Auto | Dry-run (--check) |
ansible:deploy:dev | DEV | Manuel | Déploiement complet |
ansible:keycloak:dev | DEV | Manuel | Déploiement Keycloak uniquement |
ansible:check:test | TEST | Auto | Dry-run (--check) |
ansible:deploy:test | TEST | Manuel | Déploiement complet |
ansible:keycloak:test | TEST | Manuel | Déploiement Keycloak uniquement |
ansible:check:prod | PROD | Auto | Dry-run (--check) |
ansible:deploy:prod | PROD | Manuel | Déploiement complet |
ansible:keycloak:prod | PROD | Manuel | Déploiement Keycloak uniquement |
Gestion des secrets
Architecture
Chaque environnement dispose de son propre HashiCorp Vault. Les runners GitLab accèdent à leur Vault local via le token stocké dans /root/.vault-token.
┌─────────────────────────────────────────────────────────────┐
│ VPS (par environnement) │
│ │
│ ┌─────────────────┐ ┌─────────────────────────────┐ │
│ │ GitLab Runner │ │ HashiCorp Vault Server │ │
│ │ │───▶│ │ │
│ │ Exécute jobs │ │ Secrets: │ │
│ │ Terraform/ │ │ - kv/app/aws-storage │ │
│ │ Ansible │ │ - kv/ovh/api-credentials │ │
│ └─────────────────┘ │ - kv/ansible/vault │ │
│ │ └─────────────────────────────┘ │
│ │ ▲ │
│ │ /root/.vault-token │ │
│ └─────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Secrets requis dans Vault
| Chemin | Clés | Usage |
kv/app/aws-storage | access_key_id, secret_access_key, region | Terraform AWS (S3/Glacier) |
kv/ovh/api-credentials | application_key, application_secret, consumer_key, endpoint | Terraform OVH (DNS) |
kv/ansible/vault | password | Ansible Vault password |
Initialisation des secrets
# Sur chaque VPS, après installation de Vault
export VAULT_ADDR="https://vault.{env}.probatiovault.com"
export VAULT_TOKEN="$(cat /root/.vault-token)"
# AWS credentials
vault kv put kv/app/aws-storage \
access_key_id="AKIA..." \
secret_access_key="..." \
region="eu-west-3"
# OVH credentials
vault kv put kv/ovh/api-credentials \
application_key="..." \
application_secret="..." \
consumer_key="..." \
endpoint="ovh-eu"
# Ansible Vault password
vault kv put kv/ansible/vault \
password="..."
Configuration des runners
Shell Runners (pour Terraform, Ansible) :
| Tag | VPS | Usage |
ovh-shell-dev | DEV | Jobs Terraform/Ansible DEV |
ovh-shell-test | TEST | Jobs Terraform/Ansible TEST |
ovh-shell-prod | PROD | Jobs Terraform/Ansible PROD |
Docker Runners (pour builds, SonarQube) :
| Tag | VPS | Usage |
ovh-docker-dev | DEV | Jobs Docker DEV (SonarQube, builds) |
ovh-docker-test | TEST | Jobs Docker TEST |
ovh-docker-prod | PROD | Jobs Docker PROD |
Runners spéciaux :
| Tag | VPS | Usage |
ovh-internet | Dédié | Tests réseau externes (hors VPS principal) |
Enregistrement d'un nouveau runner
# 1. Installer gitlab-runner sur le VPS
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt-get install gitlab-runner
# 2. Enregistrer le runner avec le bon tag
sudo gitlab-runner register \
--url https://gitlab.com/ \
--token glrt-... \
--executor shell \
--tag-list "ovh-shell-{env}" \
--description "ProbatioVault {ENV} Runner"
# 3. Configurer les permissions
sudo usermod -aG docker gitlab-runner
sudo usermod -aG sudo gitlab-runner
Flux de déploiement
Déploiement standard
1. Push sur branche dev/test/main
│
▼
2. terraform:plan:{env} (automatique)
- Récupère credentials depuis Vault
- Génère le plan Terraform
│
▼
3. terraform:apply:{env} (manuel)
- Applique les changements infrastructure
│
▼
4. ansible:check:{env} (automatique)
- Dry-run de la configuration
│
▼
5. ansible:deploy:{env} (manuel)
- Applique la configuration Ansible
Déploiement Keycloak uniquement
# Via GitLab UI ou API
# Déclencher manuellement ansible:keycloak:{env}
Fichiers de configuration
| Fichier | Environnement | Contenu |
terraform/environments/dev.tfvars | DEV | Configuration VPS dev (tracké) |
terraform/environments/test.tfvars | TEST | Configuration VPS test (tracké) |
terraform/environments/prod.tfvars | PROD | Configuration VPS prod (gitignored) |
Ansible
| Fichier | Environnement | Contenu |
ansible/inventory/dev/hosts.ini | DEV | Inventaire hosts dev |
ansible/inventory/test/hosts.ini | TEST | Inventaire hosts test |
ansible/inventory/prod/hosts.ini | PROD | Inventaire hosts prod |
Sécurité
Isolation des environnements
- Réseau : Chaque VPS est isolé sur son propre réseau
- Secrets : Chaque Vault contient uniquement les secrets de son environnement
- Runners : Les runners ne peuvent accéder qu'à leur VPS local
- Branches protégées :
main et test sont des branches protégées
Accès aux jobs manuels
| Job | Qui peut déclencher |
terraform:apply:dev | Développeurs |
terraform:apply:test | Développeurs, QA |
terraform:apply:prod | Ops, Admin |
ansible:deploy:prod | Ops, Admin |
Troubleshooting
Le runner ne trouve pas Vault
# Vérifier le token Vault
sudo cat /root/.vault-token
# Vérifier la connexion Vault
export VAULT_ADDR="https://vault.{env}.probatiovault.com"
export VAULT_TOKEN="$(sudo cat /root/.vault-token)"
vault status
Credentials manquants
# Lister les secrets disponibles
vault kv list kv/
# Vérifier un secret spécifique
vault kv get kv/app/aws-storage
vault kv get kv/ovh/api-credentials
Job bloqué "pending"
# Vérifier que le runner avec le bon tag est actif
# GitLab > Settings > CI/CD > Runners
# Vérifier le statut du runner sur le VPS
sudo gitlab-runner status
sudo gitlab-runner verify
Références