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

240 lines
8.2 KiB
YAML
Raw Normal View History

---
- name: Resoudre l'annuaire (role partage)
ansible.builtin.include_role:
name: resoudre_annuaire
annuaire : un compte de service par consommateur, et la porte se ferme Keycloak, Dovecot, Postfix et Icinga Web 2 se liaient TOUS avec cn=admin, le compte d administration de la base. C est le rootDN : slapd lui fait contourner toutes les ACL. Un seul secret, quatre services, tous les droits sur l arbre — pour ce qui est, trois fois sur quatre, une simple lecture. Et les droits livres par Debian etaient intacts : `to * by * read`. Sur ldap://, sans s authentifier, une machine du reseau enumerait tous les comptes et toutes les adresses. Des comptes a droits mesures n auraient rien valu tant que cette ligne restait : on aurait ferme la porte en laissant la fenetre. L indice etait deja dans le depot. `validatePasswordPolicy` existe parce que slapd n applique pas ses controles de qualite au rootDN : la consequence etait compensee, la cause intacte. - ou=services, un compte par consommateur, secret propre en voute - sept regles d acces posees EN ENTIER (state: exact) : l ordre est la regle, et inserer c est parier sur ce que le paquet aura mis avant nous - amorcage_acces garde le compte d administration, NOMME comme l exception : il ne consomme pas l annuaire, il le provisionne depuis la socket locale - la sonde passe de -x a -Y EXTERNAL : elle lisait en anonyme et aurait annonce un annuaire VIDE sur un annuaire parfaitement sain - la rotation du compte d administration devient possible (elle n etait posee qu a l installation, par debconf : la voute et slapd divergeaient en silence) Quatre marches payees en chemin : 1. un cinquieme appelant oublie, dont l echec etait masque par no_log — la garde refuse desormais SANS no_log : elle nomme la cle absente, jamais son contenu 2. la federation Keycloak ne reecrivait son bindDn que si l URL ou le mode changeaient — nouveau secret, ancien nom, error code 49 3. la rotation placee APRES les taches qui se lient en administrateur 4. ansible-vault et son tube : sortie non bloquante = echec silencieux, la voute paraissait tournee et etait identique a l octet P72 exige que tout role incluant resoudre_annuaire NOMME son compte, et qu aucun sauf amorcage_acces ne nomme admin. Eprouvee dans les deux sens. Verifie sur l infrastructure : chaque compte lit ce qu il doit, aucun ne voit les autres, la lecture anonyme rend 0 entree, et les quatre services repondent (doveadm user, postmap -q, decouverte OIDC 200, portier SSO 200). vault_openldap_admin et vault_ldap_bind_postfix renouveles : les deux avaient transite en clair par une session d exploitation. Les anciennes valeurs rendent Invalid credentials (49). make prouver : 71 OK, 0 echec, 1 saute. ansible-lint : 0 failure, profil production. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-13 13:36:38 -04:00
vars:
# SON compte, pas celui de l'administrateur de l'annuaire (2026-09-13).
resoudre_annuaire_bind_cn: "postfix"
resoudre_annuaire_secret: "vault_ldap_bind_postfix"
supervision du site, et la panne qui dormait dans un mot Le site a son temoin : site-mon-01 (VLAN 36) porte PostgreSQL, Icinga et un relais. Le depot lui rapporte, et son premier verdict fut un vrai defaut — site-mon-01 n avait jamais depose son propre etat. Les trois sont au vert. serveur_backup_verification_locale repasse a true sur le depot : le drapeau ne dit plus on renonce mais verifie ce que tu peux ouvrir . La liste des noeuds attendus derive de l inventaire ou tourne le role, donc du site seul. serveur_postfix gagne un mode relais : un site n heberge aucune boite, il expedie. Directement par sa frontiere — emprunter le MTA d un locataire ferait dependre l hebergeur d un ecosysteme qu il peut outvivre. LA PANNE DE FOND : le modele de routes OPNsense lit enabled ; on lui envoyait disabled=0, un champ ignore. enabled restait a son defaut, ETEINT. Chaque route creee par Set-OPS depuis l origine l etait desactivee — invisible, parce qu une route eteinte EXISTE dans le modele et compte posee . Le rechargement lance pour activer la nouvelle patte a fait reprendre au noyau sa table depuis le modele : 14 routes sur 15 disparues, 11 machines de Chezlepro injoignables le lendemain de sa reconstruction, et le devis toujours vert. Trois corrections empilees : la cause (enabled), la cecite (le plan lit la table du NOYAU et signale absent ou eteint), l inaction (la reconfiguration ne se declenchait que sur un changement du modele). Aussi : un role du site peut enfin en appeler un autre a travers la frontiere — le devis traitait tout pair nomme comme l exterieur . Et nftables_admin_ssh se DERIVE de la carte : recopie a la main, il retardait d une zone, et m a verrouille dehors de la machine que je venais de creer. Reste ouvert : le destinataire des alertes est encore root@localhost. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
2026-09-02 17:34:01 -04:00
when: serveur_postfix_mode != "relais"
- name: Adopter la connexion annuaire pour Postfix
ansible.builtin.set_fact:
serveur_postfix_ldap_serveur: "{{ resoudre_annuaire_uri }}:{{ resoudre_annuaire_port }}"
serveur_postfix_ldap_base: "{{ resoudre_annuaire_users_dn }}"
serveur_postfix_ldap_bind_dn: "{{ resoudre_annuaire_bind_dn }}"
serveur_postfix_ldap_bind_password: "{{ resoudre_annuaire_bind_password }}"
no_log: true
supervision du site, et la panne qui dormait dans un mot Le site a son temoin : site-mon-01 (VLAN 36) porte PostgreSQL, Icinga et un relais. Le depot lui rapporte, et son premier verdict fut un vrai defaut — site-mon-01 n avait jamais depose son propre etat. Les trois sont au vert. serveur_backup_verification_locale repasse a true sur le depot : le drapeau ne dit plus on renonce mais verifie ce que tu peux ouvrir . La liste des noeuds attendus derive de l inventaire ou tourne le role, donc du site seul. serveur_postfix gagne un mode relais : un site n heberge aucune boite, il expedie. Directement par sa frontiere — emprunter le MTA d un locataire ferait dependre l hebergeur d un ecosysteme qu il peut outvivre. LA PANNE DE FOND : le modele de routes OPNsense lit enabled ; on lui envoyait disabled=0, un champ ignore. enabled restait a son defaut, ETEINT. Chaque route creee par Set-OPS depuis l origine l etait desactivee — invisible, parce qu une route eteinte EXISTE dans le modele et compte posee . Le rechargement lance pour activer la nouvelle patte a fait reprendre au noyau sa table depuis le modele : 14 routes sur 15 disparues, 11 machines de Chezlepro injoignables le lendemain de sa reconstruction, et le devis toujours vert. Trois corrections empilees : la cause (enabled), la cecite (le plan lit la table du NOYAU et signale absent ou eteint), l inaction (la reconfiguration ne se declenchait que sur un changement du modele). Aussi : un role du site peut enfin en appeler un autre a travers la frontiere — le devis traitait tout pair nomme comme l exterieur . Et nftables_admin_ssh se DERIVE de la carte : recopie a la main, il retardait d une zone, et m a verrouille dehors de la machine que je venais de creer. Reste ouvert : le destinataire des alertes est encore root@localhost. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
2026-09-02 17:34:01 -04:00
when: serveur_postfix_mode != "relais"
- name: Exiger le mot de passe de bind LDAP (Vault)
ansible.builtin.assert:
that:
- serveur_postfix_ldap_bind_password | length > 0
fail_msg: "serveur_postfix_ldap_bind_password requis (via Ansible Vault, ex. vault_openldap_admin)."
supervision du site, et la panne qui dormait dans un mot Le site a son temoin : site-mon-01 (VLAN 36) porte PostgreSQL, Icinga et un relais. Le depot lui rapporte, et son premier verdict fut un vrai defaut — site-mon-01 n avait jamais depose son propre etat. Les trois sont au vert. serveur_backup_verification_locale repasse a true sur le depot : le drapeau ne dit plus on renonce mais verifie ce que tu peux ouvrir . La liste des noeuds attendus derive de l inventaire ou tourne le role, donc du site seul. serveur_postfix gagne un mode relais : un site n heberge aucune boite, il expedie. Directement par sa frontiere — emprunter le MTA d un locataire ferait dependre l hebergeur d un ecosysteme qu il peut outvivre. LA PANNE DE FOND : le modele de routes OPNsense lit enabled ; on lui envoyait disabled=0, un champ ignore. enabled restait a son defaut, ETEINT. Chaque route creee par Set-OPS depuis l origine l etait desactivee — invisible, parce qu une route eteinte EXISTE dans le modele et compte posee . Le rechargement lance pour activer la nouvelle patte a fait reprendre au noyau sa table depuis le modele : 14 routes sur 15 disparues, 11 machines de Chezlepro injoignables le lendemain de sa reconstruction, et le devis toujours vert. Trois corrections empilees : la cause (enabled), la cecite (le plan lit la table du NOYAU et signale absent ou eteint), l inaction (la reconfiguration ne se declenchait que sur un changement du modele). Aussi : un role du site peut enfin en appeler un autre a travers la frontiere — le devis traitait tout pair nomme comme l exterieur . Et nftables_admin_ssh se DERIVE de la carte : recopie a la main, il retardait d une zone, et m a verrouille dehors de la machine que je venais de creer. Reste ouvert : le destinataire des alertes est encore root@localhost. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
2026-09-02 17:34:01 -04:00
when: serveur_postfix_mode != "relais"
- name: Exiger le nœud mail-store (remise LMTP)
ansible.builtin.assert:
that:
- serveur_postfix_mailstore_hote | length > 0
fail_msg: "serveur_postfix_mailstore_hote requis (FQDN du nœud Dovecot qui héberge les boîtes)."
supervision du site, et la panne qui dormait dans un mot Le site a son temoin : site-mon-01 (VLAN 36) porte PostgreSQL, Icinga et un relais. Le depot lui rapporte, et son premier verdict fut un vrai defaut — site-mon-01 n avait jamais depose son propre etat. Les trois sont au vert. serveur_backup_verification_locale repasse a true sur le depot : le drapeau ne dit plus on renonce mais verifie ce que tu peux ouvrir . La liste des noeuds attendus derive de l inventaire ou tourne le role, donc du site seul. serveur_postfix gagne un mode relais : un site n heberge aucune boite, il expedie. Directement par sa frontiere — emprunter le MTA d un locataire ferait dependre l hebergeur d un ecosysteme qu il peut outvivre. LA PANNE DE FOND : le modele de routes OPNsense lit enabled ; on lui envoyait disabled=0, un champ ignore. enabled restait a son defaut, ETEINT. Chaque route creee par Set-OPS depuis l origine l etait desactivee — invisible, parce qu une route eteinte EXISTE dans le modele et compte posee . Le rechargement lance pour activer la nouvelle patte a fait reprendre au noyau sa table depuis le modele : 14 routes sur 15 disparues, 11 machines de Chezlepro injoignables le lendemain de sa reconstruction, et le devis toujours vert. Trois corrections empilees : la cause (enabled), la cecite (le plan lit la table du NOYAU et signale absent ou eteint), l inaction (la reconfiguration ne se declenchait que sur un changement du modele). Aussi : un role du site peut enfin en appeler un autre a travers la frontiere — le devis traitait tout pair nomme comme l exterieur . Et nftables_admin_ssh se DERIVE de la carte : recopie a la main, il retardait d une zone, et m a verrouille dehors de la machine que je venais de creer. Reste ouvert : le destinataire des alertes est encore root@localhost. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
2026-09-02 17:34:01 -04:00
when: serveur_postfix_mode != "relais"
- name: Installer debconf-utils (requis par le module debconf)
ansible.builtin.apt:
name: debconf-utils
state: present
update_cache: true
cache_valid_time: 3600
- name: Préconfigurer Postfix (debconf, installation non interactive)
ansible.builtin.debconf:
name: postfix
question: "{{ item.question }}"
vtype: "{{ item.vtype }}"
value: "{{ item.value }}"
loop:
- { question: "postfix/main_mailer_type", vtype: "select", value: "Internet Site" }
- { question: "postfix/mailname", vtype: "string", value: "{{ serveur_postfix_domaine }}" }
loop_control:
label: "{{ item.question }}"
- name: Installer Postfix
ansible.builtin.apt:
name: "{{ serveur_postfix_paquets }}"
state: present
update_cache: true
- name: Assurer le répertoire etc du chroot Postfix
ansible.builtin.file:
path: /var/spool/postfix/etc
state: directory
owner: root
group: root
mode: "0755"
- name: Fournir la résolution de noms au chroot Postfix (plancher /etc/hosts)
ansible.builtin.copy:
src: "{{ item }}"
dest: "/var/spool/postfix{{ item }}"
remote_src: true
owner: root
group: root
mode: "0644"
loop:
- /etc/hosts
- /etc/resolv.conf
- /etc/nsswitch.conf
- /etc/services
notify: Recharger postfix
# --- Pont de certificat step_ca (déposé par client_pki) ---
- name: TLS — créer le répertoire des certificats
ansible.builtin.file:
path: "{{ serveur_postfix_tls_dir }}"
state: directory
owner: root
group: root
mode: "0755"
when: serveur_postfix_tls_actif | bool
- name: TLS — déployer le script de synchronisation du certificat
ansible.builtin.template:
src: setops-postfix-cert-sync.sh.j2
dest: /usr/local/sbin/setops-postfix-cert-sync
owner: root
group: root
mode: "0755"
when: serveur_postfix_tls_actif | bool
- name: TLS — déployer les unités de synchronisation (service + path)
ansible.builtin.template:
src: "{{ item.s }}"
dest: "{{ item.d }}"
owner: root
group: root
mode: "0644"
loop:
- { s: "setops-postfix-cert-sync.service.j2", d: "/etc/systemd/system/setops-postfix-cert-sync.service" }
- { s: "setops-postfix-cert-sync.path.j2", d: "/etc/systemd/system/setops-postfix-cert-sync.path" }
loop_control:
label: "{{ item.d | basename }}"
when: serveur_postfix_tls_actif | bool
- name: TLS — synchroniser le certificat maintenant
ansible.builtin.command: /usr/local/sbin/setops-postfix-cert-sync
changed_when: false
when:
- serveur_postfix_tls_actif | bool
- not ansible_check_mode
- name: TLS — activer la surveillance du certificat (renouvellement)
ansible.builtin.systemd:
name: setops-postfix-cert-sync.path
enabled: true
state: started
daemon_reload: true
when:
- serveur_postfix_tls_actif | bool
- not ansible_check_mode
- name: TLS — vérifier que le certificat est en place
ansible.builtin.stat:
path: "{{ serveur_postfix_tls_dir }}/cert.pem"
register: serveur_postfix_cert
when: serveur_postfix_tls_actif | bool
- name: TLS — exiger le certificat (intégration client_pki requise sur ce nœud)
ansible.builtin.assert:
that:
- serveur_postfix_cert.stat.exists | default(false)
fail_msg: >-
Aucun certificat step_ca ({{ serveur_postfix_tls_source_cert }}). Le nœud Postfix doit
porter l'intégration client_pki. Déploie-la, puis relance.
when:
- serveur_postfix_tls_actif | bool
- not ansible_check_mode
# --- Configuration ---
- name: Déployer la carte LDAP des boîtes
ansible.builtin.template:
src: ldap-mailboxes.cf.j2
dest: /etc/postfix/ldap-mailboxes.cf
owner: root
group: postfix
mode: "0640"
no_log: true # contient le mot de passe de bind LDAP
notify: Recharger postfix
flux + postfix : un port symbolique dans le pare-feu, un rechargement qui n applique rien Le deploiement depuis ops-01 passe de 3 plays a 21 : douze machines sur quinze deployees completement. Deux defauts restaient. UN PORT SYMBOLIQUE ECRIT TEL QUEL. /etc/nftables.conf:36: Could not resolve service: Servname not supported ip saddr { ... } udp dport derive accept # serveur_powerdns `port: derive` dit que le port depend du deploiement. Le devis de la frontiere le resout depuis le 2026-08-25 ; le generateur nftables ecrivait le mot, et nft refusait TOUT le fichier. Il resout desormais par le plan et n emet rien quand il ne peut pas, en le DISANT — un flux tu en silence est une porte qu on croit ouverte. Verifie que ca ne ferme rien : infra-dns-01 garde son 53 par serveur_resolveur, et l omission de PowerDNS est juste puisqu il ecoute en loopback derriere lui. LA VALIDATION NE POSE PAS LA MEME QUESTION QUE L EMISSION. Ma premiere garde refusait tout port non numerique et a fait echouer P09, qui valide les roles HORS instance — la ou derive est legitime. PORTS_SYMBOLIQUES nomme le vocabulaire : le mot passe a la validation, jamais dans un fichier, et un mot inconnu reste refuse des deux cotes. RECHARGER N APPLIQUE PAS UN CHANGEMENT D ECOUTE, deuxieme fois. warning: to change inet_protocols, stop and start Postfix fatal: :::submission: Address family for hostname not supported main.cf porte inet_protocols, que Postfix refuse de changer a chaud. Le master garde all, tente d ouvrir :::submission en IPv6 et meurt — APRES avoir accepte une configuration valide. postfix check ne dit rien parce que la configuration EST valide : c est la transition qui ne l est pas. Meme famille que nginx. main.cf notifie desormais le redemarrage. Diagnostic corrige en chemin : j ai d abord accuse postfix@-.service, dont l assertion echouait — c est moi qui l avais declenche par un demarrage manuel, postfix.service le declare en Conflicts. make verifier : vert. make prouver : CONFORME, 55 OK, 0 echec, 0 saute. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
2026-08-30 13:00:54 -04:00
# REDEMARRER, PAS RECHARGER — ET POSTFIX LE DIT LUI-MEME (2026-08-30).
#
# `main.cf` porte `inet_protocols`, et ce parametre-la ne se change PAS a chaud. Sur une
# machine nee en `all` et passee en `ipv4`, le rechargement rend :
#
# warning: ignoring inet_protocols parameter value change
# warning: to change inet_protocols, stop and start Postfix
# fatal: :::submission: Address family for hostname not supported
#
# Le `master` garde donc son ancienne valeur, tente d'ouvrir `:::submission` en IPv6, et
# meurt. Le service tombe en `failed` APRES avoir accepte une configuration valide —
# `postfix check` ne dit rien, parce que la configuration EST valide ; c'est la
# transition qui ne l'est pas.
#
# MEME FAMILLE QUE `nginx-restart-si-changement-d-ecoute` : un rechargement ne reapplique
# pas un changement d'ECOUTE. Ce qui vit dans le processus maitre — protocoles, adresses,
# ports — exige qu'il reparte.
#
# On redemarre donc sur tout changement de `main.cf`. C'est plus large que le seul
# `inet_protocols`, et c'est voulu : distinguer ligne par ligne ce qui se recharge de ce
# qui se redemarre demanderait de tenir a jour une liste que Postfix ne publie pas.
supervision du site, et la panne qui dormait dans un mot Le site a son temoin : site-mon-01 (VLAN 36) porte PostgreSQL, Icinga et un relais. Le depot lui rapporte, et son premier verdict fut un vrai defaut — site-mon-01 n avait jamais depose son propre etat. Les trois sont au vert. serveur_backup_verification_locale repasse a true sur le depot : le drapeau ne dit plus on renonce mais verifie ce que tu peux ouvrir . La liste des noeuds attendus derive de l inventaire ou tourne le role, donc du site seul. serveur_postfix gagne un mode relais : un site n heberge aucune boite, il expedie. Directement par sa frontiere — emprunter le MTA d un locataire ferait dependre l hebergeur d un ecosysteme qu il peut outvivre. LA PANNE DE FOND : le modele de routes OPNsense lit enabled ; on lui envoyait disabled=0, un champ ignore. enabled restait a son defaut, ETEINT. Chaque route creee par Set-OPS depuis l origine l etait desactivee — invisible, parce qu une route eteinte EXISTE dans le modele et compte posee . Le rechargement lance pour activer la nouvelle patte a fait reprendre au noyau sa table depuis le modele : 14 routes sur 15 disparues, 11 machines de Chezlepro injoignables le lendemain de sa reconstruction, et le devis toujours vert. Trois corrections empilees : la cause (enabled), la cecite (le plan lit la table du NOYAU et signale absent ou eteint), l inaction (la reconfiguration ne se declenchait que sur un changement du modele). Aussi : un role du site peut enfin en appeler un autre a travers la frontiere — le devis traitait tout pair nomme comme l exterieur . Et nftables_admin_ssh se DERIVE de la carte : recopie a la main, il retardait d une zone, et m a verrouille dehors de la machine que je venais de creer. Reste ouvert : le destinataire des alertes est encore root@localhost. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
2026-09-02 17:34:01 -04:00
when: serveur_postfix_mode != "relais"
- name: Déployer main.cf
ansible.builtin.template:
src: main.cf.j2
dest: /etc/postfix/main.cf
owner: root
group: root
mode: "0644"
flux + postfix : un port symbolique dans le pare-feu, un rechargement qui n applique rien Le deploiement depuis ops-01 passe de 3 plays a 21 : douze machines sur quinze deployees completement. Deux defauts restaient. UN PORT SYMBOLIQUE ECRIT TEL QUEL. /etc/nftables.conf:36: Could not resolve service: Servname not supported ip saddr { ... } udp dport derive accept # serveur_powerdns `port: derive` dit que le port depend du deploiement. Le devis de la frontiere le resout depuis le 2026-08-25 ; le generateur nftables ecrivait le mot, et nft refusait TOUT le fichier. Il resout desormais par le plan et n emet rien quand il ne peut pas, en le DISANT — un flux tu en silence est une porte qu on croit ouverte. Verifie que ca ne ferme rien : infra-dns-01 garde son 53 par serveur_resolveur, et l omission de PowerDNS est juste puisqu il ecoute en loopback derriere lui. LA VALIDATION NE POSE PAS LA MEME QUESTION QUE L EMISSION. Ma premiere garde refusait tout port non numerique et a fait echouer P09, qui valide les roles HORS instance — la ou derive est legitime. PORTS_SYMBOLIQUES nomme le vocabulaire : le mot passe a la validation, jamais dans un fichier, et un mot inconnu reste refuse des deux cotes. RECHARGER N APPLIQUE PAS UN CHANGEMENT D ECOUTE, deuxieme fois. warning: to change inet_protocols, stop and start Postfix fatal: :::submission: Address family for hostname not supported main.cf porte inet_protocols, que Postfix refuse de changer a chaud. Le master garde all, tente d ouvrir :::submission en IPv6 et meurt — APRES avoir accepte une configuration valide. postfix check ne dit rien parce que la configuration EST valide : c est la transition qui ne l est pas. Meme famille que nginx. main.cf notifie desormais le redemarrage. Diagnostic corrige en chemin : j ai d abord accuse postfix@-.service, dont l assertion echouait — c est moi qui l avais declenche par un demarrage manuel, postfix.service le declare en Conflicts. make verifier : vert. make prouver : CONFORME, 55 OK, 0 echec, 0 saute. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
2026-08-30 13:00:54 -04:00
notify: Redémarrer postfix
- name: Activer la soumission :587 (clients authentifiés, SASL Dovecot distant)
ansible.builtin.blockinfile:
path: /etc/postfix/master.cf
marker: "# {mark} SETOPS SUBMISSION 587"
block: |
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=inet:{{ serveur_postfix_sasl_hote }}:{{ serveur_postfix_sasl_port }}
-o smtpd_sasl_security_options=noanonymous
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
when: serveur_postfix_submission_actif | bool
notify: Redémarrer postfix
- name: Valider la configuration Postfix
ansible.builtin.command: postfix check
changed_when: false
when: not ansible_check_mode
- name: Activer et démarrer Postfix
when: not ansible_check_mode
ansible.builtin.systemd:
name: "{{ serveur_postfix_service }}"
enabled: true
state: started
daemon_reload: true
sondes : quatorze, une par role, derivees en objets Icinga boites (dovecot) · cache-apt (artefacts) · certificat (client_pki, 14/14) collaboration (nextcloud) · collecte (prometheus) · file-courriel (postfix) forge (forgejo) · identite (keycloak) · ingestion (loki) · moteur (icinga) resolution (resolveur) · runner (serveur_ops) · tableaux (grafana) voute (ops_tenant) — toutes vertes, sans une ligne ecrite dans Icinga. DEUX PRINCIPES QUE LA PREMIERE SONDE A IMPOSES. Une sonde doit pouvoir etre mise en defaut PAR PARAMETRE : cible et seuils sont des variables du role, on prouve le rouge avec un port ferme ou un seuil impossible, sans rien casser. Et la sonde vit LA OU VIT LA VERITE : « ce noeud est-il collecte ? » appartient a prometheus, pas au client — une seule y voit les N noeuds, et surtout elle voit le cas SILENCIEUX. ON DEMANDE AU SERVICE CE QU IL PENSE DE LUI-MEME quand il sait le dire (healthz, /ready, status.php, decouverte OIDC). Quand il ne sait pas, on va chercher la verite de terrain : « moteur » ne regarde ni le service ni le port, il demande a la base depuis combien de temps elle n a pas ete rafraichie — la lecon des sauvegardes appliquee a la supervision. QUATRE FOIS J AI ECRIT LA SONDE AVANT DE MESURER, QUATRE FOIS ELLE A EU TORT. La forge : port et chemin des depots inventes, elle ecoute en 3000 derriere l edge et n a legitimement aucun depot. Loki : « panne persistante » conclue sur deux lectures a quelques secondes d intervalle juste apres un redemarrage — deux mesures rapprochees ne distinguent pas un etat d un instant. Keycloak : vise en 8443, il ecoute en 8080. Le runner : git en root refuse un depot d un autre proprietaire. A chaque fois le remede est le meme — lire la verite du role, ne pas la supposer. Et le meme piege Jinja qu avec client_sante : ${#tableau[@]} contient {#. Le remede etait deja au depot ; je l ai reecrit au lieu de le chercher. RESTE : client_smtp, client_artefacts, client_journal, icingaweb2 et ops_site. Ce sont des chemins de report, dont la panne se voit deja par le silence des sondes qu ils portent. make prouver : CONFORME, 64 OK, 0 echec, 0 saute (P64 : 14 sondes). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-10 03:00:21 -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 « file-courriel »
ansible.builtin.template:
src: sonde-file-courriel.sh.j2
dest: /usr/local/lib/setops/sondes/file-courriel.sh
owner: root
group: root
mode: "0750"