--- # Devis des expositions web — RELEVE seul. Ne modifie rien (D-23). # # Question posee : chaque `expose:` du plan repond-il VRAIMENT ? Et si non, ou ca casse. # # UNE VRAIE REQUETE, jamais un `connect()`. A travers l'OPNsense (anti-spoofing), toute # connexion TCP reussit — y compris vers une adresse ou aucune machine n'existe. Et # « lire des donnees apres connexion » ne vaut rien en TLS, ou c'est le CLIENT qui parle # en premier : le port 443 d'un edge sain se comporte exactement comme un port mort. # Seul le code de retour d'une requete HTTPS complete tranche. # # DEUX POINTS DE VUE, et c'est la difference entre les deux qui diagnostique : # - depuis l'edge, avec `--resolve` vers 127.0.0.1 : edge + dorsal, sans la frontiere # - depuis le poste : DNS + frontiere + edge + dorsal, le chemin d'un vrai utilisateur # L'un repond et pas l'autre => ce n'est pas le service, c'est le chemin. # # make expositions-plan - name: Devis des expositions — depuis l'edge # Un seul edge suffit : le devis mesure les expositions, pas les hotes. hosts: serveur_nginx[0] become: true gather_facts: false tasks: - name: Charger le registre des applications ansible.builtin.include_vars: file: "{{ setops_plan_dir }}/applications.yml" - name: Recenser les expositions déclarées au plan ansible.builtin.set_fact: devis_expositions: >- {{ applications | dict2items | selectattr('value.expose', 'defined') | map(attribute='value.expose') | flatten | unique | sort }} - name: Interroger chaque exposition depuis l'edge (edge + dorsal, sans la frontière) ansible.builtin.uri: url: "https://{{ item }}/" ca_path: "/etc/step/certs/root_ca.crt" status_code: [200, 301, 302, 303, 307, 401, 403] follow_redirects: none timeout: 10 register: devis_expo_edge failed_when: false changed_when: false loop: "{{ devis_expositions }}" loop_control: label: "{{ item }}" # `--resolve` de curl n'existe pas dans `uri` : l'edge se resout lui-meme par le # DNS interne, ce qui est le comportement reel des services du tenant. - name: Récupérer la racine de l'AC sur le contrôleur ansible.builtin.fetch: src: /etc/step/certs/root_ca.crt dest: "{{ playbook_dir }}/../../instance/.racine-ac.crt" flat: true - name: Interroger chaque exposition depuis le poste (le chemin d'un vrai utilisateur) ansible.builtin.uri: url: "https://{{ item }}/" ca_path: "{{ playbook_dir }}/../../instance/.racine-ac.crt" status_code: [200, 301, 302, 303, 307, 401, 403] follow_redirects: none timeout: 10 register: devis_expo_poste failed_when: false changed_when: false delegate_to: localhost become: false loop: "{{ devis_expositions }}" loop_control: label: "{{ item }}" - name: Déposer le relevé sur le contrôleur ansible.builtin.copy: dest: "{{ playbook_dir }}/../../instance/devis-expositions.json" mode: "0600" content: >- {{ { 'edge': inventory_hostname, 'expositions': devis_expositions, 'depuis_edge': devis_expo_edge.results | map('combine', {}) | list | zip(devis_expositions) | list, 'poste': devis_expo_poste.results | map('combine', {}) | list | zip(devis_expositions) | list, } | to_nice_json }} delegate_to: localhost become: false