L'application porte tous ses liens (groupe=capacite, hote=VM, port, requiert, expose). L'exposition DNS quitte docs/domaines.yml et vit sur l'application via 'expose' ; domaines.yml ne decrit plus que les zones. - inventory_rules : expositions_des_applications + domaine_parent ; valider_applications valide requiert / expose / port. - serveurs_nginx derive ses vhosts des applications (expose + edge), resolvant application -> hote -> IP (role + template reecrits). - filter plugin : expose la nouvelle regle a Ansible. - CLI : applications.py --port/--requiert/--expose ; domaines.py affiche les expositions derivees des applications. - GUI : champs Port/Requiert/Expose sur la fiche Application (persistes ; corrige la perte de champs a la sauvegarde) ; l'API expose les domaines. Le groupe n'est plus une cible de liaison, seulement une capacite. Renommage nomenclature.domaines -> fonctions : Phase 1b. Generation de l'inventaire depuis le plan : Phase 3. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
46 lines
1.6 KiB
Django/Jinja
46 lines
1.6 KiB
Django/Jinja
# Vhosts derives des applications (champ 'expose' de docs/applications.yml,
|
|
# edge depuis docs/domaines.yml) — gere par Set-OPS (role serveurs_nginx).
|
|
# Ne pas editer a la main.
|
|
#
|
|
# Un FQDN expose produit un vhost si l'hote de l'application est resolvable :
|
|
# amont = http://<IP interne de l'hote de l'application>:<port>. Une exposition
|
|
# non resolvable (application sans hote actif, ou sans port) est listee mais
|
|
# NON publiee (binding declare, pas encore cablable).
|
|
{% for expo in serveurs_nginx_expositions | default([]) %}
|
|
{% set ns = namespace(amont='') %}
|
|
{% if expo.hote in hostvars and hostvars[expo.hote].ansible_host is defined and expo.port %}
|
|
{% set ns.amont = 'http://' ~ hostvars[expo.hote].ansible_host ~ ':' ~ expo.port %}
|
|
{% endif %}
|
|
{% if ns.amont %}
|
|
|
|
# {{ expo.fqdn }} -> application {{ expo.application }} sur {{ expo.hote }} ({{ ns.amont }})
|
|
{% if serveurs_nginx_redirection_http | bool %}
|
|
server {
|
|
listen 80;
|
|
listen [::]:80;
|
|
server_name {{ expo.fqdn }};
|
|
return 301 https://$host$request_uri;
|
|
}
|
|
{% endif %}
|
|
server {
|
|
listen 443 ssl;
|
|
listen [::]:443 ssl;
|
|
http2 on;
|
|
server_name {{ expo.fqdn }};
|
|
|
|
ssl_certificate {{ serveurs_nginx_certificat }};
|
|
ssl_certificate_key {{ serveurs_nginx_cle }};
|
|
|
|
location / {
|
|
proxy_pass {{ ns.amont }};
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
}
|
|
}
|
|
{% else %}
|
|
|
|
# (non publie) {{ expo.fqdn }} -> application {{ expo.application }} : amont non resolvable (hote sans IP active ou sans port).
|
|
{% endif %}
|
|
{% endfor %}
|