infra: déploiement Ansible et sa validation CI #61

Merged
lenaic merged 13 commits from gabriel/41-ansible-squelette into develop 2026-09-02 14:18:25 +00:00
Member

Ce que ça change

Rend le serveur reconstructible depuis le dépôt via Ansible, pour l'épreuve EC04. La PR est menée jusqu'à la fermeture complète du #41 (les quatre critères), l'implémentation arrive par lots.

Closes #41

Lots

Lot 1 — provisionnement système (fait)

  • Rôles base (paquets, mises à jour de sécurité, pare-feu UFW), deploy_user (compte dédié, clés nominatives, sudo), ssh_hardening (coupe root et le mot de passe SSH), docker (moteur + plugin compose, rotation des journaux).
  • bootstrap.yml : amorçage d'une cible neuve en root, joué une fois ; site.yml prend le relais par deploy et ferme root ensuite.
  • group_vars/all/ scindé : vars.yml (non sensible) + vault.yml.example ; le vault.yml chiffré est ignoré par Git.
  • CI : outillage épinglé (requirements-ci.txt), yamllint ajouté, ansible-lint rendu bloquant.

Lot 2 — piles applicatives et sauvegarde (fait, après merge de #81 sur develop)

  • Rôle app : clone le dépôt dans /opt/enervision/.repo, rend /etc/enervision/{postgres,minio}.env depuis le coffre (0640 root:deploy, no_log), produit le certificat TLS de PostgreSQL sur la machine, lance chaque pile de app_stacks (postgres avec build, minio) par docker_compose_v2 en attendant healthy.
  • Rôle backup : pose pg-backup.sh et verifier-sauvegardes.sh depuis le dépôt vers /usr/local/bin (source unique, critère du #64), /var/backups/postgresql + /etc/cron.d/pg-backup à 2 h 30, premier vidage joué à la main.
  • restore.yml complet : contrôle de lisibilité, filet, coupe des connexions, pg_restore --clean par base via docker exec, vérification que le serveur répond ; chronomètre par profile_tasks.

Lot 3 — les preuves (en cours)

  • Coffre vault.yml rempli : clé deploy machine + une clé personnelle par membre de l'équipe (lenaic, marvin, gabriel, florian, olivier, justine), 5 mots de passe PostgreSQL, identifiants MinIO.
  • bootstrap.yml + site.yml joués pour de vrai, jusqu'au bout, zéro échec — mais sur serveur-salle, pas sur une cible vierge du groupe neuf (aucune machine jetable disponible ; décision assumée de prouver la reconstructibilité sur le serveur partagé plutôt que d'attendre une VM). Le critère « machine vierge » du #41 reste donc non prouvé au sens strict — à rouvrir si une cible neuve devient disponible.
  • restore.yml joué une fois pour de vrai et chronométré → toujours à faire, reprise.md pas encore rempli.

Bugs trouvés en déployant pour de vrai (jamais exercé avant ce run)

  • ansible.cfg : callback community.general.yaml cassé sous Python 3.14 → basculé sur result_format=yaml (remplacement officiel, déprécié depuis ansible-core 2.13).
  • Rôle app : écrivait la clé de déploiement dans /opt/enervision/.ssh/id_deploy sans jamais créer .ssh → ajout de la tâche manquante.
  • Rôle docker : le DNS du campus ENI détourne download.docker.com vers une IP interne qui refuse la connexion — dépôt officiel Docker injoignable sur ce réseau. Basculé sur docker.io + docker-compose-v2 (dépôt Ubuntu, à jour dans noble-updates, fournit bien docker compose).
  • serveur-salle a un GPU Tesla T4 avec le toolkit nvidia déjà en place à la main et default-runtime: nvidia, dont dépendent implicitement tous les conteneurs qui y tournent (runners CI Forgejo compris). Le template daemon.json l'écrasait silencieusement → préservé via docker_nvidia_runtime, activé en host_vars sur cette cible.
  • infra/compose/minio/init-buckets.sh (#85, sur develop) : grep absent de l'image quay.io/minio/mc (ubi9-micro) → les trois vérifications (versioning, rétention, purge) échouaient systématiquement. Corrigé et mergé séparément dans #90.

Conséquence opérationnelle du durcissement SSH, à diffuser à l'équipe

ssh_hardening restreint SSH à AllowUsers deploy : les comptes personnels (lenaic, marvin, gabriel, florian, olivier, justine) qui existaient sur serveur-salle sont désormais coupés, root aussi. Vérifié en conditions réelles après rechargement de sshd. Toute l'équipe doit désormais passer par ssh deploy@10.105.200.41 avec sa propre clé (déjà posée dans le coffre). Le vault.yml local mis à jour avec ces 7 clés doit être repartagé à l'équipe par le canal hors dépôt habituel.

Hors périmètre du #41, à ouvrir en tickets

  • Copie des sauvegardes hors machine (docs/POSTGRESQL.md écart, reprise.md) : les vidages sont sur le disque de la machine. La reprise sur machine neuve suppose pour l'instant une copie manuelle préalable de /var/backups/postgresql/. Cible de secours + décision à trancher.
  • Alerte sur échec de sauvegarde (POSTGRESQL.md écart n°4) : attend Prometheus.
  • MLflow n'est pas géré par le rôle app : tourne sur serveur-salle via un compose déployé à la main (/opt/enervision/mlflow/), aucun équivalent tracké dans infra/compose/. Reste un geste manuel non documenté au sens strict du critère #3 — à couvrir dans un ticket dédié si on veut fermer complètement ce point.

Décisions à valider en relecture

  • deploy a un sudo NOPASSWD: ALL (roles/deploy_user/defaults/main.yml), pas le « restreint à Docker » du squelette : Ansible provisionne toute la machine. Imputabilité par clés nominatives + journal sudo ; root n'a plus ni mot de passe ni login SSH.
  • Le rôle base arme UFW. Garde-fou et -e base_ufw_enabled=false documentés dans deploiement.md.
  • Le coffre ansible-vault devient le magasin de secrets partagé (réponse de fait à l'écart n°3 de POSTGRESQL.md) : app rend les .env depuis lui. genere-identifiants.sh sert encore à générer les valeurs, qu'on dépose ensuite dans le coffre.
  • Dépôt Docker : paquets Ubuntu au lieu du dépôt officiel (voir « Bugs trouvés » ci-dessus) — à confirmer que c'est acceptable durablement, pas juste un contournement du DNS campus.

Relecture précédente (Lénaïc, 2 sept.)

  • repo_version: maindevelop
  • commentaire docker_default_network_mode obsolète → variable retirée, le mode réseau se décide pile par pile (ADR 0001) ✓
  • Closes #41 gardé — la PR va jusqu'au bout des quatre critères.

Ce qui suit le code

  • docs/runbooks/deploiement.md et reprise.md mis à jour et indexés dans docs/runbooks/README.md

🤖 Generated with Claude Code

https://claude.ai/code/session_01NbkbdXUvBFnQ5KuHan9y3J

## Ce que ça change Rend le serveur reconstructible depuis le dépôt via Ansible, pour l'épreuve EC04. La PR est menée jusqu'à la fermeture complète du #41 (les quatre critères), l'implémentation arrive par lots. `Closes #41` ## Lots **Lot 1 — provisionnement système (fait)** - Rôles `base` (paquets, mises à jour de sécurité, pare-feu UFW), `deploy_user` (compte dédié, clés nominatives, sudo), `ssh_hardening` (coupe root et le mot de passe SSH), `docker` (moteur + plugin compose, rotation des journaux). - `bootstrap.yml` : amorçage d'une cible neuve en root, joué une fois ; `site.yml` prend le relais par `deploy` et ferme root ensuite. - `group_vars/all/` scindé : `vars.yml` (non sensible) + `vault.yml.example` ; le `vault.yml` chiffré est ignoré par Git. - CI : outillage épinglé (`requirements-ci.txt`), `yamllint` ajouté, `ansible-lint` rendu bloquant. **Lot 2 — piles applicatives et sauvegarde (fait, après merge de #81 sur develop)** - Rôle `app` : clone le dépôt dans `/opt/enervision/.repo`, rend `/etc/enervision/{postgres,minio}.env` depuis le coffre (`0640 root:deploy`, `no_log`), produit le certificat TLS de PostgreSQL sur la machine, lance chaque pile de `app_stacks` (`postgres` avec `build`, `minio`) par `docker_compose_v2` en attendant `healthy`. - Rôle `backup` : pose `pg-backup.sh` et `verifier-sauvegardes.sh` depuis le dépôt vers `/usr/local/bin` (source unique, critère du #64), `/var/backups/postgresql` + `/etc/cron.d/pg-backup` à 2 h 30, premier vidage joué à la main. - `restore.yml` complet : contrôle de lisibilité, filet, coupe des connexions, `pg_restore --clean` par base via `docker exec`, vérification que le serveur répond ; chronomètre par `profile_tasks`. **Lot 3 — les preuves (en cours)** - [x] Coffre `vault.yml` rempli : clé `deploy` machine + une clé personnelle par membre de l'équipe (lenaic, marvin, gabriel, florian, olivier, justine), 5 mots de passe PostgreSQL, identifiants MinIO. - [x] `bootstrap.yml` + `site.yml` joués **pour de vrai**, jusqu'au bout, zéro échec — mais **sur `serveur-salle`, pas sur une cible vierge du groupe `neuf`** (aucune machine jetable disponible ; décision assumée de prouver la reconstructibilité sur le serveur partagé plutôt que d'attendre une VM). Le critère « machine vierge » du #41 reste donc **non prouvé au sens strict** — à rouvrir si une cible neuve devient disponible. - [ ] `restore.yml` joué une fois pour de vrai et chronométré → toujours à faire, `reprise.md` pas encore rempli. ## Bugs trouvés en déployant pour de vrai (jamais exercé avant ce run) - `ansible.cfg` : callback `community.general.yaml` cassé sous Python 3.14 → basculé sur `result_format=yaml` (remplacement officiel, déprécié depuis ansible-core 2.13). - Rôle `app` : écrivait la clé de déploiement dans `/opt/enervision/.ssh/id_deploy` sans jamais créer `.ssh` → ajout de la tâche manquante. - Rôle `docker` : le DNS du campus ENI détourne `download.docker.com` vers une IP interne qui refuse la connexion — dépôt officiel Docker injoignable sur ce réseau. Basculé sur `docker.io` + `docker-compose-v2` (dépôt Ubuntu, à jour dans `noble-updates`, fournit bien `docker compose`). - `serveur-salle` a un **GPU Tesla T4** avec le toolkit nvidia déjà en place à la main et `default-runtime: nvidia`, dont dépendent implicitement tous les conteneurs qui y tournent (runners CI Forgejo compris). Le template `daemon.json` l'écrasait silencieusement → préservé via `docker_nvidia_runtime`, activé en `host_vars` sur cette cible. - `infra/compose/minio/init-buckets.sh` (#85, sur `develop`) : `grep` absent de l'image `quay.io/minio/mc` (`ubi9-micro`) → les trois vérifications (versioning, rétention, purge) échouaient systématiquement. Corrigé et mergé séparément dans #90. ## Conséquence opérationnelle du durcissement SSH, à diffuser à l'équipe `ssh_hardening` restreint SSH à `AllowUsers deploy` : les comptes personnels (`lenaic`, `marvin`, `gabriel`, `florian`, `olivier`, `justine`) qui existaient sur `serveur-salle` sont désormais coupés, root aussi. Vérifié en conditions réelles après rechargement de sshd. Toute l'équipe doit désormais passer par `ssh deploy@10.105.200.41` avec sa propre clé (déjà posée dans le coffre). Le `vault.yml` local mis à jour avec ces 7 clés doit être repartagé à l'équipe par le canal hors dépôt habituel. ## Hors périmètre du #41, à ouvrir en tickets - **Copie des sauvegardes hors machine** (`docs/POSTGRESQL.md` écart, `reprise.md`) : les vidages sont sur le disque de la machine. La reprise sur machine neuve suppose pour l'instant une copie manuelle préalable de `/var/backups/postgresql/`. Cible de secours + décision à trancher. - **Alerte sur échec de sauvegarde** (`POSTGRESQL.md` écart n°4) : attend Prometheus. - **MLflow n'est pas géré par le rôle `app`** : tourne sur `serveur-salle` via un compose déployé à la main (`/opt/enervision/mlflow/`), aucun équivalent tracké dans `infra/compose/`. Reste un geste manuel non documenté au sens strict du critère #3 — à couvrir dans un ticket dédié si on veut fermer complètement ce point. ## Décisions à valider en relecture - `deploy` a un **sudo `NOPASSWD: ALL`** (`roles/deploy_user/defaults/main.yml`), pas le « restreint à Docker » du squelette : Ansible provisionne toute la machine. Imputabilité par clés nominatives + journal sudo ; root n'a plus ni mot de passe ni login SSH. - Le rôle `base` **arme UFW**. Garde-fou et `-e base_ufw_enabled=false` documentés dans `deploiement.md`. - Le **coffre `ansible-vault` devient le magasin de secrets partagé** (réponse de fait à l'écart n°3 de `POSTGRESQL.md`) : `app` rend les `.env` depuis lui. `genere-identifiants.sh` sert encore à *générer* les valeurs, qu'on dépose ensuite dans le coffre. - Dépôt Docker : paquets Ubuntu au lieu du dépôt officiel (voir « Bugs trouvés » ci-dessus) — à confirmer que c'est acceptable durablement, pas juste un contournement du DNS campus. ## Relecture précédente (Lénaïc, 2 sept.) - `repo_version: main` → **`develop`** ✓ - commentaire `docker_default_network_mode` obsolète → variable **retirée**, le mode réseau se décide pile par pile (ADR 0001) ✓ - `Closes #41` **gardé** — la PR va jusqu'au bout des quatre critères. ## Ce qui suit le code - [x] `docs/runbooks/deploiement.md` et `reprise.md` mis à jour et **indexés** dans `docs/runbooks/README.md` 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01NbkbdXUvBFnQ5KuHan9y3J
infra: squelette du déploiement Ansible et sa validation CI
Some checks failed
Intégration / Qualité du code Python (pull_request) Successful in 3s
Intégration / Tests unitaires (pull_request) Successful in 3s
Intégration / Aucun secret commité (pull_request) Successful in 2s
Infra Ansible / Playbooks Ansible valides (pull_request) Failing after 3s
a1d86bff82
Arborescence et points d'entrée d'infra/ansible/ (site.yml, restore.yml,
rôles vides base/deploy_user/docker/app/backup), runbooks déploiement et
reprise, et un workflow Forgejo qui se borne à valider la syntaxe des
playbooks. Le déploiement reste manuel ; les rôles et la chaîne de
déploiement viennent dans les tickets suivants.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HKrHL534hkFX6vo2HZppdE
ci: fixe l'image du job de validation Ansible (pip absent du label docker)
All checks were successful
Intégration / Qualité du code Python (pull_request) Successful in 3s
Intégration / Tests unitaires (pull_request) Successful in 3s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 41s
ffed26d776
Le job « verifier-playbooks » tournait sur l'image par défaut du label
« docker », sans pip : « pip: command not found », le même échec que la
PR #57. On applique la convention de ci.yml (ticket #40) : image Python
épinglée par empreinte, et node + git installés avant actions/checkout.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HKrHL534hkFX6vo2HZppdE
gabriel self-assigned this 2026-09-02 08:37:00 +00:00
gabriel added this to the EnerVision project 2026-09-02 08:37:02 +00:00
gabriel changed title from infra: squelette du déploiement Ansible et sa validation CI to WIP: infra: squelette du déploiement Ansible et sa validation CI 2026-09-02 08:39:59 +00:00
gabriel 2026-09-02 08:39:59 +00:00
Merge develop
All checks were successful
Intégration / Qualité du code Python (pull_request) Successful in 12s
Intégration / Tests unitaires et couverture (pull_request) Successful in 14s
Intégration / Dépendances du tableau de bord (pull_request) Successful in 3s
Intégration / Images épinglées par version (pull_request) Successful in 3s
Intégration / Aucun secret commité (pull_request) Successful in 2s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 47s
Intégration / Dépendances Python et inventaire applicatif (pull_request) Successful in 3m33s
5fbe648eda
lenaic left a comment

Le squelette est bien posé : les cinq rôles dans l'ordre où ils doivent tourner, become = False par défaut avec l'élévation demandée tâche par tâche, host_key_checking actif, et un contrôle de syntaxe dans la chaîne dès maintenant. Les deux manuels sont écrits avant l'implémentation, ce qui est le bon sens.

Un point sur la fermeture. La description porte Closes #41, or les critères du ticket demandent un playbook qui reconstruit le serveur sur une machine vierge, un compte deploy, aucun geste manuel non documenté et une restauration chronométrée. Un squelette dont les rôles affichent un message ne les tient pas. Si cette demande ferme le ticket, il ne reste rien pour suivre l'implémentation.

Deux options : retirer le Closes #41 et garder le ticket ouvert, ou le fermer et ouvrir un ticket par rôle. Je prendrais la première, le ticket est déjà découpé.

Le squelette est bien posé : les cinq rôles dans l'ordre où ils doivent tourner, `become = False` par défaut avec l'élévation demandée tâche par tâche, `host_key_checking` actif, et un contrôle de syntaxe dans la chaîne dès maintenant. Les deux manuels sont écrits avant l'implémentation, ce qui est le bon sens. Un point sur la fermeture. La description porte `Closes #41`, or les critères du ticket demandent un playbook qui reconstruit le serveur sur une machine vierge, un compte `deploy`, aucun geste manuel non documenté et une restauration chronométrée. Un squelette dont les rôles affichent un message ne les tient pas. Si cette demande ferme le ticket, il ne reste rien pour suivre l'implémentation. Deux options : retirer le `Closes #41` et garder le ticket ouvert, ou le fermer et ouvrir un ticket par rôle. Je prendrais la première, le ticket est déjà découpé.
@ -0,0 +8,4 @@
compose_dir: "{{ app_root }}/infra/compose"
repo_url: "ssh://git@10.105.200.41:2222/g2/enervision.git"
repo_version: main
Owner

repo_version: main déploierait la mauvaise branche. develop est la branche par défaut et porte tout le travail, main a vingt commits de retard et ne contient ni MinIO, ni la chaîne étendue, ni les manuels. Le playbook installerait un état du 1er septembre.

`repo_version: main` déploierait la mauvaise branche. `develop` est la branche par défaut et porte tout le travail, `main` a vingt commits de retard et ne contient ni MinIO, ni la chaîne étendue, ni les manuels. Le playbook installerait un état du 1er septembre.
@ -0,0 +10,4 @@
repo_version: main
# Contournement connu de l'hôte LXC : le réseau bridge de Docker est inopérant.
docker_default_network_mode: host
Owner

Ce commentaire n'est plus vrai. Le formateur a activé l'imbrication le 1er septembre et les réseaux bridge fonctionnent : g2_forge_back et g2_forge_edge existent, et MinIO publie ses ports en bridge.

Le réseau hôte reste peut-être le bon choix, mais pour une autre raison, qu'Olivier a documentée dans sa migration PostgreSQL : un port publié par Docker échappe à ufw, parce que la chaîne DOCKER-USER est évaluée avant celles d'ufw. Une règle ufw deny afficherait « deny » tout en laissant passer. C'est cette raison-là qu'il faut écrire ici.

Ce commentaire n'est plus vrai. Le formateur a activé l'imbrication le 1er septembre et les réseaux bridge fonctionnent : `g2_forge_back` et `g2_forge_edge` existent, et MinIO publie ses ports en bridge. Le réseau hôte reste peut-être le bon choix, mais pour une autre raison, qu'Olivier a documentée dans sa migration PostgreSQL : un port publié par Docker échappe à ufw, parce que la chaîne `DOCKER-USER` est évaluée avant celles d'ufw. Une règle `ufw deny` afficherait « deny » tout en laissant passer. C'est cette raison-là qu'il faut écrire ici.
gabriel changed title from WIP: infra: squelette du déploiement Ansible et sa validation CI to infra: déploiement Ansible et sa validation CI 2026-09-02 09:36:56 +00:00
gabriel removed this from the EnerVision project 2026-09-02 09:42:56 +00:00
infra: écrit les rôles Ansible de provisionnement système (lot 1)
All checks were successful
Intégration / Qualité du code Python (pull_request) Successful in 11s
Intégration / Tests unitaires et couverture (pull_request) Successful in 12s
Intégration / Dépendances du tableau de bord (pull_request) Successful in 3s
Intégration / Images épinglées par version (pull_request) Successful in 2s
Intégration / Aucun secret commité (pull_request) Successful in 2s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m3s
Intégration / Dépendances Python et inventaire applicatif (pull_request) Successful in 3m44s
fe8839be77
Sort les rôles base, deploy_user, ssh_hardening et docker du squelette. Ils
provisionnent une cible Ubuntu 24.04 de zéro : paquets et mises à jour de
sécurité, pare-feu UFW, compte deploy à clés nominatives, coupure de l'accès
root et du mot de passe SSH, moteur Docker et plugin compose. app et backup
restent des squelettes en attente de la pile PostgreSQL-Docker (#80).

- bootstrap.yml : amorçage d'une cible neuve en root (crée deploy), joué une
  fois ; site.yml prend le relais par deploy et ferme root à la passe suivante.
- group_vars/all/ scindé : vars.yml (non sensible) et vault.yml.example ; le
  vault.yml chiffré est ignoré par Git.
- ansible.cfg : profile_tasks (le chronomètre du playbook de restauration) et
  pipelining SSH.
- site.yml : pre_task qui refuse une cible non Ubuntu 24.04, rôle ssh_hardening
  inséré après deploy_user.
- CI : outillage épinglé (requirements-ci.txt), yamllint ajouté, ansible-lint
  rendu bloquant, bootstrap.yml passé au contrôle de syntaxe.
- Relecture de Lénaïc : repo_version corrigé en develop ; docker_default_network_mode
  retiré — le mode réseau se décide pile par pile (ADR 0001), pas en variable d'hôte.

Runbooks deploiement.md et README.md mis à jour et indexés.

Refs #41

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MxpHmd3thib9RErZuMvS3R
infra: écrit les rôles app et backup Ansible (lot 2)
All checks were successful
Intégration / Qualité du code Python (pull_request) Successful in 11s
Intégration / Tests unitaires et couverture (pull_request) Successful in 15s
Intégration / Dépendances Python et inventaire applicatif (pull_request) Successful in 3m30s
Intégration / Dépendances du tableau de bord (pull_request) Successful in 5s
Intégration / Images épinglées par version (pull_request) Successful in 3s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m1s
ddb873e8c6
Sort app et backup du squelette, après l'arrivée de la pile PostgreSQL-Docker
sur develop (#81).

Rôle app :
- clone le dépôt dans /opt/enervision/.repo via une clé de déploiement du coffre
- rend /etc/enervision/{postgres,minio}.env depuis le coffre, 0640 root:deploy,
  no_log — jamais dans le dépôt
- produit le certificat TLS de PostgreSQL sur la machine (uid 999), jamais versionné
- lance chaque pile de app_stacks (postgres avec build, minio) par
  docker_compose_v2, en attendant l'état « healthy »

Rôle backup :
- pose pg-backup.sh et verifier-sauvegardes.sh depuis le dépôt vers
  /usr/local/bin (source unique, critère du #64)
- /var/backups/postgresql en 0750, /etc/cron.d/pg-backup à 2 h 30
- premier vidage joué à la main comme le fait cron
- restent hors périmètre du #41, notés : alerte sur échec (écart n°4) et copie
  hors machine

restore.yml : contrôle de lisibilité, filet, coupe des connexions,
pg_restore --clean par base via docker exec, vérification que le serveur
répond. Chronomètre par profile_tasks.

Runbooks deploiement.md et reprise.md mis à jour ; reprise.md documente la
limite « pas de copie hors machine ».

Refs #41

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MxpHmd3thib9RErZuMvS3R
infra: retire le jeton SAS Azure du modèle de coffre (hors périmètre)
All checks were successful
Intégration / Qualité du code Python (pull_request) Successful in 11s
Intégration / Tests unitaires et couverture (pull_request) Successful in 11s
Intégration / Dépendances du tableau de bord (pull_request) Successful in 4s
Intégration / Images épinglées par version (pull_request) Successful in 3s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Intégration / Dépendances Python et inventaire applicatif (pull_request) Successful in 3m24s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m0s
a627c927b7
La copie des sauvegardes vers Azure n'est pas dans cette PR ; la variable
vault_azure_backup_sas_url faisait croire qu'elle était requise.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MxpHmd3thib9RErZuMvS3R
infra: passe le dépôt Docker à deb822_repository, exclut .venv du lint
All checks were successful
Intégration / Qualité du code Python (pull_request) Successful in 13s
Intégration / Tests unitaires et couverture (pull_request) Successful in 11s
Intégration / Dépendances du tableau de bord (pull_request) Successful in 5s
Intégration / Images épinglées par version (pull_request) Successful in 3s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Intégration / Dépendances Python et inventaire applicatif (pull_request) Successful in 3m32s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m9s
647ee836f5
apt_repository est déprécié (retrait ansible-core 2.25) et sortait un
avertissement à chaque run. deb822_repository écrit le même dépôt au format
moderne ; le cache APT n'est rafraîchi que si le dépôt change.

yamllint et ansible-lint ignorent aussi .venv/ et le vault chiffré, pour que
les lancers locaux depuis infra/ansible/ restent propres.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MxpHmd3thib9RErZuMvS3R
lenaic approved these changes 2026-09-02 14:13:32 +00:00
Dismissed
Merge branch 'develop' into gabriel/41-ansible-squelette
All checks were successful
Intégration / Qualité du code Python (pull_request) Successful in 11s
Intégration / Tests unitaires et couverture (pull_request) Successful in 11s
Intégration / Dépendances du tableau de bord (pull_request) Successful in 8s
Intégration / Images épinglées par version (pull_request) Successful in 3s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Intégration / Dépendances Python et inventaire applicatif (pull_request) Successful in 44s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 58s
e91f5d04d6
lenaic dismissed lenaic's review 2026-09-02 14:13:38 +00:00
Reason:

New commits pushed, approval review dismissed automatically according to repository settings

community.general.yaml plante à l'exécution ("function() argument 'code'
must be code, not str") sur ce venv Python 3.14 : le module patche
AnsibleDumper d'une façon incompatible avec la nouvelle disposition interne
des objets code. Le callback est de toute façon déprécié depuis
ansible-core 2.13 au profit de result_format=yaml sur le callback par
défaut, remplacement officiel adopté ici.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NbkbdXUvBFnQ5KuHan9y3J
Le rôle app écrivait app_repo_key_file (opt/enervision/.ssh/id_deploy) sans
jamais créer .ssh au préalable — échec systématique sur une cible où ce
répertoire n'existe pas encore (constaté en déployant #41 sur
serveur-salle : "Destination directory /opt/enervision/.ssh does not
exist").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NbkbdXUvBFnQ5KuHan9y3J
Le DNS du campus ENI détourne download.docker.com vers une IP interne qui
refuse la connexion (constaté sur serveur-salle) : le dépôt officiel Docker
est injoignable sur ce réseau. docker.io et docker-compose-v2 sont à jour
dans noble-updates et fournissent bien `docker compose`, donc plus besoin
du dépôt tiers ni de sa clé APT.

serveur-salle a un GPU Tesla T4 avec le toolkit nvidia déjà installé à la
main (hors périmètre de ce rôle) et default-runtime: nvidia en place, dont
dépendent implicitement tous les conteneurs qui y tournent (runners CI
Forgejo notamment). Le template daemon.json l'écrasait silencieusement ;
il le préserve maintenant via docker_nvidia_runtime, activé en host_vars
sur cette cible.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NbkbdXUvBFnQ5KuHan9y3J
Merge remote-tracking branch 'origin/gabriel/41-ansible-squelette' into gabriel/41-ansible-squelette
All checks were successful
Intégration / Qualité du code Python (pull_request) Successful in 11s
Intégration / Tests unitaires et couverture (pull_request) Successful in 11s
Intégration / Dépendances du tableau de bord (pull_request) Successful in 9s
Intégration / Images épinglées par version (pull_request) Successful in 3s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Intégration / Dépendances Python et inventaire applicatif (pull_request) Successful in 47s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 2m2s
448da0a37f
gabriel requested review from lenaic 2026-09-02 14:17:37 +00:00
lenaic approved these changes 2026-09-02 14:18:22 +00:00
lenaic merged commit f9ff812564 into develop 2026-09-02 14:18:25 +00:00
lenaic deleted branch gabriel/41-ansible-squelette 2026-09-02 14:18:25 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
g2/enervision!61
No description provided.