Paillasse/docs/runbooks/labs.md
Adam Belkacemi 67a754f733 ajoute la liaison Laravel-OpenStack et le modèle Heat du lab 08
Un gabarit Heat généré depuis chaque lab.yaml, une stack par session de
lab (création à l'admission, suppression à l'expiration via des jobs
Redis et un worker systemd dédié). Passage du compte de service à une
authentification par mot de passe : Heat refuse de créer un trust à
partir d'un jeton d'application credential (voir ADR 0002).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-08 10:14:24 +02:00

3.4 KiB

Runbook — Labs et stacks Heat (étape 10)

Où sont les choses

Élément Emplacement
Source éditoriale des labs paillasse-contenus/ (dépôt de contenu, pas de code)
Copie de travail lue par le portail labs/ à la racine de ce dépôt → synchronisée vers /opt/labs sur le serveur
Lecture d'un lab.yaml portail/app/Services/Labs/DefinitionLab.php
Traduction lab → gabarit Heat portail/app/Services/OpenStack/GenerateurTemplateHeat.php
Authentification OpenStack partagée portail/app/Services/OpenStack/KeystoneAuth.php (mot de passe, pas application credential — voir ADR 0002)
Appels Heat portail/app/Services/OpenStack/HeatClient.php
Création de stack (à l'admission) portail/app/Jobs/CreerStackLab.php
Suppression de stack (à l'expiration ou à la fin) portail/app/Jobs/SupprimerStackLab.php
Expiration automatique commande labs:expirer-sessions (portail/app/Console/Commands/ExpirerSessionsLab.php), planifiée chaque minute (routes/console.php + cron www-data sur le serveur)
Worker qui exécute les jobs service systemd portail-worker (queue:work)

Ajouter un nouveau lab

  1. Le lab existe déjà en tant que contenu dans paillasse-contenus/{id}/lab.yaml, avec un format reseaux: [{nom, cidr}] et machines: [{nom, image, flavor, reseaux: [...]}] (l'ordre des réseaux d'une machine décide de l'ordre des interfaces : la première listée sera ens3, la suivante ens4, etc.).
  2. Copier (ou faire relire) ce lab.yaml dans labs/{id}/lab.yaml de ce dépôt.
  3. Vérifier que les images et flavors nommés existent déjà dans OpenStack (openstack image list, openstack flavor list).
  4. Déployer (ansible-playbook portail.yml) : la tâche 04-labs.yml synchronise labs/ vers /opt/labs sur le serveur.
  5. Tester : admettre un élève de test sur ce lab, vérifier que la stack passe en CREATE_COMPLETE et que chaque terminal s'ouvre.

Déclencher l'expiration manuellement

ssh paillasse "cd /var/www/portail && sudo -u www-data HOME=/tmp php8.3 artisan labs:expirer-sessions"

Inspecter une stack en cours sur le serveur

sudo -i
export PATH=/opt/kolla-venv/bin:$PATH
export OS_CLIENT_CONFIG_FILE=/etc/kolla/clouds-paillasse.yaml
export OS_CLOUD=paillasse-service
openstack stack list
openstack stack show lab-session-{id}
openstack server list

Pièges rencontrés

  • Heat refuse de créer une stack avec une application credential (Delegated tokens cannot manage trusts) : Heat a besoin de créer un trust Keystone, qu'un jeton déjà délégué ne peut jamais déléguer à son tour. Le compte paillasse-service s'authentifie par mot de passe pour cette raison — voir ADR 0002. Ne jamais revenir à une application credential pour ce compte.
  • Après un déploiement de code, le worker doit redémarrer (notify: redémarrer le worker de file sur la tâche de synchronisation) : un queue:work déjà lancé garde l'ancien code en mémoire tant qu'il n'est pas relancé.
  • sudo -u www-data php artisan ... échoue sans HOME=/tmp (« Writing to directory /var/www/.config/psysh is not allowed ») : www-data n'a pas de $HOME inscriptible sur ce serveur.
  • Une stack Heat appartient à une session de lab (un élève, une tentative), jamais à une classe : ne pas chercher à réutiliser une stack entre deux élèves ou deux tentatives.