Set-OPS-Public/roles/serveur_nginx/tasks/main.yml
Daniel Allaire f11bb11ad7 vigie : sa base dans tous les modes ; trois restes du site corrigés
- serveur_icingaweb2 : base de console résolue et utilisée en SSO comme en db
  (config_backend db) ; le badge de migrations la réclame sans condition
- serveur_icingaweb2 : php8.4-fpm et nginx avant les paquets tiers ; apache2
  retiré s'il part seul (apt-get -s purge)
- serveur_nginx : ssl_protocols de Debian neutralisé (doublon à chaque reload)
- site_inventaire : les hyperviseurs ne reçoivent plus le cache du site ni ses
  amorçages, qu'ils n'atteignent pas
- exemple de voûte : vault_bd_icingaweb2 dans tous les modes ; CHANGELOG 64

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 21:04:51 -04:00

174 lines
6.2 KiB
YAML

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