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>
This commit is contained in:
parent
8742bde807
commit
67a754f733
34 changed files with 1095 additions and 91 deletions
|
|
@ -2,3 +2,13 @@
|
|||
- name: recharger nginx
|
||||
ansible.builtin.shell: nginx -t && systemctl reload nginx
|
||||
changed_when: true
|
||||
|
||||
- name: recharger systemd
|
||||
ansible.builtin.systemd:
|
||||
daemon_reload: true
|
||||
|
||||
- name: redémarrer le worker de file
|
||||
ansible.builtin.systemd:
|
||||
name: portail-worker
|
||||
state: restarted
|
||||
enabled: true
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@
|
|||
- "--exclude=/public/hot"
|
||||
- "--exclude=/.git"
|
||||
register: portail_code_synchronise
|
||||
notify: redémarrer le worker de file
|
||||
|
||||
- name: installer les dépendances PHP (composer)
|
||||
ansible.builtin.command:
|
||||
|
|
@ -81,18 +82,24 @@
|
|||
portail_app_url: "http://{{ ansible_host }}"
|
||||
when: not portail_env_stat.stat.exists
|
||||
|
||||
# Variables ajoutées après le premier déploiement (étape 9) : mises à jour
|
||||
# ligne par ligne, pour ne jamais retoucher le reste d'un .env déjà en place
|
||||
# (APP_KEY en particulier, qui ne doit jamais changer sans le vouloir).
|
||||
- name: lire l'application credential OpenStack du portail (étape 6)
|
||||
# Variables ajoutées après le premier déploiement (étapes 9 et 10) : mises à
|
||||
# jour ligne par ligne, pour ne jamais retoucher le reste d'un .env déjà en
|
||||
# place (APP_KEY en particulier, qui ne doit jamais changer sans le vouloir).
|
||||
#
|
||||
# Authentification par mot de passe, pas par application credential : Heat
|
||||
# refuse de créer un trust Keystone à partir d'un jeton d'application
|
||||
# credential (« Delegated tokens cannot manage trusts », constaté le
|
||||
# 2026-10-08) — voir portail/config/openstack.php et docs/journal.md.
|
||||
- name: lire les identifiants OpenStack du portail (étape 6)
|
||||
ansible.builtin.slurp:
|
||||
src: /etc/kolla/clouds-paillasse.yaml
|
||||
register: portail_clouds_brut
|
||||
|
||||
- name: extraire l'id et le secret de l'application credential
|
||||
- name: extraire le nom d'utilisateur et le mot de passe
|
||||
ansible.builtin.set_fact:
|
||||
portail_os_application_credential_id: "{{ portail_clouds_contenu | regex_search('application_credential_id:\\s*\"?([^\"\\n]+)', '\\1') | first }}"
|
||||
portail_os_application_credential_secret: "{{ portail_clouds_contenu | regex_search('application_credential_secret:\\s*\"?([^\"\\n]+)', '\\1') | first }}"
|
||||
portail_os_username: "{{ portail_clouds_contenu | regex_search('username:\\s*\"?([^\"\\n]+)', '\\1') | first }}"
|
||||
portail_os_password: "{{ portail_clouds_contenu | regex_search('password:\\s*\"?([^\"\\n]+)', '\\1') | first }}"
|
||||
portail_os_project_name: "{{ portail_clouds_contenu | regex_search('project_name:\\s*\"?([^\"\\n]+)', '\\1') | first }}"
|
||||
vars:
|
||||
portail_clouds_contenu: "{{ portail_clouds_brut.content | b64decode }}"
|
||||
no_log: true
|
||||
|
|
@ -105,9 +112,14 @@
|
|||
loop:
|
||||
- { cle: "OS_AUTH_URL", valeur: "http://10.10.0.1:5000" }
|
||||
- { cle: "OS_NOVA_URL", valeur: "http://10.10.0.1:8774/v2.1" }
|
||||
- { cle: "OS_APPLICATION_CREDENTIAL_ID", valeur: "{{ portail_os_application_credential_id }}" }
|
||||
- { cle: "OS_APPLICATION_CREDENTIAL_SECRET", valeur: "{{ portail_os_application_credential_secret }}" }
|
||||
- { cle: "OS_HEAT_URL", valeur: "http://10.10.0.1:8004/v1" }
|
||||
- { cle: "OS_USERNAME", valeur: "{{ portail_os_username }}" }
|
||||
- { cle: "OS_PASSWORD", valeur: "{{ portail_os_password }}" }
|
||||
- { cle: "OS_PROJECT_NAME", valeur: "{{ portail_os_project_name }}" }
|
||||
- { cle: "OS_APPLICATION_CREDENTIAL_ID", valeur: "" }
|
||||
- { cle: "OS_APPLICATION_CREDENTIAL_SECRET", valeur: "" }
|
||||
- { cle: "REDIS_PREFIX", valeur: "" }
|
||||
- { cle: "LABS_DOSSIER", valeur: "/opt/labs" }
|
||||
no_log: true
|
||||
register: portail_env_mis_a_jour
|
||||
|
||||
|
|
|
|||
17
ansible/roles/portail/tasks/04-labs.yml
Normal file
17
ansible/roles/portail/tasks/04-labs.yml
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
# Étape 10 : labs/ est la copie de travail des lab.yaml, lue par
|
||||
# App\Services\Labs\DefinitionLab pour construire les templates Heat.
|
||||
- name: créer le dossier des labs
|
||||
ansible.builtin.file:
|
||||
path: /opt/labs
|
||||
state: directory
|
||||
owner: "{{ ansible_user }}"
|
||||
group: "{{ ansible_user }}"
|
||||
mode: "0755"
|
||||
|
||||
- name: synchroniser les labs
|
||||
become: false
|
||||
ansible.posix.synchronize:
|
||||
src: "{{ playbook_dir }}/../labs/"
|
||||
dest: /opt/labs/
|
||||
delete: true
|
||||
27
ansible/roles/portail/tasks/06-queue-scheduler.yml
Normal file
27
ansible/roles/portail/tasks/06-queue-scheduler.yml
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
---
|
||||
# Étape 10 : CreerStackLab et SupprimerStackLab sont des jobs Redis — il faut
|
||||
# un worker pour les exécuter, et un cron pour l'expiration automatique.
|
||||
- name: déployer le service systemd du worker de file
|
||||
ansible.builtin.template:
|
||||
src: portail-worker.service.j2
|
||||
dest: /etc/systemd/system/portail-worker.service
|
||||
mode: "0644"
|
||||
notify:
|
||||
- recharger systemd
|
||||
- redémarrer le worker de file
|
||||
|
||||
- name: appliquer les changements du worker
|
||||
ansible.builtin.meta: flush_handlers
|
||||
|
||||
- name: activer et démarrer le worker de file
|
||||
ansible.builtin.systemd:
|
||||
name: portail-worker
|
||||
enabled: true
|
||||
state: started
|
||||
|
||||
- name: planifier le scheduler Laravel (expiration des sessions de lab)
|
||||
ansible.builtin.cron:
|
||||
name: "scheduler Laravel (portail Syllabus)"
|
||||
user: www-data
|
||||
minute: "*"
|
||||
job: "cd {{ portail_dossier_app }} && php artisan schedule:run >> /dev/null 2>&1"
|
||||
|
|
@ -8,5 +8,11 @@
|
|||
- name: code de l'application
|
||||
ansible.builtin.import_tasks: 03-code.yml
|
||||
|
||||
- name: labs (copie de travail des lab.yaml)
|
||||
ansible.builtin.import_tasks: 04-labs.yml
|
||||
|
||||
- name: Nginx
|
||||
ansible.builtin.import_tasks: 04-nginx.yml
|
||||
ansible.builtin.import_tasks: 05-nginx.yml
|
||||
|
||||
- name: file et planificateur (jobs Heat, expiration des sessions)
|
||||
ansible.builtin.import_tasks: 06-queue-scheduler.yml
|
||||
|
|
|
|||
16
ansible/roles/portail/templates/portail-worker.service.j2
Normal file
16
ansible/roles/portail/templates/portail-worker.service.j2
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
[Unit]
|
||||
Description=Worker de file du portail Syllabus (CreerStackLab, SupprimerStackLab — étape 10)
|
||||
# Géré par Ansible (rôle portail) — ne pas modifier à la main.
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=www-data
|
||||
Group=www-data
|
||||
WorkingDirectory={{ portail_dossier_app }}
|
||||
ExecStart=/usr/bin/php{{ portail_php_version }} artisan queue:work --sleep=1 --tries=1 --max-time=3600
|
||||
Restart=always
|
||||
RestartSec=3
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
Loading…
Add table
Add a link
Reference in a new issue