Set-OPS-Public/roles/serveur_nginx/tasks/main.yml

175 lines
6.2 KiB
YAML
Raw Normal View History

---
- name: Installer nginx
ansible.builtin.apt:
name: "{{ serveur_nginx_packages }}"
state: present
update_cache: true
cache_valid_time: 3600
# Debian 13 fournit « server_tokens off; » actif dans nginx.conf. Notre drop-in
# 99-setops.conf le redeclare -> nginx -t echoue (« directive is duplicate »).
# On neutralise la ligne distro pour que 99-setops.conf soit l'unique source.
- name: Neutraliser le server_tokens par defaut de Debian
ansible.builtin.replace:
path: /etc/nginx/nginx.conf
regexp: '^(\s*)server_tokens\s+\S+;'
replace: '\1# server_tokens gere par Set-OPS (conf.d/99-setops.conf)'
notify: Valider et recharger nginx
# MEME CAS POUR `ssl_protocols` (2026-10-03), mais sans echec : nginx ACCEPTE la directive
# deux fois au meme niveau, ajoute les valeurs, et avertit a chaque rechargement —
# `duplicate value "TLSv1.3" in /etc/nginx/conf.d/99-setops.conf:3`, releve dans le journal
# de `site-edge-01`. Un avertissement repete est un avertissement qu'on cesse de lire ; et
# la politique TLS doit avoir UNE source, la notre.
- name: Neutraliser le ssl_protocols par defaut de Debian
ansible.builtin.replace:
path: /etc/nginx/nginx.conf
regexp: '^(\s*)ssl_protocols\s+[^;]+;.*$'
replace: '\1# ssl_protocols gere par Set-OPS (conf.d/99-setops.conf)'
notify: Valider et recharger nginx
- name: Deployer le durcissement de base nginx
ansible.builtin.template:
src: 99-setops.conf.j2
dest: /etc/nginx/conf.d/99-setops.conf
owner: root
group: root
mode: "0644"
notify: Valider et recharger nginx
- name: Desactiver le site Debian par defaut
ansible.builtin.file:
path: /etc/nginx/sites-enabled/default
state: absent
when: serveur_nginx_desactiver_defaut | bool
notify: Valider et recharger nginx
- name: Deployer les sites reverse proxy declares a la main
ansible.builtin.template:
src: site.conf.j2
dest: "/etc/nginx/sites-available/{{ item.nom }}.conf"
owner: root
group: root
mode: "0644"
loop: "{{ serveur_nginx_sites }}"
loop_control:
label: "{{ item.nom }}"
notify: Valider et recharger nginx
- name: Activer les sites reverse proxy declares a la main
ansible.builtin.file:
src: "/etc/nginx/sites-available/{{ item.nom }}.conf"
dest: "/etc/nginx/sites-enabled/{{ item.nom }}.conf"
state: link
loop: "{{ serveur_nginx_sites }}"
loop_control:
label: "{{ item.nom }}"
notify: Valider et recharger nginx
# --- Vhosts derives des applications (champ expose) + domaines (edge) ---
# LE REGISTRE DES DOMAINES PUBLICS EST FACULTATIF, ET IL A FALLU UN SITE POUR LE VOIR.
#
# `applications.yml` existe dans tout plan ; `domaines.yml` ne recense que les noms
# PUBLICS — ceux qu'un tenant publie a l'Internet. Un SITE n'en publie aucun : ses trois
# services web sont internes, et son plan n'a pas ce fichier.
#
# `include_vars` echouait alors sur le fichier absent, et l'edge du site ne se deployait
# pas :
#
# Could not find or access '.../SITE-Chezlepro/plan/domaines.yml'
#
# On releve donc d'abord ce qui EXISTE, puis on charge. Un registre absent laisse
# `domaines_publics` indefini, et `expositions_des_applications` le traite deja comme
# vide — la suite du role n'a pas besoin d'etre touchee.
- name: Quels registres du plan existent vraiment ?
ansible.builtin.stat:
path: "{{ item }}"
loop:
- "{{ setops_plan_dir }}/applications.yml"
- "{{ setops_plan_dir }}/domaines.yml"
delegate_to: localhost
become: false
register: serveur_nginx_registres
when: serveur_nginx_publier_expositions | bool
- name: Charger les registres applications et domaines
ansible.builtin.include_vars:
file: "{{ item.item }}"
loop: "{{ serveur_nginx_registres.results | default([]) }}"
loop_control:
label: "{{ item.item | basename }}"
when:
- serveur_nginx_publier_expositions | bool
- item.stat.exists | default(false)
- name: Lister les expositions destinees a cet edge
ansible.builtin.set_fact:
serveur_nginx_expositions: >-
{{ {'applications': applications | default({})}
| expositions_des_applications({'domaines_publics': domaines_publics | default({})}, serveur_nginx_groupe) }}
when: serveur_nginx_publier_expositions | bool
- name: Deployer les vhosts derives des expositions web
ansible.builtin.template:
src: expositions.conf.j2
dest: /etc/nginx/sites-available/expositions.conf
owner: root
group: root
mode: "0644"
when: serveur_nginx_publier_expositions | bool
notify: Valider et recharger nginx
- name: Activer les vhosts derives des expositions web
ansible.builtin.file:
src: /etc/nginx/sites-available/expositions.conf
dest: /etc/nginx/sites-enabled/expositions.conf
state: link
when: serveur_nginx_publier_expositions | bool
notify: Valider et recharger nginx
# LE SERVEUR PAR DEFAUT (2026-09-28) : un nom que l'edge ne publie pas n'obtient rien.
# Prefixe `000-` : lu avant les autres, sans que l'ordre importe (`default_server` decide).
- name: Deployer le serveur par defaut de Set-OPS
ansible.builtin.template:
src: defaut.conf.j2
dest: /etc/nginx/sites-available/000-defaut.conf
owner: root
group: root
mode: "0644"
when: serveur_nginx_serveur_defaut | bool
notify: Valider et recharger nginx
- name: Activer le serveur par defaut de Set-OPS
ansible.builtin.file:
src: /etc/nginx/sites-available/000-defaut.conf
dest: /etc/nginx/sites-enabled/000-defaut.conf
state: link
when: serveur_nginx_serveur_defaut | bool
notify: Valider et recharger nginx
- name: Activer et demarrer nginx
when: not ansible_check_mode
ansible.builtin.systemd:
name: "{{ serveur_nginx_service_name }}"
enabled: true
state: started
sondes : les cinq qui manquaient le plus (autorite, base, annuaire, zones, edge) CORRECTION DE COMPTE D ABORD. J avais annonce cinq groupes sans sonde. La mesure en donne VINGT-SEPT : j avais compte ceux que j avais en tete, pas ceux que le depot contient. Il en reste vingt-deux. LES CINQ, PAR ORDRE DE DEGAT SILENCIEUX. autorite (step_ca) — la plus urgente : nos certificats vivent 24 h, une AC muette ne casse rien aujourd hui et casse TOUT demain, d un coup, sur les 21 machines. Elle surveille aussi l expiration de la RACINE, que personne ne regarde parce qu elle vit des annees (relevee a 3642 jours). base (postgresql) — une VRAIE requete, pas pg_isready : celui-ci dit que le port repond, pas que la base sert. Plus le compte des connexions : a saturation, chaque application tombe sans que la base ait l air morte. annuaire (openldap) — elle COMPTE les entrees. Un annuaire vide repond success a tout : le mensonge des sauvegardes vides, vert et sans contenu. zones (powerdns) — un autoritatif sans zone repond NXDOMAIN a tout, ce qui se lit comme « ce nom n existe pas ». edge (nginx) — elle valide la configuration SUR DISQUE : nginx sert la derniere valide, et une configuration cassee ne se voit qu au prochain demarrage, souvent des mois plus tard. Les cinq eprouvees vertes sur le sain puis rouges PAR PARAMETRE, sans toucher a un service. Etat : 20 sondes sur 19 roles, 23 services distincts, 70 instances, 67 au vert. Les trois autres sont connues : deux sauvegardes sans donnee a emporter, et Loki en delai de stabilisation apres redeploiement. make prouver : CONFORME, 64 OK, 0 echec, 0 saute. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-10 03:47:03 -04:00
# --- Sonde de supervision (docs/supervision-conception.md) --------------------------
# Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la
# fait tourner et pousse le verdict, sans savoir ce qu'elle mesure.
- name: Assurer le repertoire des sondes de supervision
ansible.builtin.file:
path: /usr/local/lib/setops/sondes
state: directory
owner: root
group: root
mode: "0755"
- name: Deposer la sonde « edge »
ansible.builtin.template:
src: sonde-edge.sh.j2
dest: /usr/local/lib/setops/sondes/edge.sh
owner: root
group: root
mode: "0750"