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>
3.4 KiB
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
- Le lab existe déjà en tant que contenu dans
paillasse-contenus/{id}/lab.yaml, avec un formatreseaux: [{nom, cidr}]etmachines: [{nom, image, flavor, reseaux: [...]}](l'ordre des réseaux d'une machine décide de l'ordre des interfaces : la première listée seraens3, la suivanteens4, etc.). - Copier (ou faire relire) ce
lab.yamldanslabs/{id}/lab.yamlde ce dépôt. - Vérifier que les images et flavors nommés existent déjà dans OpenStack (
openstack image list,openstack flavor list). - Déployer (
ansible-playbook portail.yml) : la tâche04-labs.ymlsynchroniselabs/vers/opt/labssur le serveur. - Tester : admettre un élève de test sur ce lab, vérifier que la stack passe en
CREATE_COMPLETEet 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 comptepaillasse-services'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 filesur la tâche de synchronisation) : unqueue:workdéjà lancé garde l'ancien code en mémoire tant qu'il n'est pas relancé. sudo -u www-data php artisan ...échoue sansHOME=/tmp(« Writing to directory /var/www/.config/psysh is not allowed ») :www-datan'a pas de$HOMEinscriptible 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.