Set-OPS-Public/playbooks/maintenance/devis-expositions.yml

90 lines
3.5 KiB
YAML
Raw Normal View History

---
# 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