diff --git a/ansible/roles/kolla/tasks/corrections.yml b/ansible/roles/kolla/tasks/corrections.yml new file mode 100644 index 0000000..f8183a2 --- /dev/null +++ b/ansible/roles/kolla/tasks/corrections.yml @@ -0,0 +1,53 @@ +--- +# Corrections à des comportements par défaut de Kolla-Ansible non adaptés à un +# nœud unique, appliquées après le déploiement (voir docs/journal.md, +# étape 5 : correctifs ProxySQL, Docker ip6tables). Ignorées si OpenStack n'a +# pas encore été déployé (conteneurs OVN absents). + +- name: vérifier que les bases OVN sont déployées + ansible.builtin.command: docker inspect ovn_nb_db + register: kolla_ovn_nb_db_existe + changed_when: false + failed_when: false + +# Les bases OVN (ovn-nb-db, ovn-sb-db) sont codées en dur pour écouter sur +# 0.0.0.0:6641/6642 (ansible/roles/ovn-db/tasks/bootstrap-db.yml de Kolla, +# ligne « set-connection ptcp:{{ port }}:0.0.0.0 »), contrairement aux ports de +# cluster (6643/6644) qui respectent déjà api_interface_address (dummy0). Le +# pare-feu bloque ces ports depuis Internet, mais on les restreint quand même +# à l'interface interne (défense en profondeur). +- name: déterminer l'adresse interne (dummy0) + ansible.builtin.set_fact: + kolla_adresse_interne: "{{ (reseau_dummy_ip | default('10.10.0.1/24')).split('/')[0] }}" + +- name: lire l'adresse d'écoute actuelle d'OVN NB + when: kolla_ovn_nb_db_existe.rc == 0 + ansible.builtin.command: + cmd: docker exec ovn_nb_db ovn-nbctl --db=unix:/run/ovn/ovnnb_db.sock get-connection + register: kolla_ovn_nb_connection + changed_when: false + +- name: "restreindre OVN NB (6641) à l'adresse interne" + ansible.builtin.command: + cmd: > + docker exec ovn_nb_db ovn-nbctl --db=unix:/run/ovn/ovnnb_db.sock + set-connection ptcp:6641:{{ kolla_adresse_interne }} + when: + - kolla_ovn_nb_db_existe.rc == 0 + - "'0.0.0.0' in kolla_ovn_nb_connection.stdout" + +- name: lire l'adresse d'écoute actuelle d'OVN SB + when: kolla_ovn_nb_db_existe.rc == 0 + ansible.builtin.command: + cmd: docker exec ovn_sb_db ovn-sbctl --db=unix:/run/ovn/ovnsb_db.sock get-connection + register: kolla_ovn_sb_connection + changed_when: false + +- name: "restreindre OVN SB (6642) à l'adresse interne" + ansible.builtin.command: + cmd: > + docker exec ovn_sb_db ovn-sbctl --db=unix:/run/ovn/ovnsb_db.sock + set-connection ptcp:6642:{{ kolla_adresse_interne }} + when: + - kolla_ovn_nb_db_existe.rc == 0 + - "'0.0.0.0' in kolla_ovn_sb_connection.stdout" diff --git a/ansible/roles/kolla/tasks/main.yml b/ansible/roles/kolla/tasks/main.yml index c28fe93..7aa2349 100644 --- a/ansible/roles/kolla/tasks/main.yml +++ b/ansible/roles/kolla/tasks/main.yml @@ -118,3 +118,7 @@ PATH: "{{ kolla_venv }}/bin:{{ ansible_env.PATH }}" register: kolla_install_deps changed_when: "'Installing' in kolla_install_deps.stdout" + +- name: appliquer les correctifs post-déploiement + ansible.builtin.import_tasks: corrections.yml + tags: [corrections] diff --git a/docs/journal.md b/docs/journal.md index f2ba406..35eb949 100644 --- a/docs/journal.md +++ b/docs/journal.md @@ -179,9 +179,16 @@ OpenStack a besoin de deux réseaux en plus de l'accès public : un réseau inte **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). +- ~~Les bases OVN (`ovsdb-server`, 6641/6642) écoutent sur `0.0.0.0`~~ corrigé le 2026-10-07 (voir plus bas). - Kolla est installé depuis une branche, pas un tag : figer la version pour la reproductibilité (ADR 0001). +**Correctifs du 2026-10-07 (suite), demandés par Adam** + +- Volume Docker résiduel `proxysql_socket` supprimé (accord d'Adam), après `proxysql_socket` lui-même supprimé lors du correctif ProxySQL. +- **Écoute OVN restreinte à `10.10.0.1`.** Cause : `ansible/roles/ovn-db/tasks/bootstrap-db.yml` de Kolla fait `ovn-nbctl/ovn-sbctl set-connection ptcp:PORT:0.0.0.0` en dur à la création des bases, sans tenir compte de `api_interface`. Les ports de cluster (6643/6644) ne sont pas concernés : ils respectent déjà `api_interface_address`. Le pare-feu bloquait déjà ces ports depuis Internet (vérifié à l'étape 5), donc pas de faille réelle, mais la bonne pratique de défense en profondeur ne coûte rien à appliquer. + - Correctif codé dans `ansible/roles/kolla/tasks/corrections.yml` (idempotent : relit l'écoute actuelle avant de la changer, ignoré si OpenStack n'est pas encore déployé), importé à la fin de `ansible/roles/kolla/tasks/main.yml`, tag `corrections`. + - Vérifié : `ss -tlnp` montre les 4 ports OVN (6641-6644) sur `10.10.0.1` uniquement ; un second passage du playbook ne rapporte aucun changement (idempotence confirmée) ; les agents OVN et les services Nova restent `up` après coup. + **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.