From db2842689a661d12f14e93bce766322146c5b5fb Mon Sep 17 00:00:00 2001 From: Adam Belkacemi Date: Wed, 7 Oct 2026 15:50:54 +0200 Subject: [PATCH] =?UTF-8?q?d=C3=A9ploie=20OpenStack=202025.2=20avec=20Koll?= =?UTF-8?q?a-Ansible=20(tout-en-un,=20API=20sur=20dummy0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .gitignore | 6 + ansible/kolla.yml | 10 + ansible/roles/durcissement/handlers/main.yml | 9 + ansible/roles/durcissement/tasks/main.yml | 8 + ansible/roles/kolla/defaults/main.yml | 4 + ansible/roles/kolla/tasks/main.yml | 120 ++++ .../templates/99-ip-forward.conf.j2 | 3 - docs/adr/0001-kolla-2025-2-sur-debian-12.md | 43 ++ docs/journal.md | 40 ++ docs/runbooks/openstack.md | 88 +++ kolla/all-in-one | 597 ++++++++++++++++++ kolla/globals.yml | 53 ++ 12 files changed, 978 insertions(+), 3 deletions(-) create mode 100644 ansible/kolla.yml create mode 100644 ansible/roles/kolla/defaults/main.yml create mode 100644 ansible/roles/kolla/tasks/main.yml delete mode 100644 ansible/roles/reseau-openstack/templates/99-ip-forward.conf.j2 create mode 100644 docs/adr/0001-kolla-2025-2-sur-debian-12.md create mode 100644 docs/runbooks/openstack.md create mode 100644 kolla/all-in-one create mode 100644 kolla/globals.yml diff --git a/.gitignore b/.gitignore index 3323b34..2ef7bb1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,8 @@ .env .DS_Store + +# Secrets Kolla : ne vivent que sur le serveur (/etc/kolla) +passwords.yml +clouds.yaml +admin-openrc.sh +*-openrc.sh diff --git a/ansible/kolla.yml b/ansible/kolla.yml new file mode 100644 index 0000000..a1e942f --- /dev/null +++ b/ansible/kolla.yml @@ -0,0 +1,10 @@ +--- +# Étape 5 du déploiement Syllabus : préparation de Kolla-Ansible (venv, +# globals.yml, inventaire, mots de passe). Ne déploie pas OpenStack lui-même : +# voir docs/runbooks/openstack.md pour bootstrap-servers / prechecks / deploy. +- name: Préparation de Kolla-Ansible + hosts: syllabus + become: true + gather_facts: true + roles: + - kolla diff --git a/ansible/roles/durcissement/handlers/main.yml b/ansible/roles/durcissement/handlers/main.yml index 9f263c2..8a2f862 100644 --- a/ansible/roles/durcissement/handlers/main.yml +++ b/ansible/roles/durcissement/handlers/main.yml @@ -5,6 +5,15 @@ state: restarted enabled: true +# Le rechargement commence par `flush ruleset`, qui efface aussi la table de +# fail2ban (f2b-table) : on relance fail2ban juste après pour qu'il la +# reconstruise et rebannisse les IP encore en cours de bannissement. +- name: relancer fail2ban après le pare-feu + listen: recharger nftables + ansible.builtin.systemd: + name: fail2ban + state: restarted + - name: recharger ssh ansible.builtin.service: name: ssh diff --git a/ansible/roles/durcissement/tasks/main.yml b/ansible/roles/durcissement/tasks/main.yml index 0a31290..b1330a3 100644 --- a/ansible/roles/durcissement/tasks/main.yml +++ b/ansible/roles/durcissement/tasks/main.yml @@ -95,6 +95,14 @@ validate: "nft -c -f %s" notify: recharger nftables +# Recharge même si nftables.conf n'a pas changé, pour effacer des tables +# ajoutées par un autre logiciel (ex. Docker) : -e durcissement_forcer_rechargement=true +- name: forcer le rechargement du pare-feu (sur demande) + ansible.builtin.command: /bin/true + changed_when: true + notify: recharger nftables + when: durcissement_forcer_rechargement | default(false) | bool + - name: appliquer le pare-feu immédiatement ansible.builtin.meta: flush_handlers diff --git a/ansible/roles/kolla/defaults/main.yml b/ansible/roles/kolla/defaults/main.yml new file mode 100644 index 0000000..144c6ba --- /dev/null +++ b/ansible/roles/kolla/defaults/main.yml @@ -0,0 +1,4 @@ +--- +kolla_serie: "2025.2" +kolla_venv: /opt/kolla-venv +kolla_config_dir: /etc/kolla diff --git a/ansible/roles/kolla/tasks/main.yml b/ansible/roles/kolla/tasks/main.yml new file mode 100644 index 0000000..c28fe93 --- /dev/null +++ b/ansible/roles/kolla/tasks/main.yml @@ -0,0 +1,120 @@ +--- +# Étape 5 : prépare Kolla-Ansible (venv, configuration, mots de passe). +# Les commandes longues (bootstrap-servers, prechecks, deploy) se lancent à la +# main, voir docs/runbooks/openstack.md. + +- name: installer les dépendances système de Kolla-Ansible + tags: [installation] + ansible.builtin.apt: + name: + - git + - python3-dev + - libffi-dev + - gcc + - libssl-dev + - libdbus-glib-1-dev + - python3-venv + state: present + update_cache: true + cache_valid_time: 3600 + +- name: créer le venv et mettre pip à jour + tags: [installation] + ansible.builtin.pip: + name: pip + state: latest + virtualenv: "{{ kolla_venv }}" + virtualenv_command: python3 -m venv + +- name: installer Kolla-Ansible {{ kolla_serie }} + tags: [installation] + ansible.builtin.pip: + name: "git+https://opendev.org/openstack/kolla-ansible@stable/{{ kolla_serie }}" + virtualenv: "{{ kolla_venv }}" + +# Kolla exécute ses modules avec le Python du venv (connexion locale) : les +# bibliothèques docker et dbus doivent donc y être, pas seulement dans le système. +- name: installer les SDK docker et dbus dans le venv (contraintes {{ kolla_serie }}) + tags: [installation] + ansible.builtin.pip: + name: + - docker + - dbus-python + extra_args: "-c https://releases.openstack.org/constraints/upper/{{ kolla_serie }}" + virtualenv: "{{ kolla_venv }}" + +- name: installer le client openstack (contraintes {{ kolla_serie }}) + tags: [installation] + ansible.builtin.pip: + name: python-openstackclient + extra_args: "-c https://releases.openstack.org/constraints/upper/{{ kolla_serie }}" + virtualenv: "{{ kolla_venv }}" + +- name: rendre les commandes du venv accessibles dans le PATH + tags: [installation] + ansible.builtin.file: + src: "{{ kolla_venv }}/bin/{{ item }}" + dest: "/usr/local/bin/{{ item }}" + state: link + loop: + - kolla-ansible + - kolla-genpwd + - openstack + +- name: créer {{ kolla_config_dir }} + ansible.builtin.file: + path: "{{ kolla_config_dir }}" + state: directory + owner: root + group: root + mode: "0750" + +- name: déployer globals.yml (versionné dans le dépôt, sans secret) + ansible.builtin.copy: + src: "{{ playbook_dir }}/../kolla/globals.yml" + dest: "{{ kolla_config_dir }}/globals.yml" + owner: root + group: root + mode: "0640" + +- name: déployer l'inventaire all-in-one + ansible.builtin.copy: + src: "{{ playbook_dir }}/../kolla/all-in-one" + dest: "{{ kolla_config_dir }}/all-in-one" + owner: root + group: root + mode: "0640" + +# passwords.yml n'existe que sur le serveur : jamais dans Git. On copie le +# modèle vide une seule fois, puis kolla-genpwd le remplit. +- name: copier le modèle passwords.yml s'il n'existe pas encore + ansible.builtin.copy: + src: "{{ kolla_venv }}/share/kolla-ansible/etc_examples/kolla/passwords.yml" + dest: "{{ kolla_config_dir }}/passwords.yml" + remote_src: true + force: false + owner: root + group: root + mode: "0600" + register: kolla_passwords_modele + +- name: générer les mots de passe (première fois seulement) + ansible.builtin.command: + cmd: "{{ kolla_venv }}/bin/kolla-genpwd -p {{ kolla_config_dir }}/passwords.yml" + when: kolla_passwords_modele.changed + +# kolla-genpwd réécrit le fichier en 640 : on reforce 600 à chaque passage. +- name: restreindre passwords.yml à root seul + ansible.builtin.file: + path: "{{ kolla_config_dir }}/passwords.yml" + owner: root + group: root + mode: "0600" + +- name: installer les dépendances Ansible de Kolla (collections Galaxy) + ansible.builtin.command: + cmd: "{{ kolla_venv }}/bin/kolla-ansible install-deps" + environment: + PATH: "{{ kolla_venv }}/bin:{{ ansible_env.PATH }}" + register: kolla_install_deps + changed_when: "'Installing' in kolla_install_deps.stdout" diff --git a/ansible/roles/reseau-openstack/templates/99-ip-forward.conf.j2 b/ansible/roles/reseau-openstack/templates/99-ip-forward.conf.j2 deleted file mode 100644 index 3ac5fd1..0000000 --- a/ansible/roles/reseau-openstack/templates/99-ip-forward.conf.j2 +++ /dev/null @@ -1,3 +0,0 @@ -# Géré par Ansible (rôle reseau-openstack) — ne pas modifier à la main. -# Nécessaire pour que le NAT masquerade du réseau externe OpenStack fonctionne. -net.ipv4.ip_forward = 1 diff --git a/docs/adr/0001-kolla-2025-2-sur-debian-12.md b/docs/adr/0001-kolla-2025-2-sur-debian-12.md new file mode 100644 index 0000000..bf6ed4c --- /dev/null +++ b/docs/adr/0001-kolla-2025-2-sur-debian-12.md @@ -0,0 +1,43 @@ +# ADR 0001 — Kolla-Ansible 2025.2 sur Debian 12, sans HAProxy ni Cinder + +- **Date** : 2026-10-07 +- **Statut** : accepté + +## Contexte + +Le serveur Syllabus (Dedibox Start-2-L) est installé en Debian 12 (bookworm), +avec une seule IP publique et deux SSD entièrement utilisés par un RAID 1 +logiciel pour `/`. Il faut un OpenStack tout-en-un, maintenu, dont aucune API +n'est exposée sur l'IP publique. + +## Décision + +1. **Kolla-Ansible série 2025.2 (Flamingo).** C'est la plus récente qui + supporte encore Debian 12 comme hôte : 2026.1 ne supporte plus que + Debian 13. 2025.1 n'est plus maintenue depuis le 2 octobre 2026, alors + que 2025.2 l'est jusqu'en avril 2027 (fin de vie estimée). + Sources : support matrix 2025.2 et 2026.1, releases.openstack.org. +2. **Images `debian` (`2025.2-debian-bookworm`)**, cohérentes avec l'hôte. +3. **Pas de HAProxy ni de keepalived** : un seul nœud, donc aucune VIP à faire + flotter. Toutes les API écoutent sur `dummy0` (10.10.0.1). +4. **Neutron OVN**, réseau externe sur une paire veth NATée (étape 4), jamais + sur `eno1`. +5. **Pas de Cinder pour l'instant.** Il n'y a aucun espace disque libre pour + un groupe de volumes LVM. Une alternative (fichier en loopback sur `/`) + serait fragile et lente pour un gain nul : les labs n'ont besoin que de + disques éphémères Nova. +6. **Kolla ne gère pas le pare-feu.** Il est écrit dans le rôle Ansible + `durcissement`, et Docker est configuré pour ne créer aucune règle. + +## Conséquences + +- Il faudra passer à Debian 13 pour suivre les séries suivantes (2026.1 et + au-delà) : c'est un sujet de la montée de version (semaine 7 du bloc A), + à prévoir avant avril 2027. +- Kolla est installé depuis la branche `stable/2025.2` (version + `21.3.1.dev4` au moment de l'installation), comme le recommande la + documentation. Pour une reproductibilité stricte, il faudra figer un tag + de version. +- Pas de volumes persistants pour les VM tant que Cinder (ou Ceph, bloc C) + n'est pas en place. Les travaux des élèves devront donc être sauvegardés + ailleurs (S3, bloc B). diff --git a/docs/journal.md b/docs/journal.md index 5bca60a..f2ba406 100644 --- a/docs/journal.md +++ b/docs/journal.md @@ -149,3 +149,43 @@ OpenStack a besoin de deux réseaux en plus de l'accès public : un réseau inte **Suite** Étape 5 : Kolla-Ansible 2025.2 tout-en-un. `bootstrap-servers` peut toucher au pare-feu et à Docker : vérifier avant, rejouer `durcissement` après, et demander l'accord d'Adam pour ce qui touche au pare-feu. + +## 2026-10-07 — Étape 5 : OpenStack avec Kolla-Ansible 2025.2 + +**Fait** + +- Rôle Ansible `kolla` + playbook `ansible/kolla.yml` : dépendances système, venv `/opt/kolla-venv` (Kolla-Ansible `stable/2025.2`, version `21.3.1.dev4`, ansible-core 2.19, client `openstack` 8.2.0, SDK `docker` et `dbus-python`), `/etc/kolla/globals.yml` et `all-in-one` copiés depuis le dépôt (`kolla/`), `passwords.yml` généré par `kolla-genpwd` **sur le serveur uniquement** (`600 root:root`, jamais dans Git), `install-deps`. +- `kolla/globals.yml` : images Debian bookworm (tag vérifié sur quay.io), API sur `dummy0`, réseau externe `veth-ext-ovs`, OVN, sans HAProxy, keepalived, ProxySQL, Horizon ni Cinder ; avec Heat, console série, KVM, Prometheus, Grafana. `disable_firewall: false`. Docker sans iptables ni ip6tables. +- Avant de lancer `bootstrap-servers`, j'ai lu son code installé localement pour savoir s'il touchait au pare-feu. Sur Debian, il ne fait qu'essayer de désactiver `ufw` (absent) et ne touche ni à nftables ni à l'heure. +- `bootstrap-servers`, `prechecks`, `deploy` (lancé comme service `systemd-run` pour survivre à une coupure SSH, 22 min), `post-deploy`. +- ADR `docs/adr/0001-kolla-2025-2-sur-debian-12.md`, runbook `docs/runbooks/openstack.md`. +- Correction fail2ban validée par Adam à l'étape 4 : le handler `recharger nftables` relance aussi fail2ban (handler `listen`), et une option `-e durcissement_forcer_rechargement=true` force un rechargement du pare-feu. + +**Problèmes rencontrés et solution** + +1. `install-deps` : `No such file or directory: 'ansible-galaxy'` → le `bin` du venv doit être dans le `PATH`. +2. **`bootstrap-servers` a modifié le pare-feu** (arrêt et accord d'Adam). Docker 29 a créé des tables `ip6 nat` et `ip6 filter` malgré `iptables: false` : depuis Docker 27, l'IPv6 a son propre réglage. Aucun impact sur la sécurité, car notre chaîne `forward` en `drop` l'emporte. Correction : `docker_custom_config: {ip6tables: false}`, puis un rechargement forcé du pare-feu sous filet anti-coupure. J'ai vérifié qu'un redémarrage de Docker ne recrée plus les tables. +3. `prechecks` : `No module named 'docker'` → Kolla utilise le Python du venv ; `docker` et `dbus-python` ajoutés au venv. +4. **1er `deploy` en échec** : MariaDB `Bind on TCP/IP port. Got error: 98: Address already in use`. ProxySQL écoute sur la VIP:3306, et sans HAProxy la VIP est l'IP du nœud, donc il occupait le port de MariaDB. Correction : `enable_proxysql: "no"`. Le conteneur et le volume `proxysql` ont été supprimés avec l'accord d'Adam. Le volume `proxysql_socket` est encore présent (non validé, à supprimer avec son accord). Au 2ᵉ `deploy`, MariaDB a démarré sans qu'il faille réinitialiser son volume. + +**Critère vérifié** + +- `openstack service list` : keystone, glance, nova, neutron, placement, heat, heat-cfn. +- `openstack compute service list` : nova-scheduler, nova-conductor, nova-compute `up`. Agents OVN (Controller Gateway, Metadata) vivants. +- `nmap` depuis le Mac sur les ports OpenStack (5000, 8774, 8775, 8778, 9292, 9696, 6080-6083, 3000, 9090, 9091, 9093, 9100, 3306, 5672, 15672, 11211, 6641, 6642, 16509…) + 1-1024 : **seul 22 est ouvert**. +- Pare-feu identique à la référence ; seule `f2b-table` (fail2ban) en plus. +- Correction fail2ban testée : bannissement de l'adresse de test `192.0.2.10` (plage réservée à la documentation), rechargement forcé du pare-feu ; `f2b-table` recréée et le bannissement toujours en place. Adresse débannie ensuite. +- 46 conteneurs ; RAM utilisée 11 Gio sur 31 (19 Gio disponibles) avant toute VM. + +**Dettes notées** + +- Les bases OVN (`ovsdb-server`, 6641/6642) écoutent sur `0.0.0.0`. Le pare-feu les bloque, mais il faudrait les restreindre à `10.10.0.1` (défense en profondeur). +- Kolla est installé depuis une branche, pas un tag : figer la version pour la reproductibilité (ADR 0001). + +**Comprendre** + +Kolla-Ansible déploie OpenStack sous forme de conteneurs Docker : chaque service (Keystone, Nova, Neutron…) tourne dans son propre conteneur, configuré par Ansible à partir d'un seul fichier, `globals.yml`. Les deux incidents de cette étape viennent de valeurs par défaut prévues pour un vrai cluster de plusieurs serveurs. Docker crée des règles de pare-feu IPv6 pour ses réseaux, et ProxySQL suppose une adresse virtuelle distincte de celle du serveur. Sur un seul nœud, ces mécanismes ne servent à rien et se gênent entre eux. La leçon : lire le code de l'outil avant de le lancer, et comparer le pare-feu avant et après, plutôt que de faire confiance aux options. C'est ce qui a permis de repérer les tables Docker en quelques secondes. + +**Suite** + +Étape 6 : projet `paillasse`, utilisateur de service avec application credentials, image `paillasse-debian` (virt-customize), flavor `eleve.petit`, première VM et console série par WebSocket. diff --git a/docs/runbooks/openstack.md b/docs/runbooks/openstack.md new file mode 100644 index 0000000..8880f55 --- /dev/null +++ b/docs/runbooks/openstack.md @@ -0,0 +1,88 @@ +# Runbook — OpenStack (Kolla-Ansible 2025.2, tout-en-un) + +## Où sont les choses + +| Élément | Emplacement | +|---|---| +| venv Kolla-Ansible + client `openstack` | `/opt/kolla-venv` (liens dans `/usr/local/bin`) | +| Configuration | `/etc/kolla/globals.yml` (copie de `kolla/globals.yml` du dépôt) | +| Inventaire | `/etc/kolla/all-in-one` (copie de `kolla/all-in-one`) | +| Mots de passe | `/etc/kolla/passwords.yml` — **serveur uniquement**, `600 root:root`, jamais dans Git | +| Accès admin | `/etc/kolla/clouds.yaml`, `/etc/kolla/admin-openrc.sh` (générés par `post-deploy`) | +| Collections Ansible de Kolla | `/root/.ansible/collections/` (installées par `install-deps`) | +| Journaux des déploiements | `/var/log/kolla-*.log` | + +Tout ce qui précède (sauf les mots de passe et les fichiers générés) est +préparé par le playbook `ansible/kolla.yml` depuis le Mac : + +``` +cd ansible && script -q /dev/null ansible-playbook kolla.yml -i inventory.ini +``` + +## Choix de configuration (résumé de `kolla/globals.yml`) + +- Images `debian` (tag `2025.2-debian-bookworm`). +- Toutes les API sur `dummy0` (10.10.0.1), jamais sur `eno1`. Pas de HAProxy ni keepalived (un seul nœud). +- Réseau externe Neutron : `veth-ext-ovs` (paire veth de l'étape 4), OVN. +- Heat, console série (`nova-serialproxy`), KVM, Prometheus, Grafana activés. Horizon désactivé. +- Cinder désactivé : pas de place pour un groupe de volumes LVM (disques entièrement en RAID 1). +- `disable_firewall: false` et Docker en `iptables: false`, `ip6tables: false`, `bridge: none`, `ip-forward: false` : **ni Kolla ni Docker ne touchent au pare-feu**, géré uniquement par le rôle `durcissement`. + +## Déployer / redéployer + +Sur le serveur, en root : + +``` +sudo -i +export PATH=/opt/kolla-venv/bin:$PATH +cd /etc/kolla +kolla-ansible bootstrap-servers -i all-in-one # installe Docker, /etc/hosts… +kolla-ansible prechecks -i all-in-one +kolla-ansible deploy -i all-in-one # 20 à 60 min la première fois +kolla-ansible post-deploy -i all-in-one # génère clouds.yaml et admin-openrc.sh +``` + +Pour un `deploy` long, le lancer comme service pour survivre à une coupure SSH : + +``` +sudo systemd-run --unit=kolla-deploy \ + --setenv=PATH=/opt/kolla-venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ + --setenv=HOME=/root --working-directory=/etc/kolla \ + bash -c 'kolla-ansible deploy -i /etc/kolla/all-in-one > /var/log/kolla-deploy.log 2>&1' +journalctl -fu kolla-deploy # ou : tail -f /var/log/kolla-deploy.log +``` + +## Après chaque opération Kolla : vérifier le pare-feu + +Kolla et Docker ne doivent créer aucune table nftables. Référence enregistrée +dans `/tmp/nft-reference.txt` (à refaire après un changement voulu) : + +``` +sudo nft list tables # attendu : table inet filter, table ip nat +``` + +Si une table étrangère apparaît, comprendre d'où elle vient, puis recharger le +pare-feu depuis le Mac (sous filet anti-coupure) : + +``` +cd ansible && script -q /dev/null ansible-playbook reseau-openstack.yml -i inventory.ini \ + -e durcissement_forcer_rechargement=true +``` + +## Utiliser le client openstack + +``` +sudo -i +export OS_CLOUD=kolla-admin +export OS_CLIENT_CONFIG_FILE=/etc/kolla/clouds.yaml +openstack service list +openstack compute service list +openstack network agent list +``` + +## Pièges rencontrés + +- `kolla-ansible install-deps` : `No such file or directory: 'ansible-galaxy'` si le `bin` du venv n'est pas dans le `PATH`. +- `prechecks` : `No module named 'docker'` — Kolla utilise le Python du venv, il faut `docker` et `dbus-python` **dans le venv** (fait par le rôle `kolla`). +- Docker 29 crée des tables `ip6 nat` / `ip6 filter` malgré `iptables: false` : ajouter `ip6tables: false` (`docker_custom_config` dans `globals.yml`). +- `kolla-genpwd` réécrit `passwords.yml` en `640` : le rôle remet `600`. diff --git a/kolla/all-in-one b/kolla/all-in-one new file mode 100644 index 0000000..e4b5fb4 --- /dev/null +++ b/kolla/all-in-one @@ -0,0 +1,597 @@ +# These initial groups are the only groups required to be modified. The +# additional groups are for more control of the environment. +[control] +localhost ansible_connection=local + +[network] +localhost ansible_connection=local + +[compute] +localhost ansible_connection=local + +[storage] +localhost ansible_connection=local + +[monitoring] +localhost ansible_connection=local + +[deployment] +localhost ansible_connection=local + +# You can explicitly specify which hosts run each project by updating the +# groups in the sections below. Common services are grouped together. + +[common:children] +control +network +compute +storage +monitoring + +[collectd:children] +compute + +[baremetal:children] +control + +[tls-backend:children] +control +network + +[grafana:children] +monitoring + +[etcd:children] +control + +[telegraf:children] +compute +control +monitoring +network +storage + +[hacluster:children] +control + +[hacluster-remote:children] +compute + +[loadbalancer:children] +network + +[mariadb:children] +control + +[rabbitmq:children] +control + +[keystone:children] +control + +[glance:children] +control + +[nova:children] +control + +[neutron:children] +network + +[openvswitch:children] +network +compute +manila-share + +[cinder:children] +control + +[cloudkitty:children] +control + +[memcached:children] +control + +[horizon:children] +control + +[barbican:children] +control + +[heat:children] +control + +[ironic:children] +control + +[influxdb:children] +monitoring + +[prometheus:children] +monitoring + +[magnum:children] +control + +[mistral:children] +control + +[manila:children] +control + +[gnocchi:children] +control + +[ceilometer:children] +control + +[aodh:children] +control + +[cyborg:children] +control + +[tacker:children] +control + +[trove:children] +control + +[watcher:children] +control + +[octavia:children] +control + +[designate:children] +control + +[placement:children] +control + +[bifrost:children] +deployment + +[zun:children] +control + +[skyline:children] +control + +# TODO(vurmil): Remove after G/2026.1 release as Redis migration is no longer required +[redis:children] +control + +[valkey:children] +control + +[blazar:children] +control + +[letsencrypt:children] +loadbalancer + +# Additional control implemented here. These groups allow you to control which +# services run on which hosts at a per-service level. +# +# Word of caution: Some services are required to run on the same host to +# function appropriately. For example, neutron-metadata-agent must run on the +# same host as the l3-agent and (depending on configuration) the dhcp-agent. + +# Common +[cron:children] +common + +[fluentd:children] +common + +[kolla-logs:children] +common + +[kolla-toolbox:children] +common + +[opensearch:children] +control + +# Opensearch dashboards +[opensearch-dashboards:children] +opensearch + +# Glance +[glance-api:children] +glance + +# Nova +[nova-api:children] +nova + +[nova-conductor:children] +nova + +[nova-metadata:children] +nova + +[nova-super-conductor:children] +nova + +[nova-novncproxy:children] +nova + +[nova-scheduler:children] +nova + +[nova-spicehtml5proxy:children] +nova + +[nova-compute-ironic:children] +nova + +[nova-serialproxy:children] +nova + +# Neutron +[ironic-neutron-agent:children] +neutron + +[neutron-bgp-dragent:children] +neutron + +[neutron-dhcp-agent:children] +neutron + +[neutron-infoblox-ipam-agent:children] +neutron + +[neutron-l3-agent:children] +neutron + +[neutron-metadata-agent:children] +neutron + +[neutron-metering-agent:children] +neutron + +[neutron-periodic-worker:children] +control + +[neutron-rpc-server:children] +control + +[neutron-server:children] +control + +[neutron-ovn-agent:children] +compute +network + +[neutron-ovn-maintenance-worker:children] +control + +[neutron-ovn-metadata-agent:children] +compute +network + +# Cinder +[cinder-api:children] +cinder + +[cinder-backup:children] +storage + +[cinder-scheduler:children] +cinder + +[cinder-volume:children] +storage + +# Cloudkitty +[cloudkitty-api:children] +cloudkitty + +[cloudkitty-processor:children] +cloudkitty + +# iSCSI +[iscsid:children] +compute +storage +ironic + +[tgtd:children] +storage + +# Manila +[manila-api:children] +manila + +[manila-scheduler:children] +manila + +[manila-share:children] +network + +[manila-data:children] +manila + +# Barbican +[barbican-api:children] +barbican + +[barbican-keystone-listener:children] +barbican + +[barbican-worker:children] +barbican + +# Trove +[trove-api:children] +trove + +[trove-conductor:children] +trove + +[trove-taskmanager:children] +trove + +# Heat +[heat-api:children] +heat + +[heat-api-cfn:children] +heat + +[heat-engine:children] +heat + +# Ironic +[ironic-api:children] +ironic + +[ironic-conductor:children] +ironic + +[ironic-dnsmasq:children] +ironic + +[ironic-tftp:children] +ironic + +[ironic-http:children] +ironic + +# Magnum +[magnum-api:children] +magnum + +[magnum-conductor:children] +magnum + +# Mistral +[mistral-api:children] +mistral + +[mistral-executor:children] +mistral + +[mistral-engine:children] +mistral + +[mistral-event-engine:children] +mistral + +# Aodh +[aodh-api:children] +aodh + +[aodh-evaluator:children] +aodh + +[aodh-listener:children] +aodh + +[aodh-notifier:children] +aodh + +# Cyborg +[cyborg-api:children] +cyborg + +[cyborg-agent:children] +compute + +[cyborg-conductor:children] +cyborg + +# Gnocchi +[gnocchi-api:children] +gnocchi + +[gnocchi-statsd:children] +gnocchi + +[gnocchi-metricd:children] +gnocchi + +# Ceilometer +[ceilometer-central:children] +ceilometer + +[ceilometer-notification:children] +ceilometer + +[ceilometer-compute:children] +compute + +[ceilometer-ipmi:children] +compute + +# Multipathd +[multipathd:children] +compute +storage + +# Watcher +[watcher-api:children] +watcher + +[watcher-engine:children] +watcher + +[watcher-applier:children] +watcher + +# Octavia +[octavia-api:children] +octavia + +[octavia-driver-agent:children] +octavia + +[octavia-health-manager:children] +octavia + +[octavia-housekeeping:children] +octavia + +[octavia-worker:children] +octavia + +# Designate +[designate-api:children] +designate + +[designate-central:children] +designate + +[designate-producer:children] +designate + +[designate-mdns:children] +network + +[designate-worker:children] +designate + +[designate-sink:children] +designate + +[designate-backend-bind9:children] +designate + +# Placement +[placement-api:children] +placement + +# Zun +[zun-api:children] +zun + +[zun-wsproxy:children] +zun + +[zun-compute:children] +compute + +[zun-cni-daemon:children] +compute + +# Skyline +[skyline-apiserver:children] +skyline + +[skyline-console:children] +skyline + +# Tacker +[tacker-server:children] +tacker + +[tacker-conductor:children] +tacker + +# Blazar +[blazar-api:children] +blazar + +[blazar-manager:children] +blazar + +# Prometheus +[prometheus-node-exporter:children] +monitoring +control +compute +network +storage + +[prometheus-mysqld-exporter:children] +mariadb + +[prometheus-memcached-exporter:children] +memcached + +[prometheus-cadvisor:children] +monitoring +control +compute +network +storage + +[prometheus-alertmanager:children] +monitoring + +[prometheus-openstack-exporter:children] +monitoring + +[prometheus-elasticsearch-exporter:children] +opensearch + +[prometheus-blackbox-exporter:children] +monitoring + +[prometheus-libvirt-exporter:children] +compute + +[masakari-api:children] +control + +[masakari-engine:children] +control + +[masakari-hostmonitor:children] +control + +[masakari-instancemonitor:children] +compute + +[ovn-controller:children] +ovn-controller-compute +ovn-controller-network + +[ovn-controller-compute:children] +compute + +[ovn-controller-network:children] +network + +[ovn-database:children] +control + +[ovn-northd:children] +ovn-database + +[ovn-nb-db:children] +ovn-database + +[ovn-sb-db:children] +ovn-database + +[ovn-sb-db-relay:children] +ovn-database + +[letsencrypt-webserver:children] +letsencrypt + +[letsencrypt-lego:children] +letsencrypt diff --git a/kolla/globals.yml b/kolla/globals.yml new file mode 100644 index 0000000..98363ab --- /dev/null +++ b/kolla/globals.yml @@ -0,0 +1,53 @@ +--- +# Configuration Kolla-Ansible 2025.2 (Flamingo) — Syllabus, serveur tout-en-un. +# Noms d'options vérifiés dans etc/kolla/globals.yml de la branche stable/2025.2. +# Aucun secret ici : les mots de passe sont dans /etc/kolla/passwords.yml, +# uniquement sur le serveur (chmod 600, jamais dans Git). + +workaround_ansible_issue_8743: yes + +# Images : Debian bookworm (tag quay.io « 2025.2-debian-bookworm », vérifié). +kolla_base_distro: "debian" +openstack_release: "2025.2" + +# Réseau (voir étape 4 et docs/journal.md) : +# - dummy0 (10.10.0.1) porte toutes les API et services internes : rien sur eno1. +# - veth-ext-ovs est le bout de la paire veth donné à Neutron comme réseau externe. +network_interface: "dummy0" +neutron_external_interface: "veth-ext-ovs" +kolla_internal_vip_address: "10.10.0.1" + +# Un seul nœud : pas de VIP flottante, donc ni HAProxy ni keepalived. +enable_haproxy: "no" +enable_keepalived: "no" +# ProxySQL écoute sur la VIP:3306. Sans HAProxy, la VIP est l'IP du nœud : +# il prenait le port de MariaDB (« Address already in use », 2026-10-07). +enable_proxysql: "no" + +# Neutron avec OVN (choix de CLAUDE.md, section 3). +neutron_plugin_agent: "ovn" + +# Services. +enable_horizon: "no" # pas d'interface web OpenStack : le portail Syllabus la remplace +enable_heat: "yes" # chaque lab est un modèle Heat +enable_nova_serialconsole_proxy: "yes" # console élève (nova-serialproxy) +nova_compute_virt_type: "kvm" # VT-x vérifié à l'étape 1 +enable_prometheus: "yes" # supervision (étape 7) +enable_grafana: "yes" + +# Cinder désactivé pour l'instant : les deux disques sont entièrement pris par +# le RAID 1 (/), il n'y a pas de place pour un groupe de volumes LVM dédié. +# Les VM élèves utilisent des disques éphémères Nova. À revoir (Ceph, bloc C). +enable_cinder: "no" + +# Kolla ne doit pas toucher au pare-feu : il est géré par le rôle Ansible +# `durcissement` (nftables). Sur Debian, cette option ne ferait qu'essayer de +# désactiver ufw (absent ici), mais on la fixe explicitement. +disable_firewall: false + +# Docker (installé par bootstrap-servers) : Kolla fixe déjà iptables: false, +# mais depuis Docker 27 l'IPv6 a son propre réglage, activé par défaut. Sans +# cette ligne, Docker crée des tables « ip6 nat » et « ip6 filter » dans +# nftables (constaté le 2026-10-07). Fusionné dans /etc/docker/daemon.json. +docker_custom_config: + ip6tables: false