From ca0f95da28e61fd1647dfdb9ff34078ae85e97c3 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Tue, 23 Jun 2026 23:18:52 -0400 Subject: [PATCH] Mettre les noms de roles et playbooks au singulier serveurs_* -> serveur_, clients_ -> client_, suffixes pluriels au singulier (serveur_web_dorsal/frontal, client_metrique, client_journal). Renommage par tokens exacts : repertoires de roles, playbooks de groupes, group_vars, variables internes des roles (serveur_nginx_*, conformite ansible-lint), groupes du plan, constantes de code, docs. Faux-amis preserves (serveurs_bd, scripts/serveurs.py, fonctions Python). Groupes d'etat gardes au pluriel (hotes_actifs/planifies, modeles_vm). Valide : ansible-lint 0 echec (0 var-naming), diff vide de la generation, node --check, tous les registres. Ajout de .ansible-lint excluant docs/ (registres de donnees, pas du contenu Ansible). Co-Authored-By: Claude Opus 4.8 --- .ansible-lint | 5 + AGENTS.md | 34 ++-- CHANGELOG.md | 1 + Makefile | 16 +- README.md | 8 +- docs/applications.yml | 36 ++-- docs/architecture-set-ops.md | 4 +- docs/bases-donnees.yml | 8 +- docs/catalogue-services.md | 118 ++++++------- docs/dependances-groupes.yml | 66 ++++---- docs/dns-interne.md | 22 +-- docs/domaines.yml | 4 +- docs/nomenclature-vm.md | 28 ++-- docs/plan-et-generation.md | 6 +- docs/procedure-template-debian13-proxmox.md | 2 +- docs/serveurs.yml | 6 +- docs/vm-lifecycle.md | 26 +-- inventories/lab/hosts.yml | 8 +- inventories/production/group_vars/all.yml | 2 +- .../{clients_dns.yml => client_dns.yml} | 10 +- .../production/group_vars/client_ldap.yml | 8 + .../production/group_vars/client_pki.yml | 11 ++ .../production/group_vars/client_smtp.yml | 5 + .../production/group_vars/clients_ldap.yml | 8 - .../production/group_vars/clients_pki.yml | 10 +- .../production/group_vars/clients_smtp.yml | 5 - ...serveurs_debian.yml => serveur_debian.yml} | 0 .../production/group_vars/serveur_forgejo.yml | 9 + .../production/group_vars/serveur_grafana.yml | 8 + .../production/group_vars/serveur_icinga.yml | 8 + .../group_vars/serveur_keycloak.yml | 12 ++ .../production/group_vars/serveur_nginx.yml | 9 + ...eurs_openldap.yml => serveur_openldap.yml} | 8 +- ..._postgresql.yml => serveur_postgresql.yml} | 6 +- .../group_vars/serveur_powerdns.yml | 13 ++ .../production/group_vars/serveur_redis.yml | 8 + ...eurs_sendmail.yml => serveur_sendmail.yml} | 6 +- .../production/group_vars/serveur_step_ca.yml | 16 ++ .../group_vars/serveurs_forgejo.yml | 9 - .../group_vars/serveurs_grafana.yml | 8 - .../production/group_vars/serveurs_icinga.yml | 4 +- .../group_vars/serveurs_keycloak.yml | 12 +- .../production/group_vars/serveurs_nginx.yml | 2 +- .../group_vars/serveurs_powerdns.yml | 13 -- .../production/group_vars/serveurs_redis.yml | 6 +- .../group_vars/serveurs_step_ca.yml | 12 +- inventories/production/hosts.yml | 42 ++--- .../{clients_dns.yml => client_dns.yml} | 6 +- playbooks/groupes/client_journal.yml | 15 ++ .../{clients_pki.yml => client_ldap.yml} | 6 +- playbooks/groupes/client_metrique.yml | 15 ++ .../{clients_smtp.yml => client_pki.yml} | 6 +- .../{serveurs_loki.yml => client_smtp.yml} | 6 +- ...supervision.yml => client_supervision.yml} | 6 +- playbooks/groupes/clients_journaux.yml | 6 +- playbooks/groupes/clients_ldap.yml | 6 +- playbooks/groupes/serveur_collabora.yml | 10 ++ ...serveurs_debian.yml => serveur_debian.yml} | 4 +- ...{serveurs_durcis.yml => serveur_durci.yml} | 4 +- playbooks/groupes/serveur_forgejo.yml | 15 ++ playbooks/groupes/serveur_grafana.yml | 15 ++ playbooks/groupes/serveur_icinga.yml | 15 ++ ...veurs_forgejo.yml => serveur_keycloak.yml} | 6 +- playbooks/groupes/serveur_loki.yml | 15 ++ ...rs_nextcloud.yml => serveur_nextcloud.yml} | 6 +- playbooks/groupes/serveur_nginx.yml | 15 ++ playbooks/groupes/serveur_openldap.yml | 15 ++ ...s_metriques.yml => serveur_postgresql.yml} | 6 +- playbooks/groupes/serveur_powerdns.yml | 15 ++ playbooks/groupes/serveur_prometheus.yml | 15 ++ playbooks/groupes/serveur_redis.yml | 15 ++ playbooks/groupes/serveur_sendmail.yml | 15 ++ playbooks/groupes/serveur_step_ca.yml | 15 ++ ...web_dorsaux.yml => serveur_web_dorsal.yml} | 4 +- ...b_frontaux.yml => serveur_web_frontal.yml} | 6 +- playbooks/groupes/serveurs_collabora.yml | 6 +- playbooks/groupes/serveurs_grafana.yml | 6 +- playbooks/groupes/serveurs_icinga.yml | 6 +- playbooks/groupes/serveurs_keycloak.yml | 15 -- playbooks/groupes/serveurs_nginx.yml | 15 -- playbooks/groupes/serveurs_openldap.yml | 6 +- playbooks/groupes/serveurs_postgresql.yml | 6 +- playbooks/groupes/serveurs_powerdns.yml | 15 -- playbooks/groupes/serveurs_prometheus.yml | 15 -- playbooks/groupes/serveurs_redis.yml | 15 -- playbooks/groupes/serveurs_sendmail.yml | 15 -- playbooks/groupes/serveurs_step_ca.yml | 15 -- .../maintenance/verifier_hote_debian.yml | 2 +- playbooks/proxmox/README.md | 4 +- roles/{clients_dns => client_dns}/README.md | 8 +- roles/client_dns/defaults/main.yml | 9 + .../tasks/main.yml | 36 ++-- roles/client_dns/templates/resolv.conf.j2 | 8 + .../README.md | 10 +- roles/client_journal/defaults/main.yml | 15 ++ .../handlers/main.yml | 2 +- .../tasks/main.yml | 16 +- .../templates/config.alloy.j2 | 4 +- roles/{clients_ldap => client_ldap}/README.md | 20 +-- roles/client_ldap/defaults/main.yml | 24 +++ .../handlers/main.yml | 2 +- .../tasks/main.yml | 6 +- roles/client_ldap/templates/sssd.conf.j2 | 18 ++ .../README.md | 14 +- .../defaults/main.yml | 6 +- .../handlers/main.yml | 2 +- .../tasks/main.yml | 4 +- .../templates/default-node-exporter.j2 | 2 + roles/{clients_pki => client_pki}/README.md | 16 +- roles/client_pki/defaults/main.yml | 24 +++ .../handlers/main.yml | 0 .../tasks/main.yml | 40 ++--- .../templates/cert-renewer@.service.j2 | 8 +- .../templates/cert-renewer@.timer.j2 | 2 +- .../client_pki/templates/smallstep.sources.j2 | 5 + roles/{clients_smtp => client_smtp}/README.md | 18 +- roles/client_smtp/defaults/main.yml | 12 ++ .../tasks/main.yml | 2 +- roles/client_smtp/templates/msmtprc.j2 | 9 + roles/clients_dns/defaults/main.yml | 9 - roles/clients_dns/templates/resolv.conf.j2 | 8 - roles/clients_journaux/defaults/main.yml | 15 -- roles/clients_ldap/defaults/main.yml | 24 --- roles/clients_ldap/templates/sssd.conf.j2 | 18 -- .../templates/default-node-exporter.j2 | 2 - roles/clients_pki/defaults/main.yml | 24 --- .../templates/smallstep.sources.j2 | 5 - roles/clients_smtp/defaults/main.yml | 12 -- roles/clients_smtp/templates/msmtprc.j2 | 9 - .../README.md | 22 +-- roles/serveur_forgejo/defaults/main.yml | 30 ++++ .../handlers/main.yml | 2 +- .../tasks/main.yml | 74 ++++----- roles/serveur_forgejo/templates/app.ini.j2 | 34 ++++ .../templates/forgejo.service.j2 | 20 +++ .../README.md | 16 +- roles/serveur_grafana/defaults/main.yml | 22 +++ .../handlers/main.yml | 2 +- .../tasks/main.yml | 14 +- .../templates/chezlepro.conf.j2 | 5 + .../templates/datasources.yaml.j2 | 13 ++ .../README.md | 8 +- .../defaults/main.yml | 24 +-- .../handlers/main.yml | 4 +- .../tasks/main.yml | 38 ++--- roles/serveur_icinga/templates/config.yml.j2 | 11 ++ .../README.md | 22 +-- roles/serveur_keycloak/defaults/main.yml | 21 +++ .../handlers/main.yml | 2 +- .../tasks/main.yml | 70 ++++---- .../templates/keycloak.conf.j2 | 10 ++ .../templates/keycloak.env.j2 | 4 + .../templates/keycloak.service.j2 | 8 +- .../{serveurs_loki => serveur_loki}/README.md | 12 +- roles/serveur_loki/defaults/main.yml | 14 ++ .../handlers/main.yml | 2 +- .../tasks/main.yml | 14 +- .../templates/config.yml.j2 | 14 +- roles/serveur_nginx/README.md | 37 +++++ .../defaults/main.yml | 24 +-- .../handlers/main.yml | 2 +- .../tasks/main.yml | 22 +-- .../templates/99-chezlepro.conf.j2 | 4 + .../templates/expositions.conf.j2 | 10 +- .../templates/site.conf.j2 | 8 +- .../README.md | 18 +- roles/serveur_openldap/defaults/main.yml | 22 +++ .../tasks/main.yml | 22 +-- .../README.md | 26 +-- .../defaults/main.yml | 22 +-- .../handlers/main.yml | 4 +- .../tasks/main.yml | 46 +++--- .../templates/99-chezlepro.conf.j2 | 7 + .../templates/pg_hba.conf.j2 | 11 ++ .../README.md | 12 +- roles/serveur_powerdns/defaults/main.yml | 33 ++++ .../handlers/main.yml | 4 +- .../tasks/main.yml | 10 +- .../templates/bindbackend.conf.j2 | 4 + .../templates/chezlepro-bind.conf.j2 | 9 + roles/serveur_powerdns/templates/zone.db.j2 | 26 +++ .../README.md | 20 +-- roles/serveur_prometheus/defaults/main.yml | 16 ++ .../handlers/main.yml | 4 +- .../tasks/main.yml | 6 +- .../templates/default-prometheus.j2 | 2 + .../templates/prometheus.yml.j2 | 10 +- .../README.md | 10 +- roles/serveur_redis/defaults/main.yml | 18 ++ .../handlers/main.yml | 2 +- .../tasks/main.yml | 14 +- .../serveur_redis/templates/chezlepro.conf.j2 | 7 + .../README.md | 14 +- roles/serveur_sendmail/defaults/main.yml | 31 ++++ .../handlers/main.yml | 2 +- .../tasks/main.yml | 6 +- .../templates/main.cf.j2 | 20 +-- .../README.md | 24 +-- roles/serveur_step_ca/defaults/main.yml | 27 +++ .../handlers/main.yml | 2 +- .../tasks/main.yml | 60 +++---- .../templates/smallstep.sources.j2 | 5 + .../templates/step-ca.service.j2 | 14 +- roles/serveurs_forgejo/defaults/main.yml | 30 ---- roles/serveurs_forgejo/templates/app.ini.j2 | 34 ---- .../templates/forgejo.service.j2 | 20 --- roles/serveurs_grafana/defaults/main.yml | 22 --- .../templates/chezlepro.conf.j2 | 5 - .../templates/datasources.yaml.j2 | 13 -- roles/serveurs_icinga/templates/config.yml.j2 | 11 -- roles/serveurs_keycloak/defaults/main.yml | 21 --- .../templates/keycloak.conf.j2 | 10 -- .../templates/keycloak.env.j2 | 4 - roles/serveurs_loki/defaults/main.yml | 14 -- roles/serveurs_nginx/README.md | 37 ----- .../templates/99-chezlepro.conf.j2 | 4 - roles/serveurs_openldap/defaults/main.yml | 22 --- .../templates/99-chezlepro.conf.j2 | 7 - .../templates/pg_hba.conf.j2 | 11 -- roles/serveurs_powerdns/defaults/main.yml | 33 ---- .../templates/bindbackend.conf.j2 | 4 - .../templates/chezlepro-bind.conf.j2 | 9 - roles/serveurs_powerdns/templates/zone.db.j2 | 26 --- roles/serveurs_prometheus/defaults/main.yml | 16 -- .../templates/default-prometheus.j2 | 2 - roles/serveurs_redis/defaults/main.yml | 18 -- .../templates/chezlepro.conf.j2 | 7 - roles/serveurs_sendmail/defaults/main.yml | 31 ---- roles/serveurs_step_ca/defaults/main.yml | 27 --- .../templates/smallstep.sources.j2 | 5 - roles/web/README.md | 8 +- ...ons (conflicted copy 2026-06-23 231110).py | 155 ++++++++++++++++++ scripts/applications.py | 2 +- scripts/instancier.py | 4 +- scripts/inventory_gui.py | 6 +- scripts/inventory_rules.py | 2 +- scripts/serveurs.py | 2 +- 237 files changed, 1868 insertions(+), 1543 deletions(-) create mode 100644 .ansible-lint rename inventories/production/group_vars/{clients_dns.yml => client_dns.yml} (56%) create mode 100644 inventories/production/group_vars/client_ldap.yml create mode 100644 inventories/production/group_vars/client_pki.yml create mode 100644 inventories/production/group_vars/client_smtp.yml delete mode 100644 inventories/production/group_vars/clients_ldap.yml delete mode 100644 inventories/production/group_vars/clients_smtp.yml rename inventories/production/group_vars/{serveurs_debian.yml => serveur_debian.yml} (100%) create mode 100644 inventories/production/group_vars/serveur_forgejo.yml create mode 100644 inventories/production/group_vars/serveur_grafana.yml create mode 100644 inventories/production/group_vars/serveur_icinga.yml create mode 100644 inventories/production/group_vars/serveur_keycloak.yml create mode 100644 inventories/production/group_vars/serveur_nginx.yml rename inventories/production/group_vars/{serveurs_openldap.yml => serveur_openldap.yml} (54%) rename inventories/production/group_vars/{serveurs_postgresql.yml => serveur_postgresql.yml} (69%) create mode 100644 inventories/production/group_vars/serveur_powerdns.yml create mode 100644 inventories/production/group_vars/serveur_redis.yml rename inventories/production/group_vars/{serveurs_sendmail.yml => serveur_sendmail.yml} (62%) create mode 100644 inventories/production/group_vars/serveur_step_ca.yml delete mode 100644 inventories/production/group_vars/serveurs_forgejo.yml delete mode 100644 inventories/production/group_vars/serveurs_grafana.yml delete mode 100644 inventories/production/group_vars/serveurs_powerdns.yml rename playbooks/groupes/{clients_dns.yml => client_dns.yml} (76%) create mode 100644 playbooks/groupes/client_journal.yml rename playbooks/groupes/{clients_pki.yml => client_ldap.yml} (76%) create mode 100644 playbooks/groupes/client_metrique.yml rename playbooks/groupes/{clients_smtp.yml => client_pki.yml} (76%) rename playbooks/groupes/{serveurs_loki.yml => client_smtp.yml} (75%) rename playbooks/groupes/{clients_supervision.yml => client_supervision.yml} (70%) create mode 100644 playbooks/groupes/serveur_collabora.yml rename playbooks/groupes/{serveurs_debian.yml => serveur_debian.yml} (85%) rename playbooks/groupes/{serveurs_durcis.yml => serveur_durci.yml} (86%) create mode 100644 playbooks/groupes/serveur_forgejo.yml create mode 100644 playbooks/groupes/serveur_grafana.yml create mode 100644 playbooks/groupes/serveur_icinga.yml rename playbooks/groupes/{serveurs_forgejo.yml => serveur_keycloak.yml} (73%) create mode 100644 playbooks/groupes/serveur_loki.yml rename playbooks/groupes/{serveurs_nextcloud.yml => serveur_nextcloud.yml} (69%) create mode 100644 playbooks/groupes/serveur_nginx.yml create mode 100644 playbooks/groupes/serveur_openldap.yml rename playbooks/groupes/{clients_metriques.yml => serveur_postgresql.yml} (72%) create mode 100644 playbooks/groupes/serveur_powerdns.yml create mode 100644 playbooks/groupes/serveur_prometheus.yml create mode 100644 playbooks/groupes/serveur_redis.yml create mode 100644 playbooks/groupes/serveur_sendmail.yml create mode 100644 playbooks/groupes/serveur_step_ca.yml rename playbooks/groupes/{serveurs_web_dorsaux.yml => serveur_web_dorsal.yml} (95%) rename playbooks/groupes/{serveurs_web_frontaux.yml => serveur_web_frontal.yml} (92%) delete mode 100644 playbooks/groupes/serveurs_keycloak.yml delete mode 100644 playbooks/groupes/serveurs_nginx.yml delete mode 100644 playbooks/groupes/serveurs_powerdns.yml delete mode 100644 playbooks/groupes/serveurs_prometheus.yml delete mode 100644 playbooks/groupes/serveurs_redis.yml delete mode 100644 playbooks/groupes/serveurs_sendmail.yml delete mode 100644 playbooks/groupes/serveurs_step_ca.yml rename roles/{clients_dns => client_dns}/README.md (72%) create mode 100644 roles/client_dns/defaults/main.yml rename roles/{clients_dns => client_dns}/tasks/main.yml (51%) create mode 100644 roles/client_dns/templates/resolv.conf.j2 rename roles/{clients_journaux => client_journal}/README.md (68%) create mode 100644 roles/client_journal/defaults/main.yml rename roles/{clients_journaux => client_journal}/handlers/main.yml (70%) rename roles/{clients_journaux => client_journal}/tasks/main.yml (71%) rename roles/{clients_journaux => client_journal}/templates/config.alloy.j2 (67%) rename roles/{clients_ldap => client_ldap}/README.md (61%) create mode 100644 roles/client_ldap/defaults/main.yml rename roles/{clients_ldap => client_ldap}/handlers/main.yml (72%) rename roles/{clients_ldap => client_ldap}/tasks/main.yml (87%) create mode 100644 roles/client_ldap/templates/sssd.conf.j2 rename roles/{clients_metriques => client_metrique}/README.md (52%) rename roles/{clients_metriques => client_metrique}/defaults/main.yml (60%) rename roles/{clients_metriques => client_metrique}/handlers/main.yml (73%) rename roles/{clients_metriques => client_metrique}/tasks/main.yml (84%) create mode 100644 roles/client_metrique/templates/default-node-exporter.j2 rename roles/{clients_pki => client_pki}/README.md (70%) create mode 100644 roles/client_pki/defaults/main.yml rename roles/{clients_pki => client_pki}/handlers/main.yml (100%) rename roles/{clients_pki => client_pki}/tasks/main.yml (65%) rename roles/{clients_pki => client_pki}/templates/cert-renewer@.service.j2 (66%) rename roles/{clients_pki => client_pki}/templates/cert-renewer@.timer.j2 (84%) create mode 100644 roles/client_pki/templates/smallstep.sources.j2 rename roles/{clients_smtp => client_smtp}/README.md (59%) create mode 100644 roles/client_smtp/defaults/main.yml rename roles/{clients_smtp => client_smtp}/tasks/main.yml (88%) create mode 100644 roles/client_smtp/templates/msmtprc.j2 delete mode 100644 roles/clients_dns/defaults/main.yml delete mode 100644 roles/clients_dns/templates/resolv.conf.j2 delete mode 100644 roles/clients_journaux/defaults/main.yml delete mode 100644 roles/clients_ldap/defaults/main.yml delete mode 100644 roles/clients_ldap/templates/sssd.conf.j2 delete mode 100644 roles/clients_metriques/templates/default-node-exporter.j2 delete mode 100644 roles/clients_pki/defaults/main.yml delete mode 100644 roles/clients_pki/templates/smallstep.sources.j2 delete mode 100644 roles/clients_smtp/defaults/main.yml delete mode 100644 roles/clients_smtp/templates/msmtprc.j2 rename roles/{serveurs_forgejo => serveur_forgejo}/README.md (55%) create mode 100644 roles/serveur_forgejo/defaults/main.yml rename roles/{serveurs_forgejo => serveur_forgejo}/handlers/main.yml (75%) rename roles/{serveurs_forgejo => serveur_forgejo}/tasks/main.yml (51%) create mode 100644 roles/serveur_forgejo/templates/app.ini.j2 create mode 100644 roles/serveur_forgejo/templates/forgejo.service.j2 rename roles/{serveurs_grafana => serveur_grafana}/README.md (60%) create mode 100644 roles/serveur_grafana/defaults/main.yml rename roles/{serveurs_grafana => serveur_grafana}/handlers/main.yml (75%) rename roles/{serveurs_grafana => serveur_grafana}/tasks/main.yml (80%) create mode 100644 roles/serveur_grafana/templates/chezlepro.conf.j2 create mode 100644 roles/serveur_grafana/templates/datasources.yaml.j2 rename roles/{serveurs_icinga => serveur_icinga}/README.md (85%) rename roles/{serveurs_icinga => serveur_icinga}/defaults/main.yml (51%) rename roles/{serveurs_icinga => serveur_icinga}/handlers/main.yml (68%) rename roles/{serveurs_icinga => serveur_icinga}/tasks/main.yml (67%) create mode 100644 roles/serveur_icinga/templates/config.yml.j2 rename roles/{serveurs_keycloak => serveur_keycloak}/README.md (61%) create mode 100644 roles/serveur_keycloak/defaults/main.yml rename roles/{serveurs_keycloak => serveur_keycloak}/handlers/main.yml (75%) rename roles/{serveurs_keycloak => serveur_keycloak}/tasks/main.yml (54%) create mode 100644 roles/serveur_keycloak/templates/keycloak.conf.j2 create mode 100644 roles/serveur_keycloak/templates/keycloak.env.j2 rename roles/{serveurs_keycloak => serveur_keycloak}/templates/keycloak.service.j2 (68%) rename roles/{serveurs_loki => serveur_loki}/README.md (77%) create mode 100644 roles/serveur_loki/defaults/main.yml rename roles/{serveurs_loki => serveur_loki}/handlers/main.yml (71%) rename roles/{serveurs_loki => serveur_loki}/tasks/main.yml (75%) rename roles/{serveurs_loki => serveur_loki}/templates/config.yml.j2 (52%) create mode 100644 roles/serveur_nginx/README.md rename roles/{serveurs_nginx => serveur_nginx}/defaults/main.yml (67%) rename roles/{serveurs_nginx => serveur_nginx}/handlers/main.yml (84%) rename roles/{serveurs_nginx => serveur_nginx}/tasks/main.yml (81%) create mode 100644 roles/serveur_nginx/templates/99-chezlepro.conf.j2 rename roles/{serveurs_nginx => serveur_nginx}/templates/expositions.conf.j2 (86%) rename roles/{serveurs_nginx => serveur_nginx}/templates/site.conf.j2 (64%) rename roles/{serveurs_openldap => serveur_openldap}/README.md (72%) create mode 100644 roles/serveur_openldap/defaults/main.yml rename roles/{serveurs_openldap => serveur_openldap}/tasks/main.yml (72%) rename roles/{serveurs_postgresql => serveur_postgresql}/README.md (68%) rename roles/{serveurs_postgresql => serveur_postgresql}/defaults/main.yml (70%) rename roles/{serveurs_postgresql => serveur_postgresql}/handlers/main.yml (60%) rename roles/{serveurs_postgresql => serveur_postgresql}/tasks/main.yml (71%) create mode 100644 roles/serveur_postgresql/templates/99-chezlepro.conf.j2 create mode 100644 roles/serveur_postgresql/templates/pg_hba.conf.j2 rename roles/{serveurs_powerdns => serveur_powerdns}/README.md (65%) create mode 100644 roles/serveur_powerdns/defaults/main.yml rename roles/{serveurs_powerdns => serveur_powerdns}/handlers/main.yml (57%) rename roles/{serveurs_powerdns => serveur_powerdns}/tasks/main.yml (78%) create mode 100644 roles/serveur_powerdns/templates/bindbackend.conf.j2 create mode 100644 roles/serveur_powerdns/templates/chezlepro-bind.conf.j2 create mode 100644 roles/serveur_powerdns/templates/zone.db.j2 rename roles/{serveurs_prometheus => serveur_prometheus}/README.md (59%) create mode 100644 roles/serveur_prometheus/defaults/main.yml rename roles/{serveurs_prometheus => serveur_prometheus}/handlers/main.yml (69%) rename roles/{serveurs_prometheus => serveur_prometheus}/tasks/main.yml (82%) create mode 100644 roles/serveur_prometheus/templates/default-prometheus.j2 rename roles/{serveurs_prometheus => serveur_prometheus}/templates/prometheus.yml.j2 (56%) rename roles/{serveurs_redis => serveur_redis}/README.md (76%) create mode 100644 roles/serveur_redis/defaults/main.yml rename roles/{serveurs_redis => serveur_redis}/handlers/main.yml (71%) rename roles/{serveurs_redis => serveur_redis}/tasks/main.yml (64%) create mode 100644 roles/serveur_redis/templates/chezlepro.conf.j2 rename roles/{serveurs_sendmail => serveur_sendmail}/README.md (73%) create mode 100644 roles/serveur_sendmail/defaults/main.yml rename roles/{serveurs_sendmail => serveur_sendmail}/handlers/main.yml (84%) rename roles/{serveurs_sendmail => serveur_sendmail}/tasks/main.yml (86%) rename roles/{serveurs_sendmail => serveur_sendmail}/templates/main.cf.j2 (51%) rename roles/{serveurs_step_ca => serveur_step_ca}/README.md (62%) create mode 100644 roles/serveur_step_ca/defaults/main.yml rename roles/{serveurs_step_ca => serveur_step_ca}/handlers/main.yml (75%) rename roles/{serveurs_step_ca => serveur_step_ca}/tasks/main.yml (52%) create mode 100644 roles/serveur_step_ca/templates/smallstep.sources.j2 rename roles/{serveurs_step_ca => serveur_step_ca}/templates/step-ca.service.j2 (74%) delete mode 100644 roles/serveurs_forgejo/defaults/main.yml delete mode 100644 roles/serveurs_forgejo/templates/app.ini.j2 delete mode 100644 roles/serveurs_forgejo/templates/forgejo.service.j2 delete mode 100644 roles/serveurs_grafana/defaults/main.yml delete mode 100644 roles/serveurs_grafana/templates/chezlepro.conf.j2 delete mode 100644 roles/serveurs_grafana/templates/datasources.yaml.j2 delete mode 100644 roles/serveurs_icinga/templates/config.yml.j2 delete mode 100644 roles/serveurs_keycloak/defaults/main.yml delete mode 100644 roles/serveurs_keycloak/templates/keycloak.conf.j2 delete mode 100644 roles/serveurs_keycloak/templates/keycloak.env.j2 delete mode 100644 roles/serveurs_loki/defaults/main.yml delete mode 100644 roles/serveurs_nginx/README.md delete mode 100644 roles/serveurs_nginx/templates/99-chezlepro.conf.j2 delete mode 100644 roles/serveurs_openldap/defaults/main.yml delete mode 100644 roles/serveurs_postgresql/templates/99-chezlepro.conf.j2 delete mode 100644 roles/serveurs_postgresql/templates/pg_hba.conf.j2 delete mode 100644 roles/serveurs_powerdns/defaults/main.yml delete mode 100644 roles/serveurs_powerdns/templates/bindbackend.conf.j2 delete mode 100644 roles/serveurs_powerdns/templates/chezlepro-bind.conf.j2 delete mode 100644 roles/serveurs_powerdns/templates/zone.db.j2 delete mode 100644 roles/serveurs_prometheus/defaults/main.yml delete mode 100644 roles/serveurs_prometheus/templates/default-prometheus.j2 delete mode 100644 roles/serveurs_redis/defaults/main.yml delete mode 100644 roles/serveurs_redis/templates/chezlepro.conf.j2 delete mode 100644 roles/serveurs_sendmail/defaults/main.yml delete mode 100644 roles/serveurs_step_ca/defaults/main.yml delete mode 100644 roles/serveurs_step_ca/templates/smallstep.sources.j2 create mode 100644 scripts/applications (conflicted copy 2026-06-23 231110).py diff --git a/.ansible-lint b/.ansible-lint new file mode 100644 index 0000000..a7895d6 --- /dev/null +++ b/.ansible-lint @@ -0,0 +1,5 @@ +# Les fichiers sous docs/ sont des REGISTRES DE DONNEES (consommes par Python), +# pas du contenu Ansible : nomenclature alignee pour la lisibilite, serveurs.yml +# genere par safe_dump. Les regles yaml d'ansible-lint ne s'y appliquent pas. +exclude_paths: + - docs/ diff --git a/AGENTS.md b/AGENTS.md index e858d19..9ea664d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -298,8 +298,8 @@ Les cibles d'exploitation des VM doivent privilégier les groupes : ```text make deployer HOTE=web-01 -make deployer-groupe GROUPE=serveurs_debian -make hote-planifier HOTE=obs-01 VMID=94101 GROUPES="serveurs_debian serveurs_durcis serveurs_prometheus" +make deployer-groupe GROUPE=serveur_debian +make hote-planifier HOTE=obs-01 VMID=94101 GROUPES="serveur_debian serveur_durci serveur_prometheus" ``` Éviter les cibles parallèles qui réappliquent les mêmes rôles par couche, par exemple `make socle`, `make durcissement`, `make converger` ou `make deployer-vm`. @@ -315,8 +315,8 @@ Chaque groupe opérationnel Ansible doit avoir un playbook homonyme dans `playbo La convention attendue est : ```text -groupe Ansible : serveurs_debian -playbook : playbooks/groupes/serveurs_debian.yml +groupe Ansible : serveur_debian +playbook : playbooks/groupes/serveur_debian.yml ``` L'appartenance aux groupes détermine les services, intégrations et politiques appliqués à une VM. @@ -328,10 +328,10 @@ Un playbook de groupe doit cibler son groupe homonyme, pas `all`, sauf justifica Les concepts comme socle Debian ou durcissement commun doivent être représentés par des groupes explicites : ```text -serveurs_debian -> socle commun Debian -serveurs_durcis -> durcissement commun -clients_dns -> intégration cliente DNS -clients_pki -> intégration cliente PKI / ACME +serveur_debian -> socle commun Debian +serveur_durci -> durcissement commun +client_dns -> intégration cliente DNS +client_pki -> intégration cliente PKI / ACME ``` Ne pas dupliquer ces mêmes rôles dans des playbooks de couches séparés. @@ -368,20 +368,20 @@ Les rôles et playbooks doivent donc être conçus pour être relancés réguli Le groupe d'inventaire attendu pour les VM Debian gérées est : ```text -serveurs_debian +serveur_debian ``` Les groupes spécialisés doivent s'ajouter selon les besoins réels, par exemple : ```text -clients_dns -clients_pki -clients_ldap -clients_supervision -clients_metriques -serveurs_web_frontaux -serveurs_postgresql -serveurs_prometheus +client_dns +client_pki +client_ldap +client_supervision +client_metrique +serveur_web_frontal +serveur_postgresql +serveur_prometheus ``` Ne pas cibler `all` par défaut pour un playbook qui ne s'applique pas réellement à tous les hôtes. diff --git a/CHANGELOG.md b/CHANGELOG.md index f0d1575..cfe3ecd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - **Documentation — passe complète (le dépôt « dit ce qu'il fait »).** Nouveau guide central **`docs/plan-et-generation.md`** : le modèle (entités + liens), les registres et leurs schémas, la référence des commandes `make`/CLI et des vues GUI, le flux « éditer le plan → `instancier` → appliquer », les garde-fous. `AGENTS.md` gagne la section « Le plan et la génération de l'inventaire » (règle d'or : `hosts.yml` est généré, ne pas l'éditer). `README.md` : section « Le plan : on édite, l'inventaire se génère » + remplacement du flux legacy `hote-planifier`/`ajouter` par le flux par le plan. Rafraîchissement de `docs/architecture-set-ops.md` (entités du plan), `docs/nomenclature-vm.md` et `docs/catalogue-services.md` ; correction de la terminologie **domaine → fonction** dans la prose (collision avec le DNS levée jusque dans la doc). ### Modifié +- **Noms de rôles et playbooks au singulier.** `serveurs_*` → `serveur_*`, `clients_*` → `client_*`, et suffixes pluriels au singulier (`serveur_web_dorsal`/`serveur_web_frontal`, `client_metrique`, `client_journal`). Renommage par **tokens exacts** : répertoires de rôles, playbooks de groupes, `group_vars`, **variables internes des rôles** (`serveur_nginx_*`, conformité `ansible-lint`), groupes du plan (`applications.yml`, `serveurs.yml: integrations`), constantes de code (`GROUPES_OPERATIONNELS_PREFIXES`, sockle), docs. Les faux-amis sont **préservés** (`serveurs_bd` clé du registre BD, `scripts/serveurs.py`, fonctions Python). Les groupes d'état restent au pluriel (`hotes_actifs`/`hotes_planifies`/`modeles_vm`). Validé : `ansible-lint` 0 échec (0 var-naming), **diff vide** de la génération, `node --check`, tous les registres. Ajout de `.ansible-lint` excluant `docs/` (registres de données, pas du contenu Ansible). - **Rework GUI : l'UI édite le plan (branche `bascule-inventaire-genere`).** La vue **Serveurs** devient éditable (fonction / état / placement Proxmox / intégrations `clients_*`, avec VMID/IP/VLAN dérivés en direct), avec « + Serveur », « Sauvegarder les serveurs » (`POST /api/serveurs`) et **« Appliquer le plan → hosts.yml »** (`POST /api/instancier` → `instancier appliquer`). La vue **Inventaire** passe en **lecture seule** : bandeau explicite + l'écriture directe (`POST /api/inventaire`) est refusée (409) puisque `hosts.yml` est désormais généré. Tout passe par le plan (`serveurs.yml` / `applications.yml`) puis « Appliquer ». Garde-fou JS `node --check` exécuté à chaque étape. - **Bascule méta-classe (branche `bascule-inventaire-genere`).** `make instancier-appliquer` régénère `inventories/production/hosts.yml` **depuis le plan** (refuse si le diff n'est pas vide, sauf `FORCE=1` pour un changement intentionnel ; git sert de filet). Effectuée avec diff vide vérifié : `hosts.yml` est désormais un artefact généré, sémantiquement identique à l'ancien (vérifié par `make inventaire-verifier` complet + chargement GUI). À ce stade le GUI édite encore `hosts.yml` directement (rework à venir) : éditer le **plan** (`serveurs.yml`/`applications.yml`) puis `make instancier-appliquer`. - **Phase 2 (début) — vue Chaîne holistique.** Dans `make inventaire-ui`, la vue Chaîne montre désormais, pour chaque application d'un hôte, l'ensemble de ses liens : `expose` (FQDN publics), `requiert` (applications dont elle dépend) et ses bases (DSN), plus son port. On voit d'un coup d'œil comment VM, applications, bases et domaines s'articulent. diff --git a/Makefile b/Makefile index f6727c9..446104e 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ INVENTAIRE_PRODUCTION ?= inventories/production/hosts.yml FICHIER_INVENTAIRE ?= $(INVENTAIRE_PRODUCTION) FICHIER_DEPENDANCES ?= docs/dependances-groupes.yml GROUPE_MODELE ?= modeles_vm -GROUPE_DEBIAN ?= serveurs_debian +GROUPE_DEBIAN ?= serveur_debian GROUPE_HOTES_ACTIFS ?= hotes_actifs LIMITE ?= $(GROUPE_DEBIAN) HOTE ?= @@ -89,7 +89,7 @@ aide: @printf '%s\n' ' VLAN=15 \' @printf '%s\n' ' ADRESSE_IP=10.1.15.31 \' @printf '%s\n' ' PASSERELLE=10.1.15.1 \' - @printf '%s\n' ' GROUPES="serveurs_debian serveurs_durcis"' + @printf '%s\n' ' GROUPES="serveur_debian serveur_durci"' @printf '%s\n' ' Cloner seulement, sans inventaire:' @printf '%s\n' ' make cloner-vm HOTE=web-frontal-01 VMID=95301 VLAN=15 ADRESSE_IP=10.1.15.31 PASSERELLE=10.1.15.1' @printf '%s\n' ' Configurer Proxmox et le Vault API:' @@ -97,7 +97,7 @@ aide: @printf '%s\n' '' @printf '%s\n' 'Hotes' @printf '%s\n' ' Planifier un hote sans le deployer:' - @printf '%s\n' ' make hote-planifier HOTE=obs-01 VMID=94101 GROUPES="serveurs_debian serveurs_durcis serveurs_prometheus serveurs_loki"' + @printf '%s\n' ' make hote-planifier HOTE=obs-01 VMID=94101 GROUPES="serveur_debian serveur_durci serveur_prometheus serveur_loki"' @printf '%s\n' ' Verifier un deploiement a blanc (dry-run):' @printf '%s\n' ' make verifier-deploiement HOTE=web-frontal-01' @printf '%s\n' ' Remettre un hote en conformite selon ses groupes:' @@ -105,17 +105,17 @@ aide: @printf '%s\n' ' Afficher un hote:' @printf '%s\n' ' make hote-afficher HOTE=web-frontal-01' @printf '%s\n' ' Ajouter un hote existant:' - @printf '%s\n' ' make hote-ajouter HOTE=web-frontal-01 VMID=95301 ADRESSE_IP=10.1.15.31 GROUPES="serveurs_debian serveurs_durcis"' + @printf '%s\n' ' make hote-ajouter HOTE=web-frontal-01 VMID=95301 ADRESSE_IP=10.1.15.31 GROUPES="serveur_debian serveur_durci"' @printf '%s\n' ' Modifier ses groupes:' - @printf '%s\n' ' make hote-groupes HOTE=web-frontal-01 GROUPES="serveurs_debian serveurs_durcis"' + @printf '%s\n' ' make hote-groupes HOTE=web-frontal-01 GROUPES="serveur_debian serveur_durci"' @printf '%s\n' ' Diagnostiquer:' @printf '%s\n' ' make verifier-hote LIMITE=web-frontal-01' @printf '%s\n' '' @printf '%s\n' 'Groupes' @printf '%s\n' ' Appliquer un groupe complet:' - @printf '%s\n' ' make deployer-groupe GROUPE=serveurs_debian' + @printf '%s\n' ' make deployer-groupe GROUPE=serveur_debian' @printf '%s\n' ' Convention:' - @printf '%s\n' ' groupe serveurs_debian -> playbooks/groupes/serveurs_debian.yml' + @printf '%s\n' ' groupe serveur_debian -> playbooks/groupes/serveur_debian.yml' @printf '%s\n' '' @printf '%s\n' 'Inventaires' @printf '%s\n' ' Graphe de production:' @@ -142,7 +142,7 @@ aide: @printf '%s\n' ' make verifier' @printf '%s\n' '' @printf '%s\n' 'Variables frequentes' - @printf '%s\n' ' HOTE=web-frontal-01 GROUPE=serveurs_debian GROUPES="serveurs_debian serveurs_durcis"' + @printf '%s\n' ' HOTE=web-frontal-01 GROUPE=serveur_debian GROUPES="serveur_debian serveur_durci"' @printf '%s\n' ' VMID=95301 VLAN=15 ADRESSE_IP=10.1.15.31 PASSERELLE=10.1.15.1' @printf '%s\n' ' FICHIER_INVENTAIRE=inventories/production/hosts.yml FICHIER_DEPENDANCES=docs/dependances-groupes.yml CONFIRMER=true' diff --git a/README.md b/README.md index f796561..599147c 100644 --- a/README.md +++ b/README.md @@ -111,9 +111,9 @@ Les anciennes commandes `make hote-planifier` / `hote-ajouter` / `hote-groupes` Chaque groupe opérationnel doit avoir son playbook homonyme dans `playbooks/groupes/`. -La conformité normale des VM passe par ces playbooks de groupes. Les rôles de socle et de durcissement sont appliqués par `serveurs_debian` et `serveurs_durcis`, pas par des playbooks de couches séparés. +La conformité normale des VM passe par ces playbooks de groupes. Les rôles de socle et de durcissement sont appliqués par `serveur_debian` et `serveur_durci`, pas par des playbooks de couches séparés. -Les groupes opérationnels avec des hôtes, comme `serveurs_web_frontaux` ou `clients_dns`, sont validés contre `playbooks/groupes/` par les commandes d'inventaire. +Les groupes opérationnels avec des hôtes, comme `serveur_web_frontal` ou `client_dns`, sont validés contre `playbooks/groupes/` par les commandes d'inventaire. Le catalogue des services et intégrations prévus est dans `docs/catalogue-services.md`. @@ -127,7 +127,7 @@ Créer un clone depuis le modèle Debian 13 via l'API Proxmox : ```bash make config -make creer-vm HOTE=web-frontal-01 VMID=95301 VLAN=15 ADRESSE_IP=10.1.15.31 PASSERELLE=10.1.15.1 GROUPES="serveurs_debian serveurs_durcis" +make creer-vm HOTE=web-frontal-01 VMID=95301 VLAN=15 ADRESSE_IP=10.1.15.31 PASSERELLE=10.1.15.1 GROUPES="serveur_debian serveur_durci" make deployer HOTE=web-frontal-01 ``` @@ -155,7 +155,7 @@ make deployer HOTE=web-frontal-01 Déployer ou remettre en conformité un groupe : ```bash -make deployer-groupe GROUPE=serveurs_debian +make deployer-groupe GROUPE=serveur_debian ``` Les déploiements de groupes ciblent automatiquement les hôtes actifs seulement. diff --git a/docs/applications.yml b/docs/applications.yml index 39c438d..355dee8 100644 --- a/docs/applications.yml +++ b/docs/applications.yml @@ -4,56 +4,56 @@ --- applications: collabora: - groupe: serveurs_collabora + groupe: serveur_collabora hote: collab-01 nextcloud: - groupe: serveurs_nextcloud + groupe: serveur_nextcloud hote: collab-01 pg-principal: - groupe: serveurs_postgresql + groupe: serveur_postgresql hote: data-01 redis: - groupe: serveurs_redis + groupe: serveur_redis hote: data-01 forge: - groupe: serveurs_forgejo + groupe: serveur_forgejo hote: forge-01 keycloak: - groupe: serveurs_keycloak + groupe: serveur_keycloak hote: idm-01 openldap: - groupe: serveurs_openldap + groupe: serveur_openldap hote: idm-01 powerdns: - groupe: serveurs_powerdns + groupe: serveur_powerdns hote: infra-dns-01 nginx: - groupe: serveurs_nginx + groupe: serveur_nginx hote: infra-edge-01 sendmail: - groupe: serveurs_sendmail + groupe: serveur_sendmail hote: infra-mail-01 step_ca: - groupe: serveurs_step_ca + groupe: serveur_step_ca hote: infra-pki-01 icinga: - groupe: serveurs_icinga + groupe: serveur_icinga hote: mon-01 grafana: - groupe: serveurs_grafana + groupe: serveur_grafana hote: obs-01 loki: - groupe: serveurs_loki + groupe: serveur_loki hote: obs-01 prometheus: - groupe: serveurs_prometheus + groupe: serveur_prometheus hote: obs-01 web_dorsaux: - groupe: serveurs_web_dorsaux + groupe: serveur_web_dorsal hote: web-dorsal-01 web_frontaux: - groupe: serveurs_web_frontaux + groupe: serveur_web_frontal hote: web-frontal-01 web_frontaux-web-frontal-02: - groupe: serveurs_web_frontaux + groupe: serveur_web_frontal hote: web-frontal-02 diff --git a/docs/architecture-set-ops.md b/docs/architecture-set-ops.md index 1804de7..b597ca9 100644 --- a/docs/architecture-set-ops.md +++ b/docs/architecture-set-ops.md @@ -34,9 +34,9 @@ Les groupes opérationnels de l'inventaire doivent correspondre à un playbook h ```text inventories/production/hosts.yml - serveurs_debian + serveur_debian -playbooks/groupes/serveurs_debian.yml +playbooks/groupes/serveur_debian.yml ``` Cette relation rend l'exploitation lisible : diff --git a/docs/bases-donnees.yml b/docs/bases-donnees.yml index 92498d6..a87dbf3 100644 --- a/docs/bases-donnees.yml +++ b/docs/bases-donnees.yml @@ -27,7 +27,7 @@ serveurs_bd: type: postgres hote: "10.1.13.11" port: 5432 - groupe: serveurs_postgresql + groupe: serveur_postgresql bases_donnees: keycloak: @@ -35,7 +35,7 @@ bases_donnees: base: keycloak proprietaire: keycloak secret: vault_bd_keycloak - consommateur: serveurs_keycloak + consommateur: serveur_keycloak portee: groupe usage: principale icingadb: @@ -43,7 +43,7 @@ bases_donnees: base: icingadb proprietaire: icingadb secret: vault_bd_icingadb - consommateur: serveurs_icinga + consommateur: serveur_icinga portee: groupe usage: principale forgejo: @@ -51,6 +51,6 @@ bases_donnees: base: forgejo proprietaire: forgejo secret: vault_bd_forgejo - consommateur: serveurs_forgejo + consommateur: serveur_forgejo portee: groupe usage: principale diff --git a/docs/catalogue-services.md b/docs/catalogue-services.md index 35267db..9f8b97e 100644 --- a/docs/catalogue-services.md +++ b/docs/catalogue-services.md @@ -20,40 +20,40 @@ Un service central peut partager un hôte avec d'autres services de la même fon | Service | Groupe | Playbook | Rôle futur | | --- | --- | --- | --- | -| Keycloak | `serveurs_keycloak` | `playbooks/groupes/serveurs_keycloak.yml` | `keycloak` | -| OpenLDAP | `serveurs_openldap` | `playbooks/groupes/serveurs_openldap.yml` | `openldap` | -| PostgreSQL | `serveurs_postgresql` | `playbooks/groupes/serveurs_postgresql.yml` | `postgresql` | -| Loki | `serveurs_loki` | `playbooks/groupes/serveurs_loki.yml` | `loki` | -| Plateforme Icinga | `serveurs_icinga` | `playbooks/groupes/serveurs_icinga.yml` | `icinga` | -| Prometheus | `serveurs_prometheus` | `playbooks/groupes/serveurs_prometheus.yml` | `prometheus` | -| Grafana | `serveurs_grafana` | `playbooks/groupes/serveurs_grafana.yml` | `grafana` | -| Forgejo | `serveurs_forgejo` | `playbooks/groupes/serveurs_forgejo.yml` | `forgejo` | -| Sendmail MTA | `serveurs_sendmail` | `playbooks/groupes/serveurs_sendmail.yml` | `sendmail` | -| step-ca | `serveurs_step_ca` | `playbooks/groupes/serveurs_step_ca.yml` | `step_ca` | -| PowerDNS | `serveurs_powerdns` | `playbooks/groupes/serveurs_powerdns.yml` | `serveurs_powerdns` | -| Redis | `serveurs_redis` | `playbooks/groupes/serveurs_redis.yml` | `redis` | -| NGINX WAF et reverse proxy | `serveurs_nginx` | `playbooks/groupes/serveurs_nginx.yml` | `nginx` | -| Nextcloud | `serveurs_nextcloud` | `playbooks/groupes/serveurs_nextcloud.yml` | `nextcloud` | -| Collabora | `serveurs_collabora` | `playbooks/groupes/serveurs_collabora.yml` | `collabora` | +| Keycloak | `serveur_keycloak` | `playbooks/groupes/serveur_keycloak.yml` | `keycloak` | +| OpenLDAP | `serveur_openldap` | `playbooks/groupes/serveur_openldap.yml` | `openldap` | +| PostgreSQL | `serveur_postgresql` | `playbooks/groupes/serveur_postgresql.yml` | `postgresql` | +| Loki | `serveur_loki` | `playbooks/groupes/serveur_loki.yml` | `loki` | +| Plateforme Icinga | `serveur_icinga` | `playbooks/groupes/serveur_icinga.yml` | `icinga` | +| Prometheus | `serveur_prometheus` | `playbooks/groupes/serveur_prometheus.yml` | `prometheus` | +| Grafana | `serveur_grafana` | `playbooks/groupes/serveur_grafana.yml` | `grafana` | +| Forgejo | `serveur_forgejo` | `playbooks/groupes/serveur_forgejo.yml` | `forgejo` | +| Sendmail MTA | `serveur_sendmail` | `playbooks/groupes/serveur_sendmail.yml` | `sendmail` | +| step-ca | `serveur_step_ca` | `playbooks/groupes/serveur_step_ca.yml` | `step_ca` | +| PowerDNS | `serveur_powerdns` | `playbooks/groupes/serveur_powerdns.yml` | `serveur_powerdns` | +| Redis | `serveur_redis` | `playbooks/groupes/serveur_redis.yml` | `redis` | +| NGINX WAF et reverse proxy | `serveur_nginx` | `playbooks/groupes/serveur_nginx.yml` | `nginx` | +| Nextcloud | `serveur_nextcloud` | `playbooks/groupes/serveur_nextcloud.yml` | `nextcloud` | +| Collabora | `serveur_collabora` | `playbooks/groupes/serveur_collabora.yml` | `collabora` | ## Couche applicative web -La couche applicative web est distincte de l'edge `serveurs_nginx` : +La couche applicative web est distincte de l'edge `serveur_nginx` : -- `serveurs_nginx` est l'edge : mandataire inverse, terminaison TLS, WAF ; il reçoit le trafic externe et le route. -- `serveurs_web_frontaux` est la couche présentation web (UI, rendu, assets), servie *derrière* l'edge. -- `serveurs_web_dorsaux` est la couche application web (API, traitement), consommée par les frontaux. +- `serveur_nginx` est l'edge : mandataire inverse, terminaison TLS, WAF ; il reçoit le trafic externe et le route. +- `serveur_web_frontal` est la couche présentation web (UI, rendu, assets), servie *derrière* l'edge. +- `serveur_web_dorsal` est la couche application web (API, traitement), consommée par les frontaux. -Le « web » de ces deux groupes est implicite par leur position derrière `serveurs_nginx`. Le jour où un service dorsal n'est pas web (worker batch, file, démon), créer un groupe dédié plutôt que d'élargir `serveurs_web_dorsaux`. +Le « web » de ces deux groupes est implicite par leur position derrière `serveur_nginx`. Le jour où un service dorsal n'est pas web (worker batch, file, démon), créer un groupe dédié plutôt que d'élargir `serveur_web_dorsal`. | Couche | Groupe | Playbook | Rôle futur | | --- | --- | --- | --- | -| Présentation web (frontends) | `serveurs_web_frontaux` | `playbooks/groupes/serveurs_web_frontaux.yml` | `web_frontaux` | -| Application web (backends) | `serveurs_web_dorsaux` | `playbooks/groupes/serveurs_web_dorsaux.yml` | `web_dorsaux` | +| Présentation web (frontends) | `serveur_web_frontal` | `playbooks/groupes/serveur_web_frontal.yml` | `web_frontaux` | +| Application web (backends) | `serveur_web_dorsal` | `playbooks/groupes/serveur_web_dorsal.yml` | `web_dorsaux` | -Hôtes planifiés : `web-frontal-01` et `web-frontal-02` dans `serveurs_web_frontaux` ; `web-dorsal-01` dans `serveurs_web_dorsaux`. Aucun n'est encore actif (à créer puis activer). +Hôtes planifiés : `web-frontal-01` et `web-frontal-02` dans `serveur_web_frontal` ; `web-dorsal-01` dans `serveur_web_dorsal`. Aucun n'est encore actif (à créer puis activer). -Dépendance d'intégration prévue : `serveurs_web_frontaux` devra publier via `serveurs_nginx` (règle « tout service exposé en HTTP(S) passe par l'edge »). Cette dépendance n'est pas encore déclarée dans `docs/dependances-groupes.yml` (les deux groupes sont vides) ; elle sera ajoutée avec le rôle `web_frontaux`, lorsque des frontaux actifs devront publier via l'edge. +Dépendance d'intégration prévue : `serveur_web_frontal` devra publier via `serveur_nginx` (règle « tout service exposé en HTTP(S) passe par l'edge »). Cette dépendance n'est pas encore déclarée dans `docs/dependances-groupes.yml` (les deux groupes sont vides) ; elle sera ajoutée avec le rôle `web_frontaux`, lorsque des frontaux actifs devront publier via l'edge. ## Hôtes planifiés @@ -74,13 +74,13 @@ Dépendance d'intégration prévue : `serveurs_web_frontaux` devra publier via ` | Intégration | Groupe | Playbook | Rôle futur | | --- | --- | --- | --- | -| Résolution DNS interne | `clients_dns` | `playbooks/groupes/clients_dns.yml` | `clients_dns` | -| Confiance PKI / ACME | `clients_pki` | `playbooks/groupes/clients_pki.yml` | `client_pki` | -| Authentification LDAP | `clients_ldap` | `playbooks/groupes/clients_ldap.yml` | `client_ldap` | -| Supervision Icinga | `clients_supervision` | `playbooks/groupes/clients_supervision.yml` | `client_supervision` | -| Métriques Prometheus | `clients_metriques` | `playbooks/groupes/clients_metriques.yml` | `client_metriques` | -| Journaux vers Loki | `clients_journaux` | `playbooks/groupes/clients_journaux.yml` | `client_journaux` | -| Relais SMTP | `clients_smtp` | `playbooks/groupes/clients_smtp.yml` | `client_smtp` | +| Résolution DNS interne | `client_dns` | `playbooks/groupes/client_dns.yml` | `client_dns` | +| Confiance PKI / ACME | `client_pki` | `playbooks/groupes/client_pki.yml` | `client_pki` | +| Authentification LDAP | `client_ldap` | `playbooks/groupes/client_ldap.yml` | `client_ldap` | +| Supervision Icinga | `client_supervision` | `playbooks/groupes/client_supervision.yml` | `client_supervision` | +| Métriques Prometheus | `client_metrique` | `playbooks/groupes/client_metrique.yml` | `client_metriques` | +| Journaux vers Loki | `client_journal` | `playbooks/groupes/client_journal.yml` | `client_journaux` | +| Relais SMTP | `client_smtp` | `playbooks/groupes/client_smtp.yml` | `client_smtp` | ## Ordre d'implémentation recommandé @@ -88,97 +88,97 @@ L'ordre ci-dessous privilégie les dépendances structurantes avant les applicat ### Phase 1 - Fondations transversales -1. `serveurs_powerdns` +1. `serveur_powerdns` - Service central : DNS interne autoritaire et/ou résolution interne selon le design retenu. - - Intégration à prévoir : `clients_dns`. + - Intégration à prévoir : `client_dns`. - Raison : les autres intégrations auront besoin de noms stables plutôt que d'adresses IP. -2. `serveurs_step_ca` +2. `serveur_step_ca` - Service central : autorité de certification interne et ACME. - - Intégration à prévoir : `clients_pki`. + - Intégration à prévoir : `client_pki`. - Raison : les autres services auront besoin de certificats fiables avant d'être exposés proprement. -3. `serveurs_nginx` +3. `serveur_nginx` - Service central : reverse proxy, terminaison TLS, publication HTTP(S), WAF. - Intégration à prévoir : publication des services HTTP derrière le proxy. - Raison : plusieurs services seront consommés par navigateur ou API et doivent passer par un point d'entrée cohérent. -4. `serveurs_sendmail` +4. `serveur_sendmail` - Service central : relais SMTP sortant. - - Intégration à prévoir : `clients_smtp`. + - Intégration à prévoir : `client_smtp`. - Raison : les notifications, réinitialisations de mot de passe et alertes doivent fonctionner tôt. ### Phase 2 - Données et identité -5. `serveurs_postgresql` +5. `serveur_postgresql` - Service central : base de données relationnelle partagée. - Intégration à prévoir : bases dédiées par application, comptes applicatifs et sauvegardes. - Raison : Keycloak, Grafana, Icinga Web 2, Forgejo et Nextcloud peuvent dépendre de PostgreSQL. -6. `serveurs_openldap` +6. `serveur_openldap` - Service central : annuaire interne. - - Intégration à prévoir : `clients_ldap`. + - Intégration à prévoir : `client_ldap`. - Raison : l'identité Unix et l'annuaire doivent exister avant les intégrations d'authentification avancées. -7. `serveurs_keycloak` +7. `serveur_keycloak` - Service central : SSO/OIDC/SAML. - - Intégration à prévoir : applications web derrière `serveurs_nginx`. + - Intégration à prévoir : applications web derrière `serveur_nginx`. - Raison : les applications devraient être branchées au SSO dès leur arrivée plutôt qu'après coup. ### Phase 3 - Observabilité minimale -8. `serveurs_prometheus` +8. `serveur_prometheus` - Service central : métriques. - - Intégration à prévoir : `clients_metriques`. + - Intégration à prévoir : `client_metrique`. - Raison : les prochains services doivent être mesurables dès leur déploiement. -9. `serveurs_loki` +9. `serveur_loki` - Service central : journaux centralisés. - - Intégration à prévoir : `clients_journaux`. + - Intégration à prévoir : `client_journal`. - Raison : les journaux centralisés accélèrent le diagnostic des services suivants. -10. `serveurs_grafana` +10. `serveur_grafana` - Service central : tableaux de bord. - Intégration à prévoir : datasources Prometheus et Loki, authentification Keycloak. - Raison : Grafana consolide les métriques et journaux après leur mise en place. ### Phase 4 - Supervision active -11. `serveurs_icinga` +11. `serveur_icinga` - Service central : supervision active, interface web et vues métiers Icinga. - Composants prévus : Icinga 2, Icinga Web 2, Icinga BPM. - - Intégrations à prévoir : `clients_supervision`, PostgreSQL, NGINX, Keycloak si retenu. + - Intégrations à prévoir : `client_supervision`, PostgreSQL, NGINX, Keycloak si retenu. - Raison : ces composants forment une même capacité de supervision et gagnent à cohabiter sur `mon-01` au départ. ### Phase 5 - Services applicatifs internes -12. `serveurs_redis` +12. `serveur_redis` - Service central : cache et files internes. - Intégration à prévoir : Nextcloud et autres applications qui en ont besoin. - Raison : Redis est une dépendance applicative, pas une fondation globale. -13. `serveurs_forgejo` +13. `serveur_forgejo` - Service central : forge Git. - Intégration à prévoir : PostgreSQL, NGINX, Keycloak, SMTP, sauvegardes. - Raison : la forge devient plus utile après SSO, TLS, SMTP et observabilité. -14. `serveurs_nextcloud` +14. `serveur_nextcloud` - Service central : collaboration fichiers. - Intégration à prévoir : PostgreSQL, Redis, NGINX, Keycloak, SMTP, sauvegardes. - Raison : Nextcloud dépend de plusieurs fondations et doit arriver après elles. -15. `serveurs_collabora` +15. `serveur_collabora` - Service central : édition documentaire en ligne. - Intégration à prévoir : Nextcloud, NGINX, certificats. - Raison : Collabora est une extension de Nextcloud et doit venir après lui. ## Règles d'intégration -- Tout service exposé en HTTP(S) doit prévoir son intégration avec `serveurs_nginx`. -- Tout service avec authentification humaine doit prévoir son intégration avec `serveurs_keycloak`, sauf justification contraire. -- Tout service générant des alertes ou notifications doit prévoir `clients_smtp`. -- Toute VM de service doit rejoindre `clients_metriques`, `clients_journaux` et `clients_supervision` quand les services centraux correspondants existent. -- Tout service utilisant un certificat interne doit dépendre de `clients_pki`. +- Tout service exposé en HTTP(S) doit prévoir son intégration avec `serveur_nginx`. +- Tout service avec authentification humaine doit prévoir son intégration avec `serveur_keycloak`, sauf justification contraire. +- Tout service générant des alertes ou notifications doit prévoir `client_smtp`. +- Toute VM de service doit rejoindre `client_metrique`, `client_journal` et `client_supervision` quand les services centraux correspondants existent. +- Tout service utilisant un certificat interne doit dépendre de `client_pki`. - Tout rôle serveur doit documenter ses ports, secrets, sauvegardes, dépendances et groupes clients associés. Les groupes clients peuvent être ajoutés aux VM existantes quand le service central correspondant est réellement disponible. diff --git a/docs/dependances-groupes.yml b/docs/dependances-groupes.yml index a89c906..efd8101 100644 --- a/docs/dependances-groupes.yml +++ b/docs/dependances-groupes.yml @@ -1,86 +1,86 @@ --- groupes: - clients_dns: + client_dns: requiert_groupes_actifs: - - serveurs_powerdns + - serveur_powerdns raison: "Les resolvers clients ne doivent pas pointer vers un service DNS absent." surveillance: "Verifier resolution interne et disponibilite du service DNS." - clients_pki: + client_pki: requiert_groupes_actifs: - - serveurs_step_ca + - serveur_step_ca raison: "La confiance CA et ACME client dependent de l'autorite interne." surveillance: "Verifier validite CA, emission ACME et expiration des certificats." - clients_ldap: + client_ldap: requiert_groupes_actifs: - - serveurs_openldap + - serveur_openldap raison: "La configuration NSS/PAM/SSSD depend de l'annuaire LDAP." surveillance: "Verifier bind LDAP, latence et expiration des certificats LDAP." - clients_supervision: + client_supervision: requiert_groupes_actifs: - - serveurs_icinga + - serveur_icinga raison: "Les agents ou checks clients doivent se rattacher a une plateforme Icinga active." surveillance: "Verifier enregistrement des hotes, fraicheur des checks et notifications." - clients_metriques: + client_metrique: requiert_groupes_actifs: - - serveurs_prometheus + - serveur_prometheus raison: "Les exporters clients doivent etre collectes par Prometheus." surveillance: "Verifier targets Prometheus, scrape duration et erreurs de collecte." - clients_journaux: + client_journal: requiert_groupes_actifs: - - serveurs_loki + - serveur_loki raison: "L'expedition des journaux depend du collecteur central Loki." surveillance: "Verifier ingestion Loki, retard et volume de journaux." - clients_smtp: + client_smtp: requiert_groupes_actifs: - - serveurs_sendmail + - serveur_sendmail raison: "Les notifications locales doivent relayer vers un MTA actif." surveillance: "Verifier file d'attente, relais SMTP et echecs de livraison." - serveurs_keycloak: + serveur_keycloak: requiert_groupes_actifs: - - serveurs_postgresql + - serveur_postgresql raison: "Keycloak doit utiliser une base PostgreSQL geree." surveillance: "Verifier connexion base, etat realm et disponibilite OIDC." - serveurs_grafana: + serveur_grafana: requiert_groupes_actifs: - - serveurs_prometheus - - serveurs_loki + - serveur_prometheus + - serveur_loki raison: "Grafana est utile comme interface aux metriques et journaux centraux." surveillance: "Verifier datasources Prometheus/Loki et authentification." - serveurs_icinga: + serveur_icinga: requiert_groupes_actifs: - - serveurs_postgresql + - serveur_postgresql raison: "La plateforme Icinga Web/BPM depend d'une base relationnelle." surveillance: "Verifier moteur Icinga, base, interface web et notifications." - serveurs_forgejo: + serveur_forgejo: requiert_groupes_actifs: - - serveurs_postgresql - - serveurs_nginx - - serveurs_sendmail + - serveur_postgresql + - serveur_nginx + - serveur_sendmail raison: "Forgejo depend d'une base, d'une publication HTTP(S) et du courriel." surveillance: "Verifier HTTP(S), base, files Git et envoi courriel." - serveurs_nextcloud: + serveur_nextcloud: requiert_groupes_actifs: - - serveurs_postgresql - - serveurs_redis - - serveurs_nginx - - serveurs_sendmail + - serveur_postgresql + - serveur_redis + - serveur_nginx + - serveur_sendmail raison: "Nextcloud depend d'une base, d'un cache, d'un frontal web et du courriel." surveillance: "Verifier jobs, base, Redis, HTTP(S), stockage et courriel." - serveurs_collabora: + serveur_collabora: requiert_groupes_actifs: - - serveurs_nextcloud - - serveurs_nginx + - serveur_nextcloud + - serveur_nginx raison: "Collabora est expose via le frontal web et integre a Nextcloud." surveillance: "Verifier connectivite Nextcloud, websocket et disponibilite HTTP(S)." diff --git a/docs/dns-interne.md b/docs/dns-interne.md index 74dc874..08fa565 100644 --- a/docs/dns-interne.md +++ b/docs/dns-interne.md @@ -5,11 +5,11 @@ Le service DNS interne est la premiere capacite de plateforme. ## Groupes ```text -serveurs_powerdns -> service DNS central PowerDNS Authoritative -clients_dns -> integration cliente DNS +serveur_powerdns -> service DNS central PowerDNS Authoritative +client_dns -> integration cliente DNS ``` -`clients_dns` depend de `serveurs_powerdns` dans `docs/dependances-groupes.yml`. +`client_dns` depend de `serveur_powerdns` dans `docs/dependances-groupes.yml`. ## Zone initiale @@ -22,12 +22,12 @@ chezlepro.internal Elle est definie dans : ```text -inventories/production/group_vars/serveurs_powerdns.yml +inventories/production/group_vars/serveur_powerdns.yml ``` ## Enregistrement automatique -Le role `serveurs_powerdns` genere la zone a partir de l'inventaire. +Le role `serveur_powerdns` genere la zone a partir de l'inventaire. Les hotes qui remplissent ces conditions sont ajoutes automatiquement : @@ -43,7 +43,7 @@ web-frontal-01 ansible_host=10.1.15.31 -> web-frontal-01.chezlepro.internal A 10.1.15.31 ``` -Les enregistrements additionnels explicites sont dans `serveurs_powerdns_records`. +Les enregistrements additionnels explicites sont dans `serveur_powerdns_records`. ## Backend PowerDNS @@ -56,21 +56,21 @@ Raison : - idempotence simple ; - bon point de depart pour la supervision. -Quand `serveurs_postgresql` sera stable, il sera possible de migrer vers un backend SQL si le besoin operationnel le justifie. +Quand `serveur_postgresql` sera stable, il sera possible de migrer vers un backend SQL si le besoin operationnel le justifie. ## Clients DNS -Le role `clients_dns` valide : +Le role `client_dns` valide : -- qu'un serveur `serveurs_powerdns` actif existe ; +- qu'un serveur `serveur_powerdns` actif existe ; - que la zone repond a une requete SOA ; - que le nom de l'hote existe dans la zone. La modification du resolver local est protegee : ```yaml -clients_dns_apply: true -clients_dns_confirm: true +client_dns_apply: true +client_dns_confirm: true ``` Sans ces deux variables, le role valide les prerequis mais ne modifie pas `/etc/resolv.conf`. diff --git a/docs/domaines.yml b/docs/domaines.yml index 8c23ee6..1cda97e 100644 --- a/docs/domaines.yml +++ b/docs/domaines.yml @@ -18,12 +18,12 @@ # secondaires : NS publics (FQDN) faisant face a Internet (a renseigner) # dnssec : signature de la zone (jalon ulterieur ; false au depart) # ttl : TTL par defaut de la zone -# mail : mx / spf / dmarc (lies a serveurs_sendmail) ; vides si pas de mail +# mail : mx / spf / dmarc (lies a serveur_sendmail) ; vides si pas de mail domaines_publics: alliance-boreale.ca: autorite: primaire-cache - edge: serveurs_nginx + edge: serveur_nginx secondaires: [] # FQDN des NS publics secondaires - a renseigner dnssec: false # jalon ulterieur (DS chez le registraire d'abord) ttl: 3600 diff --git a/docs/nomenclature-vm.md b/docs/nomenclature-vm.md index 1ea066a..e1da5d3 100644 --- a/docs/nomenclature-vm.md +++ b/docs/nomenclature-vm.md @@ -32,9 +32,9 @@ web-dorsal-01 La couche applicative web suit le même format. Le tier est porté par la fonction, au singulier puisqu'il nomme une instance : ```text -web-frontal-01 présentation web (UI, rendu, assets), groupe serveurs_web_frontaux +web-frontal-01 présentation web (UI, rendu, assets), groupe serveur_web_frontal web-frontal-02 -web-dorsal-01 application web (API, traitement), groupe serveurs_web_dorsaux +web-dorsal-01 application web (API, traitement), groupe serveur_web_dorsal ``` Les anciens noms de test `web-01` et `web-02` sont retirés. Ils ne doivent pas être réutilisés comme noms de production : préférer `web-frontal-NN` et `web-dorsal-NN`. @@ -43,18 +43,18 @@ Les anciens noms de test `web-01` et `web-02` sont retirés. Ils ne doivent pas | Hôte | Groupes prévus | | --- | --- | -| `infra-pki-01` | `serveurs_step_ca` | -| `infra-edge-01` | `serveurs_nginx` | -| `infra-mail-01` | `serveurs_sendmail` | -| `infra-dns-01` | `serveurs_powerdns` | -| `idm-01` | `serveurs_openldap`, `serveurs_keycloak` | -| `data-01` | `serveurs_postgresql`, `serveurs_redis` | -| `obs-01` | `serveurs_prometheus`, `serveurs_loki`, `serveurs_grafana` | -| `mon-01` | `serveurs_icinga` | -| `forge-01` | `serveurs_forgejo` | -| `collab-01` | `serveurs_nextcloud`, `serveurs_collabora` | -| `web-frontal-01`, `web-frontal-02` | `serveurs_web_frontaux` | -| `web-dorsal-01` | `serveurs_web_dorsaux` | +| `infra-pki-01` | `serveur_step_ca` | +| `infra-edge-01` | `serveur_nginx` | +| `infra-mail-01` | `serveur_sendmail` | +| `infra-dns-01` | `serveur_powerdns` | +| `idm-01` | `serveur_openldap`, `serveur_keycloak` | +| `data-01` | `serveur_postgresql`, `serveur_redis` | +| `obs-01` | `serveur_prometheus`, `serveur_loki`, `serveur_grafana` | +| `mon-01` | `serveur_icinga` | +| `forge-01` | `serveur_forgejo` | +| `collab-01` | `serveur_nextcloud`, `serveur_collabora` | +| `web-frontal-01`, `web-frontal-02` | `serveur_web_frontal` | +| `web-dorsal-01` | `serveur_web_dorsal` | Les groupes restent fins et composables. La cohabitation se fait en associant plusieurs groupes au même hôte. diff --git a/docs/plan-et-generation.md b/docs/plan-et-generation.md index 64574c1..8597395 100644 --- a/docs/plan-et-generation.md +++ b/docs/plan-et-generation.md @@ -51,7 +51,7 @@ Tous sous `docs/`, machine-lisibles, validés, consommés par le GUI, le CLI et Une application reçoit les bases où `(portee=application ET consommateur=elle)` OU `(portee=groupe ET consommateur=son groupe)` OU `(portee=hote ET consommateur=son hôte)`. - **Exposition DNS** : `application.expose: [fqdn]` + l'`edge` du domaine parent → - `serveurs_nginx` génère le vhost (`application → hôte → IP:port`). + `serveur_nginx` génère le vhost (`application → hôte → IP:port`). --- @@ -61,7 +61,7 @@ Tous sous `docs/`, machine-lisibles, validés, consommés par le GUI, le CLI et - **host vars** : `ansible_host`/`ansible_user` + `proxmox_*` (IP/VMID/VLAN/passerelle **dérivés** de la nomenclature ; placement/taille depuis `serveurs.yml`). -- **groupes** d'une VM = socle (`serveurs_debian` + `serveurs_durcis`) +- **groupes** d'une VM = socle (`serveur_debian` + `serveur_durci`) + **services** (les `groupe` des applications de l'hôte) + **intégrations** (`serveurs.yml: integrations`) + **état** (`hotes_actifs` / `hotes_planifies`). @@ -134,7 +134,7 @@ registres + **`node --check` du JS du GUI**). La règle de résolution vit **une seule fois**, en Python (`scripts/inventory_rules.py`), et est exposée à Ansible par un *filter plugin* (`filter_plugins/registres.py`) : `bases_de_application`, `applications_de_hote`, `expositions_des_applications`, -`chaine_connexion`. Les playbooks par application (`serveurs_web_dorsaux`/`_frontaux`) +`chaine_connexion`. Les playbooks par application (`serveur_web_dorsal`/`_frontaux`) itèrent ainsi sur les applications de l'hôte et résolvent leurs DSN. --- diff --git a/docs/procedure-template-debian13-proxmox.md b/docs/procedure-template-debian13-proxmox.md index 63e02e6..11abfb7 100644 --- a/docs/procedure-template-debian13-proxmox.md +++ b/docs/procedure-template-debian13-proxmox.md @@ -766,7 +766,7 @@ make creer-vm \ VLAN=11 \ ADRESSE_IP=10.1.15.31 \ PASSERELLE=10.1.15.1 \ - GROUPES="serveurs_debian serveurs_durcis" + GROUPES="serveur_debian serveur_durci" ``` Le VLAN est volontairement saisi au moment de créer chaque VM. Il ne fait pas partie des valeurs persistantes de `make config`. diff --git a/docs/serveurs.yml b/docs/serveurs.yml index f972f9f..a2a7e3b 100644 --- a/docs/serveurs.yml +++ b/docs/serveurs.yml @@ -12,7 +12,7 @@ serveurs: memoire: 2048 coeurs: 2 integrations: - - clients_dns + - client_dns data-01: fonction: data etat: planifie @@ -92,8 +92,8 @@ serveurs: memoire: 2048 coeurs: 2 integrations: - - clients_dns - - clients_supervision + - client_dns + - client_supervision web-frontal-02: fonction: web-frontal etat: planifie diff --git a/docs/vm-lifecycle.md b/docs/vm-lifecycle.md index 9ff3dad..978dbc5 100644 --- a/docs/vm-lifecycle.md +++ b/docs/vm-lifecycle.md @@ -107,15 +107,15 @@ Les hôtes joignables par Ansible sont dans `hotes_actifs`. Chaque groupe opérationnel doit avoir un playbook homonyme : ```text -serveurs_debian -> playbooks/groupes/serveurs_debian.yml -serveurs_durcis -> playbooks/groupes/serveurs_durcis.yml +serveur_debian -> playbooks/groupes/serveur_debian.yml +serveur_durci -> playbooks/groupes/serveur_durci.yml ``` L'appartenance aux groupes devient la déclaration d'intention : ```text -web-frontal-01 dans serveurs_debian -> applique le socle Debian -web-frontal-01 dans serveurs_durcis -> applique le durcissement commun +web-frontal-01 dans serveur_debian -> applique le socle Debian +web-frontal-01 dans serveur_durci -> applique le durcissement commun ``` Un groupe sans playbook ne doit pas être assigné à une VM de production. @@ -124,18 +124,18 @@ Un playbook de groupe peut être un contrat temporaire sans rôle tant que le se ## 6. Socle Debian -Le groupe `serveurs_debian` maintient les composants de base : +Le groupe `serveur_debian` maintient les composants de base : ```bash -make deployer-groupe GROUPE=serveurs_debian +make deployer-groupe GROUPE=serveur_debian ``` ## 7. Hardening commun -Le groupe `serveurs_durcis` maintient les couches de sécurité communes : +Le groupe `serveur_durci` maintient les couches de sécurité communes : ```bash -make deployer-groupe GROUPE=serveurs_durcis +make deployer-groupe GROUPE=serveur_durci ``` L'accès SSH par mot de passe est désactivé dès le socle. L'activation de nftables doit rester dépendante des règles réseau propres au rôle du serveur. @@ -145,7 +145,7 @@ L'accès SSH par mot de passe est désactivé dès le socle. L'activation de nft Pour une VM déjà clonée et démarrée : ```bash -make hote-ajouter HOTE=web-frontal-01 VMID=95301 ADRESSE_IP=10.1.15.31 GROUPES="serveurs_debian serveurs_durcis" +make hote-ajouter HOTE=web-frontal-01 VMID=95301 ADRESSE_IP=10.1.15.31 GROUPES="serveur_debian serveur_durci" make deployer HOTE=web-frontal-01 ``` @@ -154,15 +154,15 @@ La cible `deployer` lit les groupes de l'hôte, cherche les playbooks correspond Ensuite, elle lance la vérification post-déploiement : ```text -playbooks/groupes/serveurs_debian.yml -playbooks/groupes/serveurs_durcis.yml +playbooks/groupes/serveur_debian.yml +playbooks/groupes/serveur_durci.yml verifier-hote ``` Pour converger un groupe complet : ```bash -make deployer-groupe GROUPE=serveurs_debian +make deployer-groupe GROUPE=serveur_debian ``` Cette commande limite le playbook au croisement entre le groupe demandé et `hotes_actifs`. @@ -171,7 +171,7 @@ Cette commande limite le playbook au croisement entre le groupe demandé et `hot Les variables du template servent à construire le golden template dans `inventories/lab/group_vars/modeles_vm.yml`. -Les variables de conformité servent aux VM déployées dans `inventories/production/group_vars/serveurs_debian.yml`. +Les variables de conformité servent aux VM déployées dans `inventories/production/group_vars/serveur_debian.yml`. Différence attendue : diff --git a/inventories/lab/hosts.yml b/inventories/lab/hosts.yml index 6b58664..bfae9d5 100644 --- a/inventories/lab/hosts.yml +++ b/inventories/lab/hosts.yml @@ -7,16 +7,16 @@ all: ansible_user: ansible ansible_become: true - serveurs_debian: + serveur_debian: hosts: {} - serveurs_durcis: + serveur_durci: hosts: {} - serveurs_web_frontaux: + serveur_web_frontal: hosts: {} - serveurs_web_dorsaux: + serveur_web_dorsal: hosts: {} hotes_proxmox: diff --git a/inventories/production/group_vars/all.yml b/inventories/production/group_vars/all.yml index a8eb687..9b77ce6 100644 --- a/inventories/production/group_vars/all.yml +++ b/inventories/production/group_vars/all.yml @@ -1,3 +1,3 @@ --- # Variables globales de production. -# Les politiques Debian communes sont dans group_vars/serveurs_debian.yml. +# Les politiques Debian communes sont dans group_vars/serveur_debian.yml. diff --git a/inventories/production/group_vars/clients_dns.yml b/inventories/production/group_vars/client_dns.yml similarity index 56% rename from inventories/production/group_vars/clients_dns.yml rename to inventories/production/group_vars/client_dns.yml index 7d007b8..e532da0 100644 --- a/inventories/production/group_vars/clients_dns.yml +++ b/inventories/production/group_vars/client_dns.yml @@ -1,11 +1,11 @@ --- # Variables de l'intégration cliente DNS. -clients_dns_zone: "chezlepro.internal" -clients_dns_search_domains: - - "{{ clients_dns_zone }}" +client_dns_zone: "chezlepro.internal" +client_dns_search_domains: + - "{{ client_dns_zone }}" # La modification du resolver est protegee. Activer ces deux variables seulement # lorsque le serveur DNS interne et la zone ont ete verifies. -clients_dns_apply: false -clients_dns_confirm: false +client_dns_apply: false +client_dns_confirm: false diff --git a/inventories/production/group_vars/client_ldap.yml b/inventories/production/group_vars/client_ldap.yml new file mode 100644 index 0000000..b6ee976 --- /dev/null +++ b/inventories/production/group_vars/client_ldap.yml @@ -0,0 +1,8 @@ +--- +# Conformite identite utilisateur cliente (hotes authentifiant via OpenLDAP). + +client_ldap_uri: "ldap://idm-01.chezlepro.internal" +client_ldap_base_dn: "dc=chezlepro,dc=internal" + +# Bind anonyme par defaut. Pour un compte de lecture dedie, definir ici +# client_ldap_bind_dn et client_ldap_bind_password ("{{ vault_ldap_sssd }}" via Vault). diff --git a/inventories/production/group_vars/client_pki.yml b/inventories/production/group_vars/client_pki.yml new file mode 100644 index 0000000..472a99a --- /dev/null +++ b/inventories/production/group_vars/client_pki.yml @@ -0,0 +1,11 @@ +--- +# Conformite PKI cliente (tout hote devant une identite machine). + +client_pki_ca_url: "https://infra-pki-01.chezlepro.internal:8443" +client_pki_provisioner: "admin@chezlepro.internal" + +# Secrets OBLIGATOIRES, a fournir via Ansible Vault avant tout deploiement reel : +# client_pki_ca_fingerprint: "{{ vault_step_ca_fingerprint }}" +# client_pki_provisioner_password: "{{ vault_step_ca_provisioner_password }}" +# Le provisioner password est PARTAGE avec serveur_step_ca : le placer dans un +# vault partage (ex. group_vars/all/) lisible par les deux groupes. diff --git a/inventories/production/group_vars/client_smtp.yml b/inventories/production/group_vars/client_smtp.yml new file mode 100644 index 0000000..494156d --- /dev/null +++ b/inventories/production/group_vars/client_smtp.yml @@ -0,0 +1,5 @@ +--- +# Conformite relais mail client (hotes relayant vers serveur_sendmail). + +client_smtp_relais: "infra-mail-01.chezlepro.internal" +client_smtp_port: 25 diff --git a/inventories/production/group_vars/clients_ldap.yml b/inventories/production/group_vars/clients_ldap.yml deleted file mode 100644 index ff5ecba..0000000 --- a/inventories/production/group_vars/clients_ldap.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -# Conformite identite utilisateur cliente (hotes authentifiant via OpenLDAP). - -clients_ldap_uri: "ldap://idm-01.chezlepro.internal" -clients_ldap_base_dn: "dc=chezlepro,dc=internal" - -# Bind anonyme par defaut. Pour un compte de lecture dedie, definir ici -# clients_ldap_bind_dn et clients_ldap_bind_password ("{{ vault_ldap_sssd }}" via Vault). diff --git a/inventories/production/group_vars/clients_pki.yml b/inventories/production/group_vars/clients_pki.yml index cd956ca..472a99a 100644 --- a/inventories/production/group_vars/clients_pki.yml +++ b/inventories/production/group_vars/clients_pki.yml @@ -1,11 +1,11 @@ --- # Conformite PKI cliente (tout hote devant une identite machine). -clients_pki_ca_url: "https://infra-pki-01.chezlepro.internal:8443" -clients_pki_provisioner: "admin@chezlepro.internal" +client_pki_ca_url: "https://infra-pki-01.chezlepro.internal:8443" +client_pki_provisioner: "admin@chezlepro.internal" # Secrets OBLIGATOIRES, a fournir via Ansible Vault avant tout deploiement reel : -# clients_pki_ca_fingerprint: "{{ vault_step_ca_fingerprint }}" -# clients_pki_provisioner_password: "{{ vault_step_ca_provisioner_password }}" -# Le provisioner password est PARTAGE avec serveurs_step_ca : le placer dans un +# client_pki_ca_fingerprint: "{{ vault_step_ca_fingerprint }}" +# client_pki_provisioner_password: "{{ vault_step_ca_provisioner_password }}" +# Le provisioner password est PARTAGE avec serveur_step_ca : le placer dans un # vault partage (ex. group_vars/all/) lisible par les deux groupes. diff --git a/inventories/production/group_vars/clients_smtp.yml b/inventories/production/group_vars/clients_smtp.yml deleted file mode 100644 index 4906980..0000000 --- a/inventories/production/group_vars/clients_smtp.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -# Conformite relais mail client (hotes relayant vers serveurs_sendmail). - -clients_smtp_relais: "infra-mail-01.chezlepro.internal" -clients_smtp_port: 25 diff --git a/inventories/production/group_vars/serveurs_debian.yml b/inventories/production/group_vars/serveur_debian.yml similarity index 100% rename from inventories/production/group_vars/serveurs_debian.yml rename to inventories/production/group_vars/serveur_debian.yml diff --git a/inventories/production/group_vars/serveur_forgejo.yml b/inventories/production/group_vars/serveur_forgejo.yml new file mode 100644 index 0000000..4fbbfb4 --- /dev/null +++ b/inventories/production/group_vars/serveur_forgejo.yml @@ -0,0 +1,9 @@ +--- +# Conformite Forgejo (forge-01, VLAN 15). + +serveur_forgejo_hostname: "forge.chezlepro.internal" +serveur_forgejo_db_host: "10.1.13.11" # data-01 + +# Secrets OBLIGATOIRES via Ansible Vault (vault partage pour vault_bd_forgejo) : +# serveur_forgejo_secret_key, serveur_forgejo_internal_token, +# serveur_forgejo_admin_password, vault_bd_forgejo diff --git a/inventories/production/group_vars/serveur_grafana.yml b/inventories/production/group_vars/serveur_grafana.yml new file mode 100644 index 0000000..b083a02 --- /dev/null +++ b/inventories/production/group_vars/serveur_grafana.yml @@ -0,0 +1,8 @@ +--- +# Conformite Grafana (obs-01, VLAN 14). + +serveur_grafana_hostname: "grafana.chezlepro.internal" + +# Secret OBLIGATOIRE, a fournir via Ansible Vault avant tout deploiement reel : +# serveur_grafana_admin_password: "{{ vault_grafana_admin }}" +# Convertir en dossier group_vars/serveur_grafana/ avec main.yml + vault.yml (chiffre). diff --git a/inventories/production/group_vars/serveur_icinga.yml b/inventories/production/group_vars/serveur_icinga.yml new file mode 100644 index 0000000..b45cab7 --- /dev/null +++ b/inventories/production/group_vars/serveur_icinga.yml @@ -0,0 +1,8 @@ +--- +# Conformite supervision Icinga (mon-01, VLAN 14). + +serveur_icinga_db_host: "10.1.13.11" # data-01 (serveur_postgresql) + +# Secret BD OBLIGATOIRE, a fournir via Ansible Vault (partage avec serveur_postgresql) : +# vault_bd_icingadb: "..." +# A placer dans un vault partage (ex. group_vars/all/) lisible par les deux groupes. diff --git a/inventories/production/group_vars/serveur_keycloak.yml b/inventories/production/group_vars/serveur_keycloak.yml new file mode 100644 index 0000000..c8b62c4 --- /dev/null +++ b/inventories/production/group_vars/serveur_keycloak.yml @@ -0,0 +1,12 @@ +--- +# Conformite Keycloak (idm-01, VLAN 12). + +serveur_keycloak_hostname: "keycloak.chezlepro.internal" +serveur_keycloak_db_host: "10.1.13.11" # data-01 (serveur_postgresql) + +# Secrets OBLIGATOIRES, a fournir via Ansible Vault avant tout deploiement reel : +# - serveur_keycloak_admin_password: "{{ vault_keycloak_admin }}" (admin bootstrap) +# - vault_bd_keycloak: "..." (mot de passe BD, partage avec serveur_postgresql) +# Convertir en dossier group_vars/serveur_keycloak/ avec main.yml (clair) + vault.yml (chiffre). +# Le secret BD (vault_bd_keycloak) doit etre lisible aussi par serveur_postgresql +# (placer dans un vault partage, ex. group_vars/all/). diff --git a/inventories/production/group_vars/serveur_nginx.yml b/inventories/production/group_vars/serveur_nginx.yml new file mode 100644 index 0000000..641b98c --- /dev/null +++ b/inventories/production/group_vars/serveur_nginx.yml @@ -0,0 +1,9 @@ +--- +# Conformite nginx / edge (infra-edge-01, VLAN 11). + +# Sites de reverse proxy : a declarer ici quand un service web doit etre publie. +# L'amont pointe vers l'IP interne et le port du service (cf. nomenclature). +serveur_nginx_sites: [] +# - nom: forge +# domaine: forge.chezlepro.internal +# amont: "http://10.1.15.11:3000" diff --git a/inventories/production/group_vars/serveurs_openldap.yml b/inventories/production/group_vars/serveur_openldap.yml similarity index 54% rename from inventories/production/group_vars/serveurs_openldap.yml rename to inventories/production/group_vars/serveur_openldap.yml index 9cd0877..a3951c1 100644 --- a/inventories/production/group_vars/serveurs_openldap.yml +++ b/inventories/production/group_vars/serveur_openldap.yml @@ -1,11 +1,11 @@ --- # Conformite annuaire OpenLDAP (idm-01, VLAN 12). -serveurs_openldap_domaine: "chezlepro.internal" -serveurs_openldap_organisation: "Chezlepro Inc" +serveur_openldap_domaine: "chezlepro.internal" +serveur_openldap_organisation: "Chezlepro Inc" # Secret OBLIGATOIRE, a fournir via Ansible Vault avant tout deploiement reel. -# Convertir en dossier group_vars/serveurs_openldap/ avec : -# main.yml : serveurs_openldap_admin_password: "{{ vault_openldap_admin }}" +# Convertir en dossier group_vars/serveur_openldap/ avec : +# main.yml : serveur_openldap_admin_password: "{{ vault_openldap_admin }}" # vault.yml : vault_openldap_admin: "..." (chiffre ansible-vault) # Tant qu'il est absent, le role refuse de s'executer (assertion explicite). diff --git a/inventories/production/group_vars/serveurs_postgresql.yml b/inventories/production/group_vars/serveur_postgresql.yml similarity index 69% rename from inventories/production/group_vars/serveurs_postgresql.yml rename to inventories/production/group_vars/serveur_postgresql.yml index 38933bf..ff574d9 100644 --- a/inventories/production/group_vars/serveurs_postgresql.yml +++ b/inventories/production/group_vars/serveur_postgresql.yml @@ -1,10 +1,10 @@ --- # Conformite PostgreSQL (zone donnees, VLAN 13). -serveurs_postgresql_reseaux_autorises: +serveur_postgresql_reseaux_autorises: - "10.1.0.0/16" # Comptes et bases applicatifs : a declarer ici quand un service en a besoin, # avec les mots de passe references depuis Ansible Vault (jamais en clair). -serveurs_postgresql_comptes: [] -serveurs_postgresql_bases: [] +serveur_postgresql_comptes: [] +serveur_postgresql_bases: [] diff --git a/inventories/production/group_vars/serveur_powerdns.yml b/inventories/production/group_vars/serveur_powerdns.yml new file mode 100644 index 0000000..2dd5377 --- /dev/null +++ b/inventories/production/group_vars/serveur_powerdns.yml @@ -0,0 +1,13 @@ +--- +# Variables du service DNS interne PowerDNS. + +serveur_powerdns_zone: "chezlepro.internal" +serveur_powerdns_nameserver: "ns1" +serveur_powerdns_contact: "hostmaster.chezlepro.internal" +serveur_powerdns_serial: 2026062201 +serveur_powerdns_inventory_groups: + - hotes_actifs +serveur_powerdns_records: + - name: "dns" + type: "CNAME" + value: "ns1.{{ serveur_powerdns_zone }}." diff --git a/inventories/production/group_vars/serveur_redis.yml b/inventories/production/group_vars/serveur_redis.yml new file mode 100644 index 0000000..7e9dadb --- /dev/null +++ b/inventories/production/group_vars/serveur_redis.yml @@ -0,0 +1,8 @@ +--- +# Conformite Redis (data-01, VLAN 13). + +serveur_redis_maxmemory: "256mb" + +# Secret OBLIGATOIRE, a fournir via Ansible Vault avant tout deploiement reel : +# serveur_redis_password: "{{ vault_redis }}" +# Convertir en dossier group_vars/serveur_redis/ avec main.yml + vault.yml (chiffre). diff --git a/inventories/production/group_vars/serveurs_sendmail.yml b/inventories/production/group_vars/serveur_sendmail.yml similarity index 62% rename from inventories/production/group_vars/serveurs_sendmail.yml rename to inventories/production/group_vars/serveur_sendmail.yml index 7686945..8e5ff44 100644 --- a/inventories/production/group_vars/serveurs_sendmail.yml +++ b/inventories/production/group_vars/serveur_sendmail.yml @@ -1,11 +1,11 @@ --- # Conformite relais SMTP (infra-mail-01, VLAN 11). -serveurs_sendmail_domaine: "chezlepro.internal" -serveurs_sendmail_reseaux_autorises: +serveur_sendmail_domaine: "chezlepro.internal" +serveur_sendmail_reseaux_autorises: - "127.0.0.0/8" - "[::1]/128" - "10.1.0.0/16" # Smarthost amont : vide = remise directe. A renseigner si relais externe requis. -serveurs_sendmail_smarthost: "" +serveur_sendmail_smarthost: "" diff --git a/inventories/production/group_vars/serveur_step_ca.yml b/inventories/production/group_vars/serveur_step_ca.yml new file mode 100644 index 0000000..a5247c4 --- /dev/null +++ b/inventories/production/group_vars/serveur_step_ca.yml @@ -0,0 +1,16 @@ +--- +# Conformite AC interne step-ca (infra-pki-01, VLAN 11). + +serveur_step_ca_nom: "Chezlepro Internal CA" +serveur_step_ca_adresse: ":8443" +serveur_step_ca_acme: true + +# Secrets OBLIGATOIRES, a fournir via Ansible Vault avant tout deploiement reel. +# Convertir ce fichier en dossier group_vars/serveur_step_ca/ avec : +# main.yml (en clair) : +# serveur_step_ca_password: "{{ vault_step_ca_password }}" +# serveur_step_ca_provisioner_password: "{{ vault_step_ca_provisioner_password }}" +# vault.yml (chiffre ansible-vault) : +# vault_step_ca_password: "..." +# vault_step_ca_provisioner_password: "..." +# Tant qu'ils sont absents, le role refuse de s'executer (assertion explicite). diff --git a/inventories/production/group_vars/serveurs_forgejo.yml b/inventories/production/group_vars/serveurs_forgejo.yml deleted file mode 100644 index 2d5ac12..0000000 --- a/inventories/production/group_vars/serveurs_forgejo.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -# Conformite Forgejo (forge-01, VLAN 15). - -serveurs_forgejo_hostname: "forge.chezlepro.internal" -serveurs_forgejo_db_host: "10.1.13.11" # data-01 - -# Secrets OBLIGATOIRES via Ansible Vault (vault partage pour vault_bd_forgejo) : -# serveurs_forgejo_secret_key, serveurs_forgejo_internal_token, -# serveurs_forgejo_admin_password, vault_bd_forgejo diff --git a/inventories/production/group_vars/serveurs_grafana.yml b/inventories/production/group_vars/serveurs_grafana.yml deleted file mode 100644 index 5273779..0000000 --- a/inventories/production/group_vars/serveurs_grafana.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -# Conformite Grafana (obs-01, VLAN 14). - -serveurs_grafana_hostname: "grafana.chezlepro.internal" - -# Secret OBLIGATOIRE, a fournir via Ansible Vault avant tout deploiement reel : -# serveurs_grafana_admin_password: "{{ vault_grafana_admin }}" -# Convertir en dossier group_vars/serveurs_grafana/ avec main.yml + vault.yml (chiffre). diff --git a/inventories/production/group_vars/serveurs_icinga.yml b/inventories/production/group_vars/serveurs_icinga.yml index 28bf721..b45cab7 100644 --- a/inventories/production/group_vars/serveurs_icinga.yml +++ b/inventories/production/group_vars/serveurs_icinga.yml @@ -1,8 +1,8 @@ --- # Conformite supervision Icinga (mon-01, VLAN 14). -serveurs_icinga_db_host: "10.1.13.11" # data-01 (serveurs_postgresql) +serveur_icinga_db_host: "10.1.13.11" # data-01 (serveur_postgresql) -# Secret BD OBLIGATOIRE, a fournir via Ansible Vault (partage avec serveurs_postgresql) : +# Secret BD OBLIGATOIRE, a fournir via Ansible Vault (partage avec serveur_postgresql) : # vault_bd_icingadb: "..." # A placer dans un vault partage (ex. group_vars/all/) lisible par les deux groupes. diff --git a/inventories/production/group_vars/serveurs_keycloak.yml b/inventories/production/group_vars/serveurs_keycloak.yml index 26788f1..c8b62c4 100644 --- a/inventories/production/group_vars/serveurs_keycloak.yml +++ b/inventories/production/group_vars/serveurs_keycloak.yml @@ -1,12 +1,12 @@ --- # Conformite Keycloak (idm-01, VLAN 12). -serveurs_keycloak_hostname: "keycloak.chezlepro.internal" -serveurs_keycloak_db_host: "10.1.13.11" # data-01 (serveurs_postgresql) +serveur_keycloak_hostname: "keycloak.chezlepro.internal" +serveur_keycloak_db_host: "10.1.13.11" # data-01 (serveur_postgresql) # Secrets OBLIGATOIRES, a fournir via Ansible Vault avant tout deploiement reel : -# - serveurs_keycloak_admin_password: "{{ vault_keycloak_admin }}" (admin bootstrap) -# - vault_bd_keycloak: "..." (mot de passe BD, partage avec serveurs_postgresql) -# Convertir en dossier group_vars/serveurs_keycloak/ avec main.yml (clair) + vault.yml (chiffre). -# Le secret BD (vault_bd_keycloak) doit etre lisible aussi par serveurs_postgresql +# - serveur_keycloak_admin_password: "{{ vault_keycloak_admin }}" (admin bootstrap) +# - vault_bd_keycloak: "..." (mot de passe BD, partage avec serveur_postgresql) +# Convertir en dossier group_vars/serveur_keycloak/ avec main.yml (clair) + vault.yml (chiffre). +# Le secret BD (vault_bd_keycloak) doit etre lisible aussi par serveur_postgresql # (placer dans un vault partage, ex. group_vars/all/). diff --git a/inventories/production/group_vars/serveurs_nginx.yml b/inventories/production/group_vars/serveurs_nginx.yml index de6c813..641b98c 100644 --- a/inventories/production/group_vars/serveurs_nginx.yml +++ b/inventories/production/group_vars/serveurs_nginx.yml @@ -3,7 +3,7 @@ # Sites de reverse proxy : a declarer ici quand un service web doit etre publie. # L'amont pointe vers l'IP interne et le port du service (cf. nomenclature). -serveurs_nginx_sites: [] +serveur_nginx_sites: [] # - nom: forge # domaine: forge.chezlepro.internal # amont: "http://10.1.15.11:3000" diff --git a/inventories/production/group_vars/serveurs_powerdns.yml b/inventories/production/group_vars/serveurs_powerdns.yml deleted file mode 100644 index d351f1e..0000000 --- a/inventories/production/group_vars/serveurs_powerdns.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -# Variables du service DNS interne PowerDNS. - -serveurs_powerdns_zone: "chezlepro.internal" -serveurs_powerdns_nameserver: "ns1" -serveurs_powerdns_contact: "hostmaster.chezlepro.internal" -serveurs_powerdns_serial: 2026062201 -serveurs_powerdns_inventory_groups: - - hotes_actifs -serveurs_powerdns_records: - - name: "dns" - type: "CNAME" - value: "ns1.{{ serveurs_powerdns_zone }}." diff --git a/inventories/production/group_vars/serveurs_redis.yml b/inventories/production/group_vars/serveurs_redis.yml index 06e9e9a..7e9dadb 100644 --- a/inventories/production/group_vars/serveurs_redis.yml +++ b/inventories/production/group_vars/serveurs_redis.yml @@ -1,8 +1,8 @@ --- # Conformite Redis (data-01, VLAN 13). -serveurs_redis_maxmemory: "256mb" +serveur_redis_maxmemory: "256mb" # Secret OBLIGATOIRE, a fournir via Ansible Vault avant tout deploiement reel : -# serveurs_redis_password: "{{ vault_redis }}" -# Convertir en dossier group_vars/serveurs_redis/ avec main.yml + vault.yml (chiffre). +# serveur_redis_password: "{{ vault_redis }}" +# Convertir en dossier group_vars/serveur_redis/ avec main.yml + vault.yml (chiffre). diff --git a/inventories/production/group_vars/serveurs_step_ca.yml b/inventories/production/group_vars/serveurs_step_ca.yml index bc03deb..a5247c4 100644 --- a/inventories/production/group_vars/serveurs_step_ca.yml +++ b/inventories/production/group_vars/serveurs_step_ca.yml @@ -1,15 +1,15 @@ --- # Conformite AC interne step-ca (infra-pki-01, VLAN 11). -serveurs_step_ca_nom: "Chezlepro Internal CA" -serveurs_step_ca_adresse: ":8443" -serveurs_step_ca_acme: true +serveur_step_ca_nom: "Chezlepro Internal CA" +serveur_step_ca_adresse: ":8443" +serveur_step_ca_acme: true # Secrets OBLIGATOIRES, a fournir via Ansible Vault avant tout deploiement reel. -# Convertir ce fichier en dossier group_vars/serveurs_step_ca/ avec : +# Convertir ce fichier en dossier group_vars/serveur_step_ca/ avec : # main.yml (en clair) : -# serveurs_step_ca_password: "{{ vault_step_ca_password }}" -# serveurs_step_ca_provisioner_password: "{{ vault_step_ca_provisioner_password }}" +# serveur_step_ca_password: "{{ vault_step_ca_password }}" +# serveur_step_ca_provisioner_password: "{{ vault_step_ca_provisioner_password }}" # vault.yml (chiffre ansible-vault) : # vault_step_ca_password: "..." # vault_step_ca_provisioner_password: "..." diff --git a/inventories/production/hosts.yml b/inventories/production/hosts.yml index 0f31942..4c964dc 100644 --- a/inventories/production/hosts.yml +++ b/inventories/production/hosts.yml @@ -3,11 +3,11 @@ # Source : docs/serveurs.yml + docs/applications.yml + docs/nomenclature.yml. all: children: - clients_dns: + client_dns: hosts: collab-01: null web-frontal-01: null - clients_supervision: + client_supervision: hosts: web-frontal-01: null hotes_actifs: @@ -160,10 +160,10 @@ all: proxmox_vmid: 95302 modeles_vm: hosts: {} - serveurs_collabora: + serveur_collabora: hosts: collab-01: null - serveurs_debian: + serveur_debian: hosts: collab-01: null data-01: null @@ -178,7 +178,7 @@ all: web-dorsal-01: null web-frontal-01: null web-frontal-02: null - serveurs_durcis: + serveur_durci: hosts: collab-01: null data-01: null @@ -193,52 +193,52 @@ all: web-dorsal-01: null web-frontal-01: null web-frontal-02: null - serveurs_forgejo: + serveur_forgejo: hosts: forge-01: null - serveurs_grafana: + serveur_grafana: hosts: obs-01: null - serveurs_icinga: + serveur_icinga: hosts: mon-01: null - serveurs_keycloak: + serveur_keycloak: hosts: idm-01: null - serveurs_loki: + serveur_loki: hosts: obs-01: null - serveurs_nextcloud: + serveur_nextcloud: hosts: collab-01: null - serveurs_nginx: + serveur_nginx: hosts: infra-edge-01: null - serveurs_openldap: + serveur_openldap: hosts: idm-01: null - serveurs_postgresql: + serveur_postgresql: hosts: data-01: null - serveurs_powerdns: + serveur_powerdns: hosts: infra-dns-01: null - serveurs_prometheus: + serveur_prometheus: hosts: obs-01: null - serveurs_redis: + serveur_redis: hosts: data-01: null - serveurs_sendmail: + serveur_sendmail: hosts: infra-mail-01: null - serveurs_step_ca: + serveur_step_ca: hosts: infra-pki-01: null - serveurs_web_dorsaux: + serveur_web_dorsal: hosts: web-dorsal-01: null - serveurs_web_frontaux: + serveur_web_frontal: hosts: web-frontal-01: null web-frontal-02: null diff --git a/playbooks/groupes/clients_dns.yml b/playbooks/groupes/client_dns.yml similarity index 76% rename from playbooks/groupes/clients_dns.yml rename to playbooks/groupes/client_dns.yml index 73cf5a9..af888f0 100644 --- a/playbooks/groupes/clients_dns.yml +++ b/playbooks/groupes/client_dns.yml @@ -1,6 +1,6 @@ --- -- name: Appliquer le groupe clients_dns - hosts: clients_dns +- name: Appliquer le groupe client_dns + hosts: client_dns become: true gather_facts: true @@ -12,4 +12,4 @@ fail_msg: "Ce playbook est prévu pour Debian." roles: - - clients_dns + - client_dns diff --git a/playbooks/groupes/client_journal.yml b/playbooks/groupes/client_journal.yml new file mode 100644 index 0000000..6e8b30b --- /dev/null +++ b/playbooks/groupes/client_journal.yml @@ -0,0 +1,15 @@ +--- +- name: Appliquer le groupe client_journal + hosts: client_journal + become: true + gather_facts: true + + pre_tasks: + - name: Vérifier que la cible est Debian + ansible.builtin.assert: + that: + - ansible_facts.distribution == "Debian" + fail_msg: "Ce playbook est prévu pour Debian." + + roles: + - client_journal diff --git a/playbooks/groupes/clients_pki.yml b/playbooks/groupes/client_ldap.yml similarity index 76% rename from playbooks/groupes/clients_pki.yml rename to playbooks/groupes/client_ldap.yml index 87396f4..db053a0 100644 --- a/playbooks/groupes/clients_pki.yml +++ b/playbooks/groupes/client_ldap.yml @@ -1,6 +1,6 @@ --- -- name: Appliquer le groupe clients_pki - hosts: clients_pki +- name: Appliquer le groupe client_ldap + hosts: client_ldap become: true gather_facts: true @@ -12,4 +12,4 @@ fail_msg: "Ce playbook est prévu pour Debian." roles: - - clients_pki + - client_ldap diff --git a/playbooks/groupes/client_metrique.yml b/playbooks/groupes/client_metrique.yml new file mode 100644 index 0000000..5060135 --- /dev/null +++ b/playbooks/groupes/client_metrique.yml @@ -0,0 +1,15 @@ +--- +- name: Appliquer le groupe client_metrique + hosts: client_metrique + become: true + gather_facts: true + + pre_tasks: + - name: Vérifier que la cible est Debian + ansible.builtin.assert: + that: + - ansible_facts.distribution == "Debian" + fail_msg: "Ce playbook est prévu pour Debian." + + roles: + - client_metrique diff --git a/playbooks/groupes/clients_smtp.yml b/playbooks/groupes/client_pki.yml similarity index 76% rename from playbooks/groupes/clients_smtp.yml rename to playbooks/groupes/client_pki.yml index f30fa92..2b568d8 100644 --- a/playbooks/groupes/clients_smtp.yml +++ b/playbooks/groupes/client_pki.yml @@ -1,6 +1,6 @@ --- -- name: Appliquer le groupe clients_smtp - hosts: clients_smtp +- name: Appliquer le groupe client_pki + hosts: client_pki become: true gather_facts: true @@ -12,4 +12,4 @@ fail_msg: "Ce playbook est prévu pour Debian." roles: - - clients_smtp + - client_pki diff --git a/playbooks/groupes/serveurs_loki.yml b/playbooks/groupes/client_smtp.yml similarity index 75% rename from playbooks/groupes/serveurs_loki.yml rename to playbooks/groupes/client_smtp.yml index 9e488e2..9f2a771 100644 --- a/playbooks/groupes/serveurs_loki.yml +++ b/playbooks/groupes/client_smtp.yml @@ -1,6 +1,6 @@ --- -- name: Appliquer le groupe serveurs_loki - hosts: serveurs_loki +- name: Appliquer le groupe client_smtp + hosts: client_smtp become: true gather_facts: true @@ -12,4 +12,4 @@ fail_msg: "Ce playbook est prévu pour Debian." roles: - - serveurs_loki + - client_smtp diff --git a/playbooks/groupes/clients_supervision.yml b/playbooks/groupes/client_supervision.yml similarity index 70% rename from playbooks/groupes/clients_supervision.yml rename to playbooks/groupes/client_supervision.yml index 05cfd26..a9010f4 100644 --- a/playbooks/groupes/clients_supervision.yml +++ b/playbooks/groupes/client_supervision.yml @@ -1,10 +1,10 @@ --- -- name: Appliquer le groupe clients_supervision - hosts: clients_supervision +- name: Appliquer le groupe client_supervision + hosts: client_supervision become: true gather_facts: true tasks: - name: Indiquer que l'intégration cliente supervision reste à définir ansible.builtin.debug: - msg: "Aucun rôle n'est encore associé au groupe clients_supervision." + msg: "Aucun rôle n'est encore associé au groupe client_supervision." diff --git a/playbooks/groupes/clients_journaux.yml b/playbooks/groupes/clients_journaux.yml index 355415d..6e8b30b 100644 --- a/playbooks/groupes/clients_journaux.yml +++ b/playbooks/groupes/clients_journaux.yml @@ -1,6 +1,6 @@ --- -- name: Appliquer le groupe clients_journaux - hosts: clients_journaux +- name: Appliquer le groupe client_journal + hosts: client_journal become: true gather_facts: true @@ -12,4 +12,4 @@ fail_msg: "Ce playbook est prévu pour Debian." roles: - - clients_journaux + - client_journal diff --git a/playbooks/groupes/clients_ldap.yml b/playbooks/groupes/clients_ldap.yml index ccfaf5d..db053a0 100644 --- a/playbooks/groupes/clients_ldap.yml +++ b/playbooks/groupes/clients_ldap.yml @@ -1,6 +1,6 @@ --- -- name: Appliquer le groupe clients_ldap - hosts: clients_ldap +- name: Appliquer le groupe client_ldap + hosts: client_ldap become: true gather_facts: true @@ -12,4 +12,4 @@ fail_msg: "Ce playbook est prévu pour Debian." roles: - - clients_ldap + - client_ldap diff --git a/playbooks/groupes/serveur_collabora.yml b/playbooks/groupes/serveur_collabora.yml new file mode 100644 index 0000000..fa02013 --- /dev/null +++ b/playbooks/groupes/serveur_collabora.yml @@ -0,0 +1,10 @@ +--- +- name: Appliquer le groupe serveur_collabora + hosts: serveur_collabora + become: true + gather_facts: true + + tasks: + - name: Indiquer que le service Collabora reste à définir + ansible.builtin.debug: + msg: "Aucun rôle n'est encore associé au groupe serveur_collabora." diff --git a/playbooks/groupes/serveurs_debian.yml b/playbooks/groupes/serveur_debian.yml similarity index 85% rename from playbooks/groupes/serveurs_debian.yml rename to playbooks/groupes/serveur_debian.yml index da28a7d..e3f51c7 100644 --- a/playbooks/groupes/serveurs_debian.yml +++ b/playbooks/groupes/serveur_debian.yml @@ -1,6 +1,6 @@ --- -- name: Appliquer le groupe serveurs_debian - hosts: serveurs_debian +- name: Appliquer le groupe serveur_debian + hosts: serveur_debian become: true gather_facts: true diff --git a/playbooks/groupes/serveurs_durcis.yml b/playbooks/groupes/serveur_durci.yml similarity index 86% rename from playbooks/groupes/serveurs_durcis.yml rename to playbooks/groupes/serveur_durci.yml index 4286a1e..49f5ab0 100644 --- a/playbooks/groupes/serveurs_durcis.yml +++ b/playbooks/groupes/serveur_durci.yml @@ -1,6 +1,6 @@ --- -- name: Appliquer le groupe serveurs_durcis - hosts: serveurs_durcis +- name: Appliquer le groupe serveur_durci + hosts: serveur_durci become: true gather_facts: true diff --git a/playbooks/groupes/serveur_forgejo.yml b/playbooks/groupes/serveur_forgejo.yml new file mode 100644 index 0000000..8151193 --- /dev/null +++ b/playbooks/groupes/serveur_forgejo.yml @@ -0,0 +1,15 @@ +--- +- name: Appliquer le groupe serveur_forgejo + hosts: serveur_forgejo + become: true + gather_facts: true + + pre_tasks: + - name: Vérifier que la cible est Debian + ansible.builtin.assert: + that: + - ansible_facts.distribution == "Debian" + fail_msg: "Ce playbook est prévu pour Debian." + + roles: + - serveur_forgejo diff --git a/playbooks/groupes/serveur_grafana.yml b/playbooks/groupes/serveur_grafana.yml new file mode 100644 index 0000000..f424761 --- /dev/null +++ b/playbooks/groupes/serveur_grafana.yml @@ -0,0 +1,15 @@ +--- +- name: Appliquer le groupe serveur_grafana + hosts: serveur_grafana + become: true + gather_facts: true + + pre_tasks: + - name: Vérifier que la cible est Debian + ansible.builtin.assert: + that: + - ansible_facts.distribution == "Debian" + fail_msg: "Ce playbook est prévu pour Debian." + + roles: + - serveur_grafana diff --git a/playbooks/groupes/serveur_icinga.yml b/playbooks/groupes/serveur_icinga.yml new file mode 100644 index 0000000..badb998 --- /dev/null +++ b/playbooks/groupes/serveur_icinga.yml @@ -0,0 +1,15 @@ +--- +- name: Appliquer le groupe serveur_icinga + hosts: serveur_icinga + become: true + gather_facts: true + + pre_tasks: + - name: Vérifier que la cible est Debian + ansible.builtin.assert: + that: + - ansible_facts.distribution == "Debian" + fail_msg: "Ce playbook est prévu pour Debian." + + roles: + - serveur_icinga diff --git a/playbooks/groupes/serveurs_forgejo.yml b/playbooks/groupes/serveur_keycloak.yml similarity index 73% rename from playbooks/groupes/serveurs_forgejo.yml rename to playbooks/groupes/serveur_keycloak.yml index 6eeaae4..ff4a9fe 100644 --- a/playbooks/groupes/serveurs_forgejo.yml +++ b/playbooks/groupes/serveur_keycloak.yml @@ -1,6 +1,6 @@ --- -- name: Appliquer le groupe serveurs_forgejo - hosts: serveurs_forgejo +- name: Appliquer le groupe serveur_keycloak + hosts: serveur_keycloak become: true gather_facts: true @@ -12,4 +12,4 @@ fail_msg: "Ce playbook est prévu pour Debian." roles: - - serveurs_forgejo + - serveur_keycloak diff --git a/playbooks/groupes/serveur_loki.yml b/playbooks/groupes/serveur_loki.yml new file mode 100644 index 0000000..a13733f --- /dev/null +++ b/playbooks/groupes/serveur_loki.yml @@ -0,0 +1,15 @@ +--- +- name: Appliquer le groupe serveur_loki + hosts: serveur_loki + become: true + gather_facts: true + + pre_tasks: + - name: Vérifier que la cible est Debian + ansible.builtin.assert: + that: + - ansible_facts.distribution == "Debian" + fail_msg: "Ce playbook est prévu pour Debian." + + roles: + - serveur_loki diff --git a/playbooks/groupes/serveurs_nextcloud.yml b/playbooks/groupes/serveur_nextcloud.yml similarity index 69% rename from playbooks/groupes/serveurs_nextcloud.yml rename to playbooks/groupes/serveur_nextcloud.yml index b30ef6d..e7c318e 100644 --- a/playbooks/groupes/serveurs_nextcloud.yml +++ b/playbooks/groupes/serveur_nextcloud.yml @@ -1,10 +1,10 @@ --- -- name: Appliquer le groupe serveurs_nextcloud - hosts: serveurs_nextcloud +- name: Appliquer le groupe serveur_nextcloud + hosts: serveur_nextcloud become: true gather_facts: true tasks: - name: Indiquer que le service Nextcloud reste à définir ansible.builtin.debug: - msg: "Aucun rôle n'est encore associé au groupe serveurs_nextcloud." + msg: "Aucun rôle n'est encore associé au groupe serveur_nextcloud." diff --git a/playbooks/groupes/serveur_nginx.yml b/playbooks/groupes/serveur_nginx.yml new file mode 100644 index 0000000..0f961c4 --- /dev/null +++ b/playbooks/groupes/serveur_nginx.yml @@ -0,0 +1,15 @@ +--- +- name: Appliquer le groupe serveur_nginx + hosts: serveur_nginx + become: true + gather_facts: true + + pre_tasks: + - name: Vérifier que la cible est Debian + ansible.builtin.assert: + that: + - ansible_facts.distribution == "Debian" + fail_msg: "Ce playbook est prévu pour Debian." + + roles: + - serveur_nginx diff --git a/playbooks/groupes/serveur_openldap.yml b/playbooks/groupes/serveur_openldap.yml new file mode 100644 index 0000000..3194780 --- /dev/null +++ b/playbooks/groupes/serveur_openldap.yml @@ -0,0 +1,15 @@ +--- +- name: Appliquer le groupe serveur_openldap + hosts: serveur_openldap + become: true + gather_facts: true + + pre_tasks: + - name: Vérifier que la cible est Debian + ansible.builtin.assert: + that: + - ansible_facts.distribution == "Debian" + fail_msg: "Ce playbook est prévu pour Debian." + + roles: + - serveur_openldap diff --git a/playbooks/groupes/clients_metriques.yml b/playbooks/groupes/serveur_postgresql.yml similarity index 72% rename from playbooks/groupes/clients_metriques.yml rename to playbooks/groupes/serveur_postgresql.yml index 6744b18..c8491e2 100644 --- a/playbooks/groupes/clients_metriques.yml +++ b/playbooks/groupes/serveur_postgresql.yml @@ -1,6 +1,6 @@ --- -- name: Appliquer le groupe clients_metriques - hosts: clients_metriques +- name: Appliquer le groupe serveur_postgresql + hosts: serveur_postgresql become: true gather_facts: true @@ -12,4 +12,4 @@ fail_msg: "Ce playbook est prévu pour Debian." roles: - - clients_metriques + - serveur_postgresql diff --git a/playbooks/groupes/serveur_powerdns.yml b/playbooks/groupes/serveur_powerdns.yml new file mode 100644 index 0000000..c1bea7f --- /dev/null +++ b/playbooks/groupes/serveur_powerdns.yml @@ -0,0 +1,15 @@ +--- +- name: Appliquer le groupe serveur_powerdns + hosts: serveur_powerdns + become: true + gather_facts: true + + pre_tasks: + - name: Vérifier que la cible est Debian + ansible.builtin.assert: + that: + - ansible_facts.distribution == "Debian" + fail_msg: "Ce playbook est prévu pour Debian." + + roles: + - serveur_powerdns diff --git a/playbooks/groupes/serveur_prometheus.yml b/playbooks/groupes/serveur_prometheus.yml new file mode 100644 index 0000000..eeb1ea2 --- /dev/null +++ b/playbooks/groupes/serveur_prometheus.yml @@ -0,0 +1,15 @@ +--- +- name: Appliquer le groupe serveur_prometheus + hosts: serveur_prometheus + become: true + gather_facts: true + + pre_tasks: + - name: Vérifier que la cible est Debian + ansible.builtin.assert: + that: + - ansible_facts.distribution == "Debian" + fail_msg: "Ce playbook est prévu pour Debian." + + roles: + - serveur_prometheus diff --git a/playbooks/groupes/serveur_redis.yml b/playbooks/groupes/serveur_redis.yml new file mode 100644 index 0000000..cfa33e9 --- /dev/null +++ b/playbooks/groupes/serveur_redis.yml @@ -0,0 +1,15 @@ +--- +- name: Appliquer le groupe serveur_redis + hosts: serveur_redis + become: true + gather_facts: true + + pre_tasks: + - name: Vérifier que la cible est Debian + ansible.builtin.assert: + that: + - ansible_facts.distribution == "Debian" + fail_msg: "Ce playbook est prévu pour Debian." + + roles: + - serveur_redis diff --git a/playbooks/groupes/serveur_sendmail.yml b/playbooks/groupes/serveur_sendmail.yml new file mode 100644 index 0000000..4b2248c --- /dev/null +++ b/playbooks/groupes/serveur_sendmail.yml @@ -0,0 +1,15 @@ +--- +- name: Appliquer le groupe serveur_sendmail + hosts: serveur_sendmail + become: true + gather_facts: true + + pre_tasks: + - name: Vérifier que la cible est Debian + ansible.builtin.assert: + that: + - ansible_facts.distribution == "Debian" + fail_msg: "Ce playbook est prévu pour Debian." + + roles: + - serveur_sendmail diff --git a/playbooks/groupes/serveur_step_ca.yml b/playbooks/groupes/serveur_step_ca.yml new file mode 100644 index 0000000..a8af81c --- /dev/null +++ b/playbooks/groupes/serveur_step_ca.yml @@ -0,0 +1,15 @@ +--- +- name: Appliquer le groupe serveur_step_ca + hosts: serveur_step_ca + become: true + gather_facts: true + + pre_tasks: + - name: Vérifier que la cible est Debian + ansible.builtin.assert: + that: + - ansible_facts.distribution == "Debian" + fail_msg: "Ce playbook est prévu pour Debian." + + roles: + - serveur_step_ca diff --git a/playbooks/groupes/serveurs_web_dorsaux.yml b/playbooks/groupes/serveur_web_dorsal.yml similarity index 95% rename from playbooks/groupes/serveurs_web_dorsaux.yml rename to playbooks/groupes/serveur_web_dorsal.yml index 693167c..e35d4b0 100644 --- a/playbooks/groupes/serveurs_web_dorsaux.yml +++ b/playbooks/groupes/serveur_web_dorsal.yml @@ -1,6 +1,6 @@ --- -- name: Appliquer le groupe serveurs_web_dorsaux - hosts: serveurs_web_dorsaux +- name: Appliquer le groupe serveur_web_dorsal + hosts: serveur_web_dorsal become: true gather_facts: true diff --git a/playbooks/groupes/serveurs_web_frontaux.yml b/playbooks/groupes/serveur_web_frontal.yml similarity index 92% rename from playbooks/groupes/serveurs_web_frontaux.yml rename to playbooks/groupes/serveur_web_frontal.yml index f73a92c..64c6fa3 100644 --- a/playbooks/groupes/serveurs_web_frontaux.yml +++ b/playbooks/groupes/serveur_web_frontal.yml @@ -1,6 +1,6 @@ --- -- name: Appliquer le groupe serveurs_web_frontaux - hosts: serveurs_web_frontaux +- name: Appliquer le groupe serveur_web_frontal + hosts: serveur_web_frontal become: true gather_facts: true @@ -39,5 +39,5 @@ - name: Avertir si l'hote ne porte aucune application ansible.builtin.debug: - msg: "Aucune application declaree sur cet hote (docs/applications.yml). Couche presentation, derriere serveurs_nginx." + msg: "Aucune application declaree sur cet hote (docs/applications.yml). Couche presentation, derriere serveur_nginx." when: applications_hote | length == 0 diff --git a/playbooks/groupes/serveurs_collabora.yml b/playbooks/groupes/serveurs_collabora.yml index b73130e..fa02013 100644 --- a/playbooks/groupes/serveurs_collabora.yml +++ b/playbooks/groupes/serveurs_collabora.yml @@ -1,10 +1,10 @@ --- -- name: Appliquer le groupe serveurs_collabora - hosts: serveurs_collabora +- name: Appliquer le groupe serveur_collabora + hosts: serveur_collabora become: true gather_facts: true tasks: - name: Indiquer que le service Collabora reste à définir ansible.builtin.debug: - msg: "Aucun rôle n'est encore associé au groupe serveurs_collabora." + msg: "Aucun rôle n'est encore associé au groupe serveur_collabora." diff --git a/playbooks/groupes/serveurs_grafana.yml b/playbooks/groupes/serveurs_grafana.yml index f143620..f424761 100644 --- a/playbooks/groupes/serveurs_grafana.yml +++ b/playbooks/groupes/serveurs_grafana.yml @@ -1,6 +1,6 @@ --- -- name: Appliquer le groupe serveurs_grafana - hosts: serveurs_grafana +- name: Appliquer le groupe serveur_grafana + hosts: serveur_grafana become: true gather_facts: true @@ -12,4 +12,4 @@ fail_msg: "Ce playbook est prévu pour Debian." roles: - - serveurs_grafana + - serveur_grafana diff --git a/playbooks/groupes/serveurs_icinga.yml b/playbooks/groupes/serveurs_icinga.yml index 6143511..badb998 100644 --- a/playbooks/groupes/serveurs_icinga.yml +++ b/playbooks/groupes/serveurs_icinga.yml @@ -1,6 +1,6 @@ --- -- name: Appliquer le groupe serveurs_icinga - hosts: serveurs_icinga +- name: Appliquer le groupe serveur_icinga + hosts: serveur_icinga become: true gather_facts: true @@ -12,4 +12,4 @@ fail_msg: "Ce playbook est prévu pour Debian." roles: - - serveurs_icinga + - serveur_icinga diff --git a/playbooks/groupes/serveurs_keycloak.yml b/playbooks/groupes/serveurs_keycloak.yml deleted file mode 100644 index 1333719..0000000 --- a/playbooks/groupes/serveurs_keycloak.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -- name: Appliquer le groupe serveurs_keycloak - hosts: serveurs_keycloak - become: true - gather_facts: true - - pre_tasks: - - name: Vérifier que la cible est Debian - ansible.builtin.assert: - that: - - ansible_facts.distribution == "Debian" - fail_msg: "Ce playbook est prévu pour Debian." - - roles: - - serveurs_keycloak diff --git a/playbooks/groupes/serveurs_nginx.yml b/playbooks/groupes/serveurs_nginx.yml deleted file mode 100644 index 6937c5b..0000000 --- a/playbooks/groupes/serveurs_nginx.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -- name: Appliquer le groupe serveurs_nginx - hosts: serveurs_nginx - become: true - gather_facts: true - - pre_tasks: - - name: Vérifier que la cible est Debian - ansible.builtin.assert: - that: - - ansible_facts.distribution == "Debian" - fail_msg: "Ce playbook est prévu pour Debian." - - roles: - - serveurs_nginx diff --git a/playbooks/groupes/serveurs_openldap.yml b/playbooks/groupes/serveurs_openldap.yml index 123ab82..3194780 100644 --- a/playbooks/groupes/serveurs_openldap.yml +++ b/playbooks/groupes/serveurs_openldap.yml @@ -1,6 +1,6 @@ --- -- name: Appliquer le groupe serveurs_openldap - hosts: serveurs_openldap +- name: Appliquer le groupe serveur_openldap + hosts: serveur_openldap become: true gather_facts: true @@ -12,4 +12,4 @@ fail_msg: "Ce playbook est prévu pour Debian." roles: - - serveurs_openldap + - serveur_openldap diff --git a/playbooks/groupes/serveurs_postgresql.yml b/playbooks/groupes/serveurs_postgresql.yml index 4cd3e34..c8491e2 100644 --- a/playbooks/groupes/serveurs_postgresql.yml +++ b/playbooks/groupes/serveurs_postgresql.yml @@ -1,6 +1,6 @@ --- -- name: Appliquer le groupe serveurs_postgresql - hosts: serveurs_postgresql +- name: Appliquer le groupe serveur_postgresql + hosts: serveur_postgresql become: true gather_facts: true @@ -12,4 +12,4 @@ fail_msg: "Ce playbook est prévu pour Debian." roles: - - serveurs_postgresql + - serveur_postgresql diff --git a/playbooks/groupes/serveurs_powerdns.yml b/playbooks/groupes/serveurs_powerdns.yml deleted file mode 100644 index 334b69c..0000000 --- a/playbooks/groupes/serveurs_powerdns.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -- name: Appliquer le groupe serveurs_powerdns - hosts: serveurs_powerdns - become: true - gather_facts: true - - pre_tasks: - - name: Vérifier que la cible est Debian - ansible.builtin.assert: - that: - - ansible_facts.distribution == "Debian" - fail_msg: "Ce playbook est prévu pour Debian." - - roles: - - serveurs_powerdns diff --git a/playbooks/groupes/serveurs_prometheus.yml b/playbooks/groupes/serveurs_prometheus.yml deleted file mode 100644 index 448d16d..0000000 --- a/playbooks/groupes/serveurs_prometheus.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -- name: Appliquer le groupe serveurs_prometheus - hosts: serveurs_prometheus - become: true - gather_facts: true - - pre_tasks: - - name: Vérifier que la cible est Debian - ansible.builtin.assert: - that: - - ansible_facts.distribution == "Debian" - fail_msg: "Ce playbook est prévu pour Debian." - - roles: - - serveurs_prometheus diff --git a/playbooks/groupes/serveurs_redis.yml b/playbooks/groupes/serveurs_redis.yml deleted file mode 100644 index bebcc8f..0000000 --- a/playbooks/groupes/serveurs_redis.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -- name: Appliquer le groupe serveurs_redis - hosts: serveurs_redis - become: true - gather_facts: true - - pre_tasks: - - name: Vérifier que la cible est Debian - ansible.builtin.assert: - that: - - ansible_facts.distribution == "Debian" - fail_msg: "Ce playbook est prévu pour Debian." - - roles: - - serveurs_redis diff --git a/playbooks/groupes/serveurs_sendmail.yml b/playbooks/groupes/serveurs_sendmail.yml deleted file mode 100644 index 4315e11..0000000 --- a/playbooks/groupes/serveurs_sendmail.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -- name: Appliquer le groupe serveurs_sendmail - hosts: serveurs_sendmail - become: true - gather_facts: true - - pre_tasks: - - name: Vérifier que la cible est Debian - ansible.builtin.assert: - that: - - ansible_facts.distribution == "Debian" - fail_msg: "Ce playbook est prévu pour Debian." - - roles: - - serveurs_sendmail diff --git a/playbooks/groupes/serveurs_step_ca.yml b/playbooks/groupes/serveurs_step_ca.yml deleted file mode 100644 index 539119e..0000000 --- a/playbooks/groupes/serveurs_step_ca.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -- name: Appliquer le groupe serveurs_step_ca - hosts: serveurs_step_ca - become: true - gather_facts: true - - pre_tasks: - - name: Vérifier que la cible est Debian - ansible.builtin.assert: - that: - - ansible_facts.distribution == "Debian" - fail_msg: "Ce playbook est prévu pour Debian." - - roles: - - serveurs_step_ca diff --git a/playbooks/maintenance/verifier_hote_debian.yml b/playbooks/maintenance/verifier_hote_debian.yml index 598b866..68be2cb 100644 --- a/playbooks/maintenance/verifier_hote_debian.yml +++ b/playbooks/maintenance/verifier_hote_debian.yml @@ -1,6 +1,6 @@ --- - name: Vérifier une VM Debian gérée par Set-OPS - hosts: serveurs_debian + hosts: serveur_debian become: true gather_facts: true diff --git a/playbooks/proxmox/README.md b/playbooks/proxmox/README.md index 07a3c31..c9c4357 100644 --- a/playbooks/proxmox/README.md +++ b/playbooks/proxmox/README.md @@ -59,7 +59,7 @@ make creer-vm \ VLAN=15 \ ADRESSE_IP=10.1.15.31 \ PASSERELLE=10.1.15.1 \ - GROUPES="serveurs_debian serveurs_durcis" + GROUPES="serveur_debian serveur_durci" ``` `VLAN` doit être saisi à chaque création de VM pour éviter de réutiliser par erreur un réseau d'un autre clone. @@ -67,7 +67,7 @@ make creer-vm \ Le disque du clone hérite de la taille du modèle. Pour l'agrandir à la création, fournir explicitement une taille supérieure à celle du modèle : ```bash -make creer-vm HOTE=web-frontal-01 VMID=95301 VLAN=15 ADRESSE_IP=10.1.15.31 PASSERELLE=10.1.15.1 TAILLE_DISQUE=64G GROUPES="serveurs_debian serveurs_durcis" +make creer-vm HOTE=web-frontal-01 VMID=95301 VLAN=15 ADRESSE_IP=10.1.15.31 PASSERELLE=10.1.15.1 TAILLE_DISQUE=64G GROUPES="serveur_debian serveur_durci" ``` Proxmox ne permet pas de réduire un disque existant. diff --git a/roles/clients_dns/README.md b/roles/client_dns/README.md similarity index 72% rename from roles/clients_dns/README.md rename to roles/client_dns/README.md index bf7943c..a471120 100644 --- a/roles/clients_dns/README.md +++ b/roles/client_dns/README.md @@ -1,4 +1,4 @@ -# Role `clients_dns` +# Role `client_dns` Valide et configure l'integration DNS cliente vers le service PowerDNS interne. @@ -9,8 +9,8 @@ peut couper la resolution de noms. Pour appliquer la configuration resolver : ```yaml -clients_dns_apply: true -clients_dns_confirm: true +client_dns_apply: true +client_dns_confirm: true ``` -Le serveur DNS requis vient du groupe `serveurs_powerdns`. +Le serveur DNS requis vient du groupe `serveur_powerdns`. diff --git a/roles/client_dns/defaults/main.yml b/roles/client_dns/defaults/main.yml new file mode 100644 index 0000000..0b83adc --- /dev/null +++ b/roles/client_dns/defaults/main.yml @@ -0,0 +1,9 @@ +--- +client_dns_apply: false +client_dns_confirm: false +client_dns_zone: "chezlepro.internal" +client_dns_search_domains: + - "{{ client_dns_zone }}" +client_dns_nameservers: [] +client_dns_resolv_conf_path: "/etc/resolv.conf" +client_dns_resolv_conf_header: "Gere par Ansible Set-OPS - client_dns" diff --git a/roles/clients_dns/tasks/main.yml b/roles/client_dns/tasks/main.yml similarity index 51% rename from roles/clients_dns/tasks/main.yml rename to roles/client_dns/tasks/main.yml index 406cae1..917f208 100644 --- a/roles/clients_dns/tasks/main.yml +++ b/roles/client_dns/tasks/main.yml @@ -1,12 +1,12 @@ --- - name: Déterminer les serveurs DNS internes depuis l'inventaire ansible.builtin.set_fact: - clients_dns_effective_nameservers: >- + client_dns_effective_nameservers: >- {{ - clients_dns_nameservers - if (clients_dns_nameservers | length > 0) + client_dns_nameservers + if (client_dns_nameservers | length > 0) else ( - groups.get('serveurs_powerdns', []) + groups.get('serveur_powerdns', []) | map('extract', hostvars, 'ansible_host') | select('defined') | list @@ -16,8 +16,8 @@ - name: Vérifier qu'au moins un serveur DNS interne est connu ansible.builtin.assert: that: - - clients_dns_effective_nameservers | length > 0 - fail_msg: "Aucun serveur DNS interne disponible pour clients_dns." + - client_dns_effective_nameservers | length > 0 + fail_msg: "Aucun serveur DNS interne disponible pour client_dns." - name: Installer les outils de diagnostic DNS ansible.builtin.apt: @@ -28,34 +28,34 @@ - name: Valider la zone DNS interne sur le serveur primaire ansible.builtin.command: - cmd: "dig @{{ clients_dns_effective_nameservers[0] }} {{ clients_dns_zone }} SOA +short" - register: clients_dns_soa_check + cmd: "dig @{{ client_dns_effective_nameservers[0] }} {{ client_dns_zone }} SOA +short" + register: client_dns_soa_check changed_when: false - failed_when: clients_dns_soa_check.stdout | trim == "" + failed_when: client_dns_soa_check.stdout | trim == "" - name: Refuser la modification DNS sans confirmation explicite ansible.builtin.assert: that: - - clients_dns_confirm | bool - fail_msg: "Modification DNS refusee: definir clients_dns_confirm=true pour modifier le resolver." - when: clients_dns_apply | bool + - client_dns_confirm | bool + fail_msg: "Modification DNS refusee: definir client_dns_confirm=true pour modifier le resolver." + when: client_dns_apply | bool - name: Configurer le resolver client ansible.builtin.template: src: resolv.conf.j2 - dest: "{{ clients_dns_resolv_conf_path }}" + dest: "{{ client_dns_resolv_conf_path }}" owner: root group: root mode: "0644" backup: true when: - - clients_dns_apply | bool - - clients_dns_confirm | bool + - client_dns_apply | bool + - client_dns_confirm | bool - name: Valider la résolution du nom local dans la zone interne ansible.builtin.command: - cmd: "dig @{{ clients_dns_effective_nameservers[0] }} {{ inventory_hostname }}.{{ clients_dns_zone }} A +short" - register: clients_dns_host_check + cmd: "dig @{{ client_dns_effective_nameservers[0] }} {{ inventory_hostname }}.{{ client_dns_zone }} A +short" + register: client_dns_host_check changed_when: false - failed_when: clients_dns_host_check.stdout | trim == "" + failed_when: client_dns_host_check.stdout | trim == "" when: ansible_host is defined diff --git a/roles/client_dns/templates/resolv.conf.j2 b/roles/client_dns/templates/resolv.conf.j2 new file mode 100644 index 0000000..e46ffa0 --- /dev/null +++ b/roles/client_dns/templates/resolv.conf.j2 @@ -0,0 +1,8 @@ +# {{ client_dns_resolv_conf_header }} +{% for nameserver in client_dns_effective_nameservers %} +nameserver {{ nameserver }} +{% endfor %} +{% if client_dns_search_domains | length > 0 %} +search {{ client_dns_search_domains | join(' ') }} +{% endif %} +options timeout:2 attempts:2 rotate diff --git a/roles/clients_journaux/README.md b/roles/client_journal/README.md similarity index 68% rename from roles/clients_journaux/README.md rename to roles/client_journal/README.md index 7285ec6..ab058fc 100644 --- a/roles/clients_journaux/README.md +++ b/roles/client_journal/README.md @@ -1,7 +1,7 @@ -# clients_journaux +# client_journal Intégration cliente **journaux** : expédie le journal système (journald) de la VM -vers `serveurs_loki`, via **Grafana Alloy**. +vers `serveur_loki`, via **Grafana Alloy**. ## Rôle - Ajoute le **dépôt apt Grafana** et installe `alloy`. @@ -9,13 +9,13 @@ vers `serveurs_loki`, via **Grafana Alloy**. - Déploie `/etc/alloy/config.alloy` : `loki.source.journal` → `loki.write` vers Loki. ## Boucle -VM dans `clients_journaux` → Alloy lit journald → pousse vers Loki (obs-01) → +VM dans `client_journal` → Alloy lit journald → pousse vers Loki (obs-01) → visible dans Grafana (datasource Loki). ## Variables | Variable | Défaut | Rôle | | --- | --- | --- | -| `clients_journaux_loki_url` | `http://10.1.14.11:3100/loki/api/v1/push` | Endpoint Loki (obs-01) | +| `client_journal_loki_url` | `http://10.1.14.11:3100/loki/api/v1/push` | Endpoint Loki (obs-01) | ## Notes / limites - La **syntaxe de configuration Alloy évolue** entre versions ; la config fournie @@ -24,4 +24,4 @@ visible dans Grafana (datasource Loki). - Étiquettes par défaut : `job=systemd-journal`, `host=`. ## Prérequis -- Dépendance `clients_journaux requiert serveurs_loki actif` (déjà dans `docs/dependances-groupes.yml`). +- Dépendance `client_journal requiert serveur_loki actif` (déjà dans `docs/dependances-groupes.yml`). diff --git a/roles/client_journal/defaults/main.yml b/roles/client_journal/defaults/main.yml new file mode 100644 index 0000000..4819807 --- /dev/null +++ b/roles/client_journal/defaults/main.yml @@ -0,0 +1,15 @@ +--- +client_journal_paquets: + - alloy + +client_journal_service: "alloy" +client_journal_utilisateur: "alloy" +client_journal_config: "/etc/alloy/config.alloy" + +# Point de collecte Loki (obs-01, serveur_loki, VLAN 14). +client_journal_loki_url: "http://10.1.14.11:3100/loki/api/v1/push" + +# Depot apt officiel Grafana (partage avec serveur_loki / serveur_grafana). +client_journal_depot_cle_url: "https://apt.grafana.com/gpg-full.key" +client_journal_depot_cle_fichier: "/etc/apt/keyrings/grafana.asc" +client_journal_depot_source: "deb [signed-by=/etc/apt/keyrings/grafana.asc] https://apt.grafana.com stable main" diff --git a/roles/clients_journaux/handlers/main.yml b/roles/client_journal/handlers/main.yml similarity index 70% rename from roles/clients_journaux/handlers/main.yml rename to roles/client_journal/handlers/main.yml index ee72910..25f3b7a 100644 --- a/roles/clients_journaux/handlers/main.yml +++ b/roles/client_journal/handlers/main.yml @@ -1,6 +1,6 @@ --- - name: Redemarrer alloy ansible.builtin.systemd: - name: "{{ clients_journaux_service }}" + name: "{{ client_journal_service }}" state: restarted listen: Redemarrer alloy diff --git a/roles/clients_journaux/tasks/main.yml b/roles/client_journal/tasks/main.yml similarity index 71% rename from roles/clients_journaux/tasks/main.yml rename to roles/client_journal/tasks/main.yml index bc453cd..241a618 100644 --- a/roles/clients_journaux/tasks/main.yml +++ b/roles/client_journal/tasks/main.yml @@ -9,27 +9,27 @@ - name: Telecharger la cle de signature Grafana ansible.builtin.get_url: - url: "{{ clients_journaux_depot_cle_url }}" - dest: "{{ clients_journaux_depot_cle_fichier }}" + url: "{{ client_journal_depot_cle_url }}" + dest: "{{ client_journal_depot_cle_fichier }}" owner: root group: root mode: "0644" - name: Ajouter le depot apt Grafana ansible.builtin.apt_repository: - repo: "{{ clients_journaux_depot_source }}" + repo: "{{ client_journal_depot_source }}" filename: grafana state: present - name: Installer Grafana Alloy ansible.builtin.apt: - name: "{{ clients_journaux_paquets }}" + name: "{{ client_journal_paquets }}" state: present update_cache: true - name: Autoriser Alloy a lire le journal systeme ansible.builtin.user: - name: "{{ clients_journaux_utilisateur }}" + name: "{{ client_journal_utilisateur }}" groups: systemd-journal append: true notify: Redemarrer alloy @@ -37,14 +37,14 @@ - name: Deployer la configuration Alloy ansible.builtin.template: src: config.alloy.j2 - dest: "{{ clients_journaux_config }}" + dest: "{{ client_journal_config }}" owner: root - group: "{{ clients_journaux_utilisateur }}" + group: "{{ client_journal_utilisateur }}" mode: "0640" notify: Redemarrer alloy - name: Activer et demarrer Alloy ansible.builtin.systemd: - name: "{{ clients_journaux_service }}" + name: "{{ client_journal_service }}" enabled: true state: started diff --git a/roles/clients_journaux/templates/config.alloy.j2 b/roles/client_journal/templates/config.alloy.j2 similarity index 67% rename from roles/clients_journaux/templates/config.alloy.j2 rename to roles/client_journal/templates/config.alloy.j2 index 17c22ab..f1c7450 100644 --- a/roles/clients_journaux/templates/config.alloy.j2 +++ b/roles/client_journal/templates/config.alloy.j2 @@ -1,8 +1,8 @@ -// Gere par Set-OPS (role clients_journaux). Ne pas editer a la main. +// Gere par Set-OPS (role client_journal). Ne pas editer a la main. loki.write "loki" { endpoint { - url = "{{ clients_journaux_loki_url }}" + url = "{{ client_journal_loki_url }}" } } diff --git a/roles/clients_ldap/README.md b/roles/client_ldap/README.md similarity index 61% rename from roles/clients_ldap/README.md rename to roles/client_ldap/README.md index 9f30b4a..4c922cc 100644 --- a/roles/clients_ldap/README.md +++ b/roles/client_ldap/README.md @@ -1,7 +1,7 @@ -# clients_ldap +# client_ldap Intégration cliente **identité utilisateur** : l'hôte authentifie les utilisateurs -via l'annuaire central `serveurs_openldap`, grâce à **SSSD** (NSS + PAM). +via l'annuaire central `serveur_openldap`, grâce à **SSSD** (NSS + PAM). ## Rôle - Installe `sssd`, `sssd-ldap`, `libnss-sss`, `libpam-sss`. @@ -12,24 +12,24 @@ via l'annuaire central `serveurs_openldap`, grâce à **SSSD** (NSS + PAM). ## Effet Après ce rôle, les comptes de l'annuaire Chezlepro peuvent se connecter à l'hôte -(SSH, console) et leur home est créé à la première connexion. Couplé à `clients_pki` +(SSH, console) et leur home est créé à la première connexion. Couplé à `client_pki` (identité machine), l'écosystème a une authentification **machines + utilisateurs** centralisée. ## Variables principales | Variable | Défaut | Rôle | | --- | --- | --- | -| `clients_ldap_uri` | `ldap://idm-01.chezlepro.internal` | URI de l'annuaire | -| `clients_ldap_base_dn` | `dc=chezlepro,dc=internal` | Base de recherche | -| `clients_ldap_bind_dn` | `""` (anonyme) | Compte de lecture (optionnel, mdp via Vault) | -| `clients_ldap_tls_reqcert` | `never` | Validation TLS (→ `demand` avec LDAPS) | +| `client_ldap_uri` | `ldap://idm-01.chezlepro.internal` | URI de l'annuaire | +| `client_ldap_base_dn` | `dc=chezlepro,dc=internal` | Base de recherche | +| `client_ldap_bind_dn` | `""` (anonyme) | Compte de lecture (optionnel, mdp via Vault) | +| `client_ldap_tls_reqcert` | `never` | Validation TLS (→ `demand` avec LDAPS) | ## Notes / limites - **Bind anonyme** par défaut : suppose une lecture publique de l'annuaire. Pour un - bind dédié, définir `clients_ldap_bind_dn` + `clients_ldap_bind_password` (Vault) et + bind dédié, définir `client_ldap_bind_dn` + `client_ldap_bind_password` (Vault) et créer le compte de service dans l'annuaire. - **LDAP en clair** sur le réseau interne pour l'instant ; basculer en **LDAPS** quand - OpenLDAP exposera un certificat (step_ca), avec `clients_ldap_tls_reqcert: demand`. + OpenLDAP exposera un certificat (step_ca), avec `client_ldap_tls_reqcert: demand`. - Les entrées utilisateurs/groupes (POSIX) doivent exister dans l'annuaire (gestion d'identité). ## Prérequis -- Dépendance `clients_ldap requiert serveurs_openldap actif` (déjà dans `docs/dependances-groupes.yml`). +- Dépendance `client_ldap requiert serveur_openldap actif` (déjà dans `docs/dependances-groupes.yml`). diff --git a/roles/client_ldap/defaults/main.yml b/roles/client_ldap/defaults/main.yml new file mode 100644 index 0000000..efcfb9d --- /dev/null +++ b/roles/client_ldap/defaults/main.yml @@ -0,0 +1,24 @@ +--- +client_ldap_paquets: + - sssd + - sssd-ldap + - libnss-sss + - libpam-sss + - ldap-utils + +client_ldap_service: "sssd" + +client_ldap_domaine: "chezlepro" +client_ldap_uri: "ldap://idm-01.chezlepro.internal" +client_ldap_base_dn: "dc=chezlepro,dc=internal" + +# Bind de lecture. Vide => bind anonyme (lecture publique de l'annuaire). +client_ldap_bind_dn: "" +client_ldap_bind_password: "" # {{ vault_ldap_sssd }} si un bind DN est defini + +# TLS : "never" tant que OpenLDAP n'expose pas LDAPS ; passer a "demand" +# avec LDAPS + confiance step_ca (client_pki). +client_ldap_tls_reqcert: "never" + +# Creation automatique du repertoire personnel a la premiere connexion. +client_ldap_mkhomedir: true diff --git a/roles/clients_ldap/handlers/main.yml b/roles/client_ldap/handlers/main.yml similarity index 72% rename from roles/clients_ldap/handlers/main.yml rename to roles/client_ldap/handlers/main.yml index fdb3acd..426e21d 100644 --- a/roles/clients_ldap/handlers/main.yml +++ b/roles/client_ldap/handlers/main.yml @@ -1,6 +1,6 @@ --- - name: Redemarrer sssd ansible.builtin.systemd: - name: "{{ clients_ldap_service }}" + name: "{{ client_ldap_service }}" state: restarted listen: Redemarrer sssd diff --git a/roles/clients_ldap/tasks/main.yml b/roles/client_ldap/tasks/main.yml similarity index 87% rename from roles/clients_ldap/tasks/main.yml rename to roles/client_ldap/tasks/main.yml index c859e90..425a58b 100644 --- a/roles/clients_ldap/tasks/main.yml +++ b/roles/client_ldap/tasks/main.yml @@ -1,7 +1,7 @@ --- - name: Installer SSSD et les modules LDAP ansible.builtin.apt: - name: "{{ clients_ldap_paquets }}" + name: "{{ client_ldap_paquets }}" state: present update_cache: true cache_valid_time: 3600 @@ -31,10 +31,10 @@ ansible.builtin.command: cmd: pam-auth-update --enable mkhomedir changed_when: false - when: clients_ldap_mkhomedir | bool + when: client_ldap_mkhomedir | bool - name: Activer et demarrer SSSD ansible.builtin.systemd: - name: "{{ clients_ldap_service }}" + name: "{{ client_ldap_service }}" enabled: true state: started diff --git a/roles/client_ldap/templates/sssd.conf.j2 b/roles/client_ldap/templates/sssd.conf.j2 new file mode 100644 index 0000000..87cf8d0 --- /dev/null +++ b/roles/client_ldap/templates/sssd.conf.j2 @@ -0,0 +1,18 @@ +# Gere par Set-OPS (role client_ldap). Ne pas editer a la main. +[sssd] +config_file_version = 2 +services = nss, pam +domains = {{ client_ldap_domaine }} + +[domain/{{ client_ldap_domaine }}] +id_provider = ldap +auth_provider = ldap +ldap_uri = {{ client_ldap_uri }} +ldap_search_base = {{ client_ldap_base_dn }} +{% if client_ldap_bind_dn | length > 0 %} +ldap_default_bind_dn = {{ client_ldap_bind_dn }} +ldap_default_authtok = {{ client_ldap_bind_password }} +{% endif %} +ldap_tls_reqcert = {{ client_ldap_tls_reqcert }} +cache_credentials = true +enumerate = false diff --git a/roles/clients_metriques/README.md b/roles/client_metrique/README.md similarity index 52% rename from roles/clients_metriques/README.md rename to roles/client_metrique/README.md index 73e11ff..1397a22 100644 --- a/roles/clients_metriques/README.md +++ b/roles/client_metrique/README.md @@ -1,7 +1,7 @@ -# clients_metriques +# client_metrique Intégration cliente **métriques** : installe `node_exporter` sur la VM pour qu'elle -soit collectée par `serveurs_prometheus`. +soit collectée par `serveur_prometheus`. ## Rôle - Installe `prometheus-node-exporter` (paquet Debian). @@ -9,18 +9,18 @@ soit collectée par `serveurs_prometheus`. - Active et démarre le service. ## Boucle complète -1. On ajoute une VM au groupe `clients_metriques` et on l'active. +1. On ajoute une VM au groupe `client_metrique` et on l'active. 2. Ce rôle y installe `node_exporter` (`:9100`). -3. `serveurs_prometheus` **dérive automatiquement** la cible depuis l'inventaire - (hôtes actifs de `clients_metriques`) et la scrape. +3. `serveur_prometheus` **dérive automatiquement** la cible depuis l'inventaire + (hôtes actifs de `client_metrique`) et la scrape. Aucun edit manuel côté Prometheus. ## Variables | Variable | Défaut | Rôle | | --- | --- | --- | -| `clients_metriques_adresse_ecoute` | `:9100` | `--web.listen-address` | +| `client_metrique_adresse_ecoute` | `:9100` | `--web.listen-address` | ## Prérequis -- Dépendance `clients_metriques requiert serveurs_prometheus actif` (déjà dans `docs/dependances-groupes.yml`). +- Dépendance `client_metrique requiert serveur_prometheus actif` (déjà dans `docs/dependances-groupes.yml`). - Accès du serveur Prometheus au port `9100` (segmentation réseau / nftables). diff --git a/roles/clients_metriques/defaults/main.yml b/roles/client_metrique/defaults/main.yml similarity index 60% rename from roles/clients_metriques/defaults/main.yml rename to roles/client_metrique/defaults/main.yml index 9d59154..db6a4b1 100644 --- a/roles/clients_metriques/defaults/main.yml +++ b/roles/client_metrique/defaults/main.yml @@ -1,9 +1,9 @@ --- -clients_metriques_paquets: +client_metrique_paquets: - prometheus-node-exporter -clients_metriques_service: "prometheus-node-exporter" +client_metrique_service: "prometheus-node-exporter" # Adresse d'ecoute de node_exporter. Par defaut toutes les interfaces ; la # segmentation reseau (VLAN / nftables) restreint l'acces au serveur Prometheus. -clients_metriques_adresse_ecoute: ":9100" +client_metrique_adresse_ecoute: ":9100" diff --git a/roles/clients_metriques/handlers/main.yml b/roles/client_metrique/handlers/main.yml similarity index 73% rename from roles/clients_metriques/handlers/main.yml rename to roles/client_metrique/handlers/main.yml index 4ef887f..d64b694 100644 --- a/roles/clients_metriques/handlers/main.yml +++ b/roles/client_metrique/handlers/main.yml @@ -1,6 +1,6 @@ --- - name: Redemarrer node_exporter ansible.builtin.systemd: - name: "{{ clients_metriques_service }}" + name: "{{ client_metrique_service }}" state: restarted listen: Redemarrer node_exporter diff --git a/roles/clients_metriques/tasks/main.yml b/roles/client_metrique/tasks/main.yml similarity index 84% rename from roles/clients_metriques/tasks/main.yml rename to roles/client_metrique/tasks/main.yml index 8ed79d3..e5f4939 100644 --- a/roles/clients_metriques/tasks/main.yml +++ b/roles/client_metrique/tasks/main.yml @@ -1,7 +1,7 @@ --- - name: Installer node_exporter ansible.builtin.apt: - name: "{{ clients_metriques_paquets }}" + name: "{{ client_metrique_paquets }}" state: present update_cache: true cache_valid_time: 3600 @@ -17,6 +17,6 @@ - name: Activer et demarrer node_exporter ansible.builtin.systemd: - name: "{{ clients_metriques_service }}" + name: "{{ client_metrique_service }}" enabled: true state: started diff --git a/roles/client_metrique/templates/default-node-exporter.j2 b/roles/client_metrique/templates/default-node-exporter.j2 new file mode 100644 index 0000000..ac67158 --- /dev/null +++ b/roles/client_metrique/templates/default-node-exporter.j2 @@ -0,0 +1,2 @@ +# Gere par Set-OPS (role client_metrique). +ARGS="--web.listen-address={{ client_metrique_adresse_ecoute }}" diff --git a/roles/clients_pki/README.md b/roles/client_pki/README.md similarity index 70% rename from roles/clients_pki/README.md rename to roles/client_pki/README.md index 025ea75..dd9c610 100644 --- a/roles/clients_pki/README.md +++ b/roles/client_pki/README.md @@ -1,7 +1,7 @@ -# clients_pki +# client_pki Intégration cliente **PKI / identité machine** : chaque hôte fait confiance à l'AC -interne (`serveurs_step_ca`), obtient **son propre certificat** et le renouvelle +interne (`serveur_step_ca`), obtient **son propre certificat** et le renouvelle automatiquement. ## Rôle @@ -19,17 +19,17 @@ du TLS / mTLS interne. ## Secrets requis (Vault) ```yaml -clients_pki_ca_fingerprint: "{{ vault_step_ca_fingerprint }}" # empreinte racine de l'AC -clients_pki_provisioner_password: "{{ vault_step_ca_provisioner_password }}" # partage avec serveurs_step_ca +client_pki_ca_fingerprint: "{{ vault_step_ca_fingerprint }}" # empreinte racine de l'AC +client_pki_provisioner_password: "{{ vault_step_ca_provisioner_password }}" # partage avec serveur_step_ca ``` L'empreinte racine s'obtient sur l'AC (`step certificate fingerprint `). ## Variables principales | Variable | Défaut | Rôle | | --- | --- | --- | -| `clients_pki_ca_url` | `https://infra-pki-01.chezlepro.internal:8443` | URL de l'AC | -| `clients_pki_provisioner` | `admin@chezlepro.internal` | Provisioner émetteur | -| `clients_pki_nom_cert` | FQDN de l'hôte | Nom du certificat | +| `client_pki_ca_url` | `https://infra-pki-01.chezlepro.internal:8443` | URL de l'AC | +| `client_pki_provisioner` | `admin@chezlepro.internal` | Provisioner émetteur | +| `client_pki_nom_cert` | FQDN de l'hôte | Nom du certificat | ## Notes / sécurité - Émission via le provisioner **JWK** (mot de passe partagé) : tout hôte avec ce secret @@ -39,5 +39,5 @@ L'empreinte racine s'obtient sur l'AC (`step certificate fingerprint `). ## Prérequis -- Dépendance `clients_pki requiert serveurs_step_ca actif` (déjà dans `docs/dependances-groupes.yml`). +- Dépendance `client_pki requiert serveur_step_ca actif` (déjà dans `docs/dependances-groupes.yml`). - Réseau vers l'AC (`:8443`). diff --git a/roles/client_pki/defaults/main.yml b/roles/client_pki/defaults/main.yml new file mode 100644 index 0000000..d2465e6 --- /dev/null +++ b/roles/client_pki/defaults/main.yml @@ -0,0 +1,24 @@ +--- +client_pki_paquets: + - step-cli + +client_pki_steppath: "/etc/step" + +# AC interne (serveur_step_ca / infra-pki-01). +client_pki_ca_url: "https://infra-pki-01.chezlepro.internal:8443" +client_pki_provisioner: "admin@chezlepro.internal" + +# Identite de l'hote. +client_pki_nom_cert: "{{ ansible_fqdn | default(ansible_hostname) }}" +client_pki_cert: "{{ client_pki_steppath }}/certs/{{ client_pki_nom_cert }}.crt" +client_pki_cle: "{{ client_pki_steppath }}/certs/{{ client_pki_nom_cert }}.key" + +# Secrets OBLIGATOIRES (Ansible Vault). +client_pki_ca_fingerprint: "" # {{ vault_step_ca_fingerprint }} (empreinte racine de l'AC) +client_pki_provisioner_password: "" # {{ vault_step_ca_provisioner_password }} (partage avec serveur_step_ca) + +# Depot apt officiel Smallstep (partage avec serveur_step_ca). +client_pki_depot_cle_url: "https://packages.smallstep.com/keys/apt/repo-signing-key.gpg" +client_pki_depot_cle_fichier: "/etc/apt/keyrings/smallstep.asc" +client_pki_depot_uri: "https://packages.smallstep.com/stable/debian" +client_pki_depot_suite: "debs" diff --git a/roles/clients_pki/handlers/main.yml b/roles/client_pki/handlers/main.yml similarity index 100% rename from roles/clients_pki/handlers/main.yml rename to roles/client_pki/handlers/main.yml diff --git a/roles/clients_pki/tasks/main.yml b/roles/client_pki/tasks/main.yml similarity index 65% rename from roles/clients_pki/tasks/main.yml rename to roles/client_pki/tasks/main.yml index 0a9169d..a954b0d 100644 --- a/roles/clients_pki/tasks/main.yml +++ b/roles/client_pki/tasks/main.yml @@ -2,10 +2,10 @@ - name: Exiger les secrets PKI (Vault) ansible.builtin.assert: that: - - clients_pki_ca_fingerprint | length > 0 - - clients_pki_provisioner_password | length > 0 + - client_pki_ca_fingerprint | length > 0 + - client_pki_provisioner_password | length > 0 fail_msg: >- - clients_pki_ca_fingerprint et clients_pki_provisioner_password + client_pki_ca_fingerprint et client_pki_provisioner_password sont requis (a fournir via Ansible Vault). - name: Assurer le repertoire des trousseaux apt @@ -18,8 +18,8 @@ - name: Telecharger la cle de signature Smallstep ansible.builtin.get_url: - url: "{{ clients_pki_depot_cle_url }}" - dest: "{{ clients_pki_depot_cle_fichier }}" + url: "{{ client_pki_depot_cle_url }}" + dest: "{{ client_pki_depot_cle_fichier }}" owner: root group: root mode: "0644" @@ -34,13 +34,13 @@ - name: Installer step-cli ansible.builtin.apt: - name: "{{ clients_pki_paquets }}" + name: "{{ client_pki_paquets }}" state: present update_cache: true - name: Creer le repertoire STEPPATH des certificats ansible.builtin.file: - path: "{{ clients_pki_steppath }}/certs" + path: "{{ client_pki_steppath }}/certs" state: directory owner: root group: root @@ -48,8 +48,8 @@ - name: Deployer le mot de passe du provisioner ansible.builtin.copy: - content: "{{ clients_pki_provisioner_password }}" - dest: "{{ clients_pki_steppath }}/provisioner.pass" + content: "{{ client_pki_provisioner_password }}" + dest: "{{ client_pki_steppath }}/provisioner.pass" owner: root group: root mode: "0600" @@ -59,24 +59,24 @@ ansible.builtin.command: cmd: >- step ca bootstrap - --ca-url {{ clients_pki_ca_url }} - --fingerprint {{ clients_pki_ca_fingerprint }} + --ca-url {{ client_pki_ca_url }} + --fingerprint {{ client_pki_ca_fingerprint }} --install --force - creates: "{{ clients_pki_steppath }}/certs/root_ca.crt" + creates: "{{ client_pki_steppath }}/certs/root_ca.crt" environment: - STEPPATH: "{{ clients_pki_steppath }}" + STEPPATH: "{{ client_pki_steppath }}" - name: Obtenir le certificat d'hote ansible.builtin.command: cmd: >- - step ca certificate {{ clients_pki_nom_cert }} - {{ clients_pki_cert }} {{ clients_pki_cle }} - --provisioner {{ clients_pki_provisioner }} - --provisioner-password-file {{ clients_pki_steppath }}/provisioner.pass + step ca certificate {{ client_pki_nom_cert }} + {{ client_pki_cert }} {{ client_pki_cle }} + --provisioner {{ client_pki_provisioner }} + --provisioner-password-file {{ client_pki_steppath }}/provisioner.pass --force - creates: "{{ clients_pki_cert }}" + creates: "{{ client_pki_cert }}" environment: - STEPPATH: "{{ clients_pki_steppath }}" + STEPPATH: "{{ client_pki_steppath }}" - name: Deployer l'unite systemd de renouvellement ansible.builtin.template: @@ -98,7 +98,7 @@ - name: Activer le renouvellement automatique du certificat d'hote ansible.builtin.systemd: - name: "cert-renewer@{{ clients_pki_nom_cert }}.timer" + name: "cert-renewer@{{ client_pki_nom_cert }}.timer" enabled: true state: started daemon_reload: true diff --git a/roles/clients_pki/templates/cert-renewer@.service.j2 b/roles/client_pki/templates/cert-renewer@.service.j2 similarity index 66% rename from roles/clients_pki/templates/cert-renewer@.service.j2 rename to roles/client_pki/templates/cert-renewer@.service.j2 index 6d72156..dbdc0c0 100644 --- a/roles/clients_pki/templates/cert-renewer@.service.j2 +++ b/roles/client_pki/templates/cert-renewer@.service.j2 @@ -1,4 +1,4 @@ -# Gere par Set-OPS (role clients_pki). Renouvellement de certificat (Smallstep). +# Gere par Set-OPS (role client_pki). Renouvellement de certificat (Smallstep). [Unit] Description=Certificate renewer for %I After=network-online.target @@ -9,9 +9,9 @@ StartLimitIntervalSec=0 [Service] Type=oneshot User=root -Environment=STEPPATH={{ clients_pki_steppath }} -Environment=CERT_LOCATION={{ clients_pki_steppath }}/certs/%i.crt -Environment=KEY_LOCATION={{ clients_pki_steppath }}/certs/%i.key +Environment=STEPPATH={{ client_pki_steppath }} +Environment=CERT_LOCATION={{ client_pki_steppath }}/certs/%i.crt +Environment=KEY_LOCATION={{ client_pki_steppath }}/certs/%i.key ExecCondition=/usr/bin/step certificate needs-renewal ${CERT_LOCATION} ExecStart=/usr/bin/step ca renew --force ${CERT_LOCATION} ${KEY_LOCATION} ExecStartPost=/usr/bin/env sh -c "! systemctl --quiet is-active %i.service || systemctl try-reload-or-restart %i" diff --git a/roles/clients_pki/templates/cert-renewer@.timer.j2 b/roles/client_pki/templates/cert-renewer@.timer.j2 similarity index 84% rename from roles/clients_pki/templates/cert-renewer@.timer.j2 rename to roles/client_pki/templates/cert-renewer@.timer.j2 index 64ef598..42f2285 100644 --- a/roles/clients_pki/templates/cert-renewer@.timer.j2 +++ b/roles/client_pki/templates/cert-renewer@.timer.j2 @@ -1,4 +1,4 @@ -# Gere par Set-OPS (role clients_pki). +# Gere par Set-OPS (role client_pki). [Unit] Description=Timer for certificate renewal of %I Documentation=https://smallstep.com/docs/step-ca/renewal diff --git a/roles/client_pki/templates/smallstep.sources.j2 b/roles/client_pki/templates/smallstep.sources.j2 new file mode 100644 index 0000000..f83a4c2 --- /dev/null +++ b/roles/client_pki/templates/smallstep.sources.j2 @@ -0,0 +1,5 @@ +Types: deb +URIs: {{ client_pki_depot_uri }} +Suites: {{ client_pki_depot_suite }} +Components: main +Signed-By: {{ client_pki_depot_cle_fichier }} diff --git a/roles/clients_smtp/README.md b/roles/client_smtp/README.md similarity index 59% rename from roles/clients_smtp/README.md rename to roles/client_smtp/README.md index b7b262f..2fe5633 100644 --- a/roles/clients_smtp/README.md +++ b/roles/client_smtp/README.md @@ -1,7 +1,7 @@ -# clients_smtp +# client_smtp Intégration cliente **relais mail** : l'hôte relaie son courrier sortant (notifications, -cron, alertes) vers `serveurs_sendmail`, via **msmtp**. +cron, alertes) vers `serveur_sendmail`, via **msmtp**. ## Rôle - Installe `msmtp` et `msmtp-mta` (`msmtp-mta` fournit `/usr/sbin/sendmail`, donc le @@ -10,20 +10,20 @@ cron, alertes) vers `serveurs_sendmail`, via **msmtp**. fait confiance au réseau interne). ## Effet -Tout courrier émis localement (`mail`, cron, scripts) est relayé vers `serveurs_sendmail` +Tout courrier émis localement (`mail`, cron, scripts) est relayé vers `serveur_sendmail` (infra-mail-01), qui assure la remise. Léger, sans daemon. ## Variables | Variable | Défaut | Rôle | | --- | --- | --- | -| `clients_smtp_relais` | `infra-mail-01.chezlepro.internal` | MTA relais | -| `clients_smtp_port` | `25` | Port du relais | -| `clients_smtp_from` | `@chezlepro.internal` | Expéditeur par défaut | -| `clients_smtp_tls` | `false` | TLS (→ `true` avec certificats step_ca) | +| `client_smtp_relais` | `infra-mail-01.chezlepro.internal` | MTA relais | +| `client_smtp_port` | `25` | Port du relais | +| `client_smtp_from` | `@chezlepro.internal` | Expéditeur par défaut | +| `client_smtp_tls` | `false` | TLS (→ `true` avec certificats step_ca) | ## Notes / limites - Pas d'authentification SMTP : repose sur la confiance réseau (`mynetworks` du relais). -- TLS interne désactivé pour l'instant ; activable avec la confiance step_ca (`clients_pki`). +- TLS interne désactivé pour l'instant ; activable avec la confiance step_ca (`client_pki`). ## Prérequis -- Dépendance `clients_smtp requiert serveurs_sendmail actif` (déjà dans `docs/dependances-groupes.yml`). +- Dépendance `client_smtp requiert serveur_sendmail actif` (déjà dans `docs/dependances-groupes.yml`). diff --git a/roles/client_smtp/defaults/main.yml b/roles/client_smtp/defaults/main.yml new file mode 100644 index 0000000..9c8722c --- /dev/null +++ b/roles/client_smtp/defaults/main.yml @@ -0,0 +1,12 @@ +--- +# Relais mail local leger (msmtp) vers serveur_sendmail. +client_smtp_paquets: + - msmtp + - msmtp-mta # fournit /usr/sbin/sendmail + +client_smtp_relais: "infra-mail-01.chezlepro.internal" +client_smtp_port: 25 +client_smtp_from: "{{ ansible_hostname }}@chezlepro.internal" + +# TLS : off sur le reseau interne pour l'instant ; on avec certificats step_ca. +client_smtp_tls: false diff --git a/roles/clients_smtp/tasks/main.yml b/roles/client_smtp/tasks/main.yml similarity index 88% rename from roles/clients_smtp/tasks/main.yml rename to roles/client_smtp/tasks/main.yml index bcd35a1..b309d94 100644 --- a/roles/clients_smtp/tasks/main.yml +++ b/roles/client_smtp/tasks/main.yml @@ -1,7 +1,7 @@ --- - name: Installer msmtp (relais mail local) ansible.builtin.apt: - name: "{{ clients_smtp_paquets }}" + name: "{{ client_smtp_paquets }}" state: present update_cache: true cache_valid_time: 3600 diff --git a/roles/client_smtp/templates/msmtprc.j2 b/roles/client_smtp/templates/msmtprc.j2 new file mode 100644 index 0000000..62d3685 --- /dev/null +++ b/roles/client_smtp/templates/msmtprc.j2 @@ -0,0 +1,9 @@ +# Gere par Set-OPS (role client_smtp). Ne pas editer a la main. +defaults +tls {{ 'on' if client_smtp_tls | bool else 'off' }} +syslog on + +account default +host {{ client_smtp_relais }} +port {{ client_smtp_port }} +from {{ client_smtp_from }} diff --git a/roles/clients_dns/defaults/main.yml b/roles/clients_dns/defaults/main.yml deleted file mode 100644 index 40b1af8..0000000 --- a/roles/clients_dns/defaults/main.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -clients_dns_apply: false -clients_dns_confirm: false -clients_dns_zone: "chezlepro.internal" -clients_dns_search_domains: - - "{{ clients_dns_zone }}" -clients_dns_nameservers: [] -clients_dns_resolv_conf_path: "/etc/resolv.conf" -clients_dns_resolv_conf_header: "Gere par Ansible Set-OPS - clients_dns" diff --git a/roles/clients_dns/templates/resolv.conf.j2 b/roles/clients_dns/templates/resolv.conf.j2 deleted file mode 100644 index 4ee3dd3..0000000 --- a/roles/clients_dns/templates/resolv.conf.j2 +++ /dev/null @@ -1,8 +0,0 @@ -# {{ clients_dns_resolv_conf_header }} -{% for nameserver in clients_dns_effective_nameservers %} -nameserver {{ nameserver }} -{% endfor %} -{% if clients_dns_search_domains | length > 0 %} -search {{ clients_dns_search_domains | join(' ') }} -{% endif %} -options timeout:2 attempts:2 rotate diff --git a/roles/clients_journaux/defaults/main.yml b/roles/clients_journaux/defaults/main.yml deleted file mode 100644 index f1bcbe8..0000000 --- a/roles/clients_journaux/defaults/main.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -clients_journaux_paquets: - - alloy - -clients_journaux_service: "alloy" -clients_journaux_utilisateur: "alloy" -clients_journaux_config: "/etc/alloy/config.alloy" - -# Point de collecte Loki (obs-01, serveurs_loki, VLAN 14). -clients_journaux_loki_url: "http://10.1.14.11:3100/loki/api/v1/push" - -# Depot apt officiel Grafana (partage avec serveurs_loki / serveurs_grafana). -clients_journaux_depot_cle_url: "https://apt.grafana.com/gpg-full.key" -clients_journaux_depot_cle_fichier: "/etc/apt/keyrings/grafana.asc" -clients_journaux_depot_source: "deb [signed-by=/etc/apt/keyrings/grafana.asc] https://apt.grafana.com stable main" diff --git a/roles/clients_ldap/defaults/main.yml b/roles/clients_ldap/defaults/main.yml deleted file mode 100644 index de608cd..0000000 --- a/roles/clients_ldap/defaults/main.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -clients_ldap_paquets: - - sssd - - sssd-ldap - - libnss-sss - - libpam-sss - - ldap-utils - -clients_ldap_service: "sssd" - -clients_ldap_domaine: "chezlepro" -clients_ldap_uri: "ldap://idm-01.chezlepro.internal" -clients_ldap_base_dn: "dc=chezlepro,dc=internal" - -# Bind de lecture. Vide => bind anonyme (lecture publique de l'annuaire). -clients_ldap_bind_dn: "" -clients_ldap_bind_password: "" # {{ vault_ldap_sssd }} si un bind DN est defini - -# TLS : "never" tant que OpenLDAP n'expose pas LDAPS ; passer a "demand" -# avec LDAPS + confiance step_ca (clients_pki). -clients_ldap_tls_reqcert: "never" - -# Creation automatique du repertoire personnel a la premiere connexion. -clients_ldap_mkhomedir: true diff --git a/roles/clients_ldap/templates/sssd.conf.j2 b/roles/clients_ldap/templates/sssd.conf.j2 deleted file mode 100644 index 6446600..0000000 --- a/roles/clients_ldap/templates/sssd.conf.j2 +++ /dev/null @@ -1,18 +0,0 @@ -# Gere par Set-OPS (role clients_ldap). Ne pas editer a la main. -[sssd] -config_file_version = 2 -services = nss, pam -domains = {{ clients_ldap_domaine }} - -[domain/{{ clients_ldap_domaine }}] -id_provider = ldap -auth_provider = ldap -ldap_uri = {{ clients_ldap_uri }} -ldap_search_base = {{ clients_ldap_base_dn }} -{% if clients_ldap_bind_dn | length > 0 %} -ldap_default_bind_dn = {{ clients_ldap_bind_dn }} -ldap_default_authtok = {{ clients_ldap_bind_password }} -{% endif %} -ldap_tls_reqcert = {{ clients_ldap_tls_reqcert }} -cache_credentials = true -enumerate = false diff --git a/roles/clients_metriques/templates/default-node-exporter.j2 b/roles/clients_metriques/templates/default-node-exporter.j2 deleted file mode 100644 index 95fbe7f..0000000 --- a/roles/clients_metriques/templates/default-node-exporter.j2 +++ /dev/null @@ -1,2 +0,0 @@ -# Gere par Set-OPS (role clients_metriques). -ARGS="--web.listen-address={{ clients_metriques_adresse_ecoute }}" diff --git a/roles/clients_pki/defaults/main.yml b/roles/clients_pki/defaults/main.yml deleted file mode 100644 index a370a88..0000000 --- a/roles/clients_pki/defaults/main.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -clients_pki_paquets: - - step-cli - -clients_pki_steppath: "/etc/step" - -# AC interne (serveurs_step_ca / infra-pki-01). -clients_pki_ca_url: "https://infra-pki-01.chezlepro.internal:8443" -clients_pki_provisioner: "admin@chezlepro.internal" - -# Identite de l'hote. -clients_pki_nom_cert: "{{ ansible_fqdn | default(ansible_hostname) }}" -clients_pki_cert: "{{ clients_pki_steppath }}/certs/{{ clients_pki_nom_cert }}.crt" -clients_pki_cle: "{{ clients_pki_steppath }}/certs/{{ clients_pki_nom_cert }}.key" - -# Secrets OBLIGATOIRES (Ansible Vault). -clients_pki_ca_fingerprint: "" # {{ vault_step_ca_fingerprint }} (empreinte racine de l'AC) -clients_pki_provisioner_password: "" # {{ vault_step_ca_provisioner_password }} (partage avec serveurs_step_ca) - -# Depot apt officiel Smallstep (partage avec serveurs_step_ca). -clients_pki_depot_cle_url: "https://packages.smallstep.com/keys/apt/repo-signing-key.gpg" -clients_pki_depot_cle_fichier: "/etc/apt/keyrings/smallstep.asc" -clients_pki_depot_uri: "https://packages.smallstep.com/stable/debian" -clients_pki_depot_suite: "debs" diff --git a/roles/clients_pki/templates/smallstep.sources.j2 b/roles/clients_pki/templates/smallstep.sources.j2 deleted file mode 100644 index 4ee103b..0000000 --- a/roles/clients_pki/templates/smallstep.sources.j2 +++ /dev/null @@ -1,5 +0,0 @@ -Types: deb -URIs: {{ clients_pki_depot_uri }} -Suites: {{ clients_pki_depot_suite }} -Components: main -Signed-By: {{ clients_pki_depot_cle_fichier }} diff --git a/roles/clients_smtp/defaults/main.yml b/roles/clients_smtp/defaults/main.yml deleted file mode 100644 index 1facfb8..0000000 --- a/roles/clients_smtp/defaults/main.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -# Relais mail local leger (msmtp) vers serveurs_sendmail. -clients_smtp_paquets: - - msmtp - - msmtp-mta # fournit /usr/sbin/sendmail - -clients_smtp_relais: "infra-mail-01.chezlepro.internal" -clients_smtp_port: 25 -clients_smtp_from: "{{ ansible_hostname }}@chezlepro.internal" - -# TLS : off sur le reseau interne pour l'instant ; on avec certificats step_ca. -clients_smtp_tls: false diff --git a/roles/clients_smtp/templates/msmtprc.j2 b/roles/clients_smtp/templates/msmtprc.j2 deleted file mode 100644 index 5b8efcc..0000000 --- a/roles/clients_smtp/templates/msmtprc.j2 +++ /dev/null @@ -1,9 +0,0 @@ -# Gere par Set-OPS (role clients_smtp). Ne pas editer a la main. -defaults -tls {{ 'on' if clients_smtp_tls | bool else 'off' }} -syslog on - -account default -host {{ clients_smtp_relais }} -port {{ clients_smtp_port }} -from {{ clients_smtp_from }} diff --git a/roles/serveurs_forgejo/README.md b/roles/serveur_forgejo/README.md similarity index 55% rename from roles/serveurs_forgejo/README.md rename to roles/serveur_forgejo/README.md index 989878d..469f46e 100644 --- a/roles/serveurs_forgejo/README.md +++ b/roles/serveur_forgejo/README.md @@ -1,4 +1,4 @@ -# serveurs_forgejo +# serveur_forgejo Forge Git **Forgejo** (binaire officiel) — dépôts Git, CI, revue de code. @@ -6,29 +6,29 @@ Forge Git **Forgejo** (binaire officiel) — dépôts Git, CI, revue de code. - Installe le binaire Forgejo (version épinglée, lien symbolique courant), utilisateur `git`. - Crée l'arborescence (`/var/lib/forgejo`, `/etc/forgejo`). - **Base PostgreSQL via le registre** (`docs/bases-donnees.yml`, entrée `forgejo`). -- `app.ini` : serveur derrière nginx (`HTTP_ADDR=127.0.0.1`, `ROOT_URL` https), DB, secrets, mailer vers `serveurs_sendmail`, inscription désactivée, `INSTALL_LOCK` (pas d'assistant web). +- `app.ini` : serveur derrière nginx (`HTTP_ADDR=127.0.0.1`, `ROOT_URL` https), DB, secrets, mailer vers `serveur_sendmail`, inscription désactivée, `INSTALL_LOCK` (pas d'assistant web). - Service systemd + création du **compte administrateur** initial (une fois). ## Secrets requis (Vault) ```yaml -serveurs_forgejo_secret_key: "{{ vault_forgejo_secret_key }}" # forgejo generate secret SECRET_KEY -serveurs_forgejo_internal_token: "{{ vault_forgejo_internal_token }}" # forgejo generate secret INTERNAL_TOKEN -serveurs_forgejo_admin_password: "{{ vault_forgejo_admin }}" -vault_bd_forgejo: "..." # mot de passe BD (partage avec serveurs_postgresql) +serveur_forgejo_secret_key: "{{ vault_forgejo_secret_key }}" # forgejo generate secret SECRET_KEY +serveur_forgejo_internal_token: "{{ vault_forgejo_internal_token }}" # forgejo generate secret INTERNAL_TOKEN +serveur_forgejo_admin_password: "{{ vault_forgejo_admin }}" +vault_bd_forgejo: "..." # mot de passe BD (partage avec serveur_postgresql) ``` ## Variables principales | Variable | Défaut | Rôle | | --- | --- | --- | -| `serveurs_forgejo_version` | `10.0.0` | Version (à vérifier/bumper) | -| `serveurs_forgejo_hostname` | `forge.chezlepro.internal` | Domaine (via nginx) | -| `serveurs_forgejo_db_host` | `10.1.13.11` | data-01 | +| `serveur_forgejo_version` | `10.0.0` | Version (à vérifier/bumper) | +| `serveur_forgejo_hostname` | `forge.chezlepro.internal` | Domaine (via nginx) | +| `serveur_forgejo_db_host` | `10.1.13.11` | data-01 | ## Notes / limites - **Version** à confirmer sur forgejo.org/download ; l'URL suit le motif officiel des releases. -- Le **site nginx** publiant Forgejo se déclare côté `serveurs_nginx`. +- Le **site nginx** publiant Forgejo se déclare côté `serveur_nginx`. - Mailer en SMTP simple vers le relais interne (sans TLS pour l'instant). - Non testé live (forge-01 planifié). ## Prérequis -- Dépendances `serveurs_postgresql`, `serveurs_nginx`, `serveurs_sendmail` (cf. `docs/dependances-groupes.yml`). +- Dépendances `serveur_postgresql`, `serveur_nginx`, `serveur_sendmail` (cf. `docs/dependances-groupes.yml`). diff --git a/roles/serveur_forgejo/defaults/main.yml b/roles/serveur_forgejo/defaults/main.yml new file mode 100644 index 0000000..c6aefff --- /dev/null +++ b/roles/serveur_forgejo/defaults/main.yml @@ -0,0 +1,30 @@ +--- +# Version Forgejo : verifier/ajuster sur https://forgejo.org/download/ +serveur_forgejo_version: "10.0.0" +serveur_forgejo_url: >- + https://codeberg.org/forgejo/forgejo/releases/download/v{{ serveur_forgejo_version }}/forgejo-{{ serveur_forgejo_version }}-linux-amd64 + +serveur_forgejo_binaire: "/usr/local/bin/forgejo" +serveur_forgejo_utilisateur: "git" +serveur_forgejo_data: "/var/lib/forgejo" +serveur_forgejo_config_dir: "/etc/forgejo" +serveur_forgejo_config: "/etc/forgejo/app.ini" +serveur_forgejo_service: "forgejo" + +# Publication (derriere serveur_nginx, TLS a l'edge). +serveur_forgejo_hostname: "forge.chezlepro.internal" +serveur_forgejo_http_port: 3000 + +# Base de donnees : resolue depuis le registre par le groupe consommateur. +serveur_forgejo_groupe: "serveur_forgejo" +serveur_forgejo_db_host: "10.1.13.11" # data-01 + +# Relais courriel. +serveur_forgejo_smtp: "infra-mail-01.chezlepro.internal" + +# Secrets OBLIGATOIRES (Ansible Vault). +serveur_forgejo_secret_key: "" # {{ vault_forgejo_secret_key }} +serveur_forgejo_internal_token: "" # {{ vault_forgejo_internal_token }} +serveur_forgejo_admin_user: "forgejo-admin" +serveur_forgejo_admin_email: "admin@chezlepro.internal" +serveur_forgejo_admin_password: "" # {{ vault_forgejo_admin }} diff --git a/roles/serveurs_forgejo/handlers/main.yml b/roles/serveur_forgejo/handlers/main.yml similarity index 75% rename from roles/serveurs_forgejo/handlers/main.yml rename to roles/serveur_forgejo/handlers/main.yml index a36f320..bfddc5a 100644 --- a/roles/serveurs_forgejo/handlers/main.yml +++ b/roles/serveur_forgejo/handlers/main.yml @@ -1,7 +1,7 @@ --- - name: Redemarrer forgejo ansible.builtin.systemd: - name: "{{ serveurs_forgejo_service }}" + name: "{{ serveur_forgejo_service }}" state: restarted daemon_reload: true listen: Redemarrer forgejo diff --git a/roles/serveurs_forgejo/tasks/main.yml b/roles/serveur_forgejo/tasks/main.yml similarity index 51% rename from roles/serveurs_forgejo/tasks/main.yml rename to roles/serveur_forgejo/tasks/main.yml index dae0a6a..6a45a24 100644 --- a/roles/serveurs_forgejo/tasks/main.yml +++ b/roles/serveur_forgejo/tasks/main.yml @@ -2,9 +2,9 @@ - name: Exiger les secrets Forgejo (Vault) ansible.builtin.assert: that: - - serveurs_forgejo_secret_key | length > 0 - - serveurs_forgejo_internal_token | length > 0 - - serveurs_forgejo_admin_password | length > 0 + - serveur_forgejo_secret_key | length > 0 + - serveur_forgejo_internal_token | length > 0 + - serveur_forgejo_admin_password | length > 0 fail_msg: "secret_key, internal_token et admin_password sont requis (Ansible Vault)." - name: Charger le registre des bases applicatives @@ -13,62 +13,62 @@ - name: Resoudre l'entree de base Forgejo (par consommateur) ansible.builtin.set_fact: - serveurs_forgejo_entree: >- + serveur_forgejo_entree: >- {{ ((bases_donnees | default({})) | dict2items | selectattr('value.consommateur', 'defined') - | selectattr('value.consommateur', 'equalto', serveurs_forgejo_groupe) + | selectattr('value.consommateur', 'equalto', serveur_forgejo_groupe) | map(attribute='value') | list | first) | default({}) }} - name: Exiger l'entree de registre et son secret ansible.builtin.assert: that: - - serveurs_forgejo_entree.base is defined - - serveurs_forgejo_entree.secret is defined - fail_msg: "Aucune base avec consommateur '{{ serveurs_forgejo_groupe }}' dans docs/bases-donnees.yml." + - serveur_forgejo_entree.base is defined + - serveur_forgejo_entree.secret is defined + fail_msg: "Aucune base avec consommateur '{{ serveur_forgejo_groupe }}' dans docs/bases-donnees.yml." - name: Resoudre le mot de passe de base (Vault) ansible.builtin.set_fact: - serveurs_forgejo_db_password: "{{ lookup('vars', serveurs_forgejo_entree.secret) }}" + serveur_forgejo_db_password: "{{ lookup('vars', serveur_forgejo_entree.secret) }}" no_log: true - name: Resoudre l'hote et le port du serveur de base de donnees (registre) ansible.builtin.set_fact: - serveurs_forgejo_db_host: >- - {{ (serveurs_bd | default({}))[serveurs_forgejo_entree.serveur].hote - | default(serveurs_forgejo_db_host) }} - serveurs_forgejo_db_port: >- - {{ (serveurs_bd | default({}))[serveurs_forgejo_entree.serveur].port | default(5432) }} + serveur_forgejo_db_host: >- + {{ (serveurs_bd | default({}))[serveur_forgejo_entree.serveur].hote + | default(serveur_forgejo_db_host) }} + serveur_forgejo_db_port: >- + {{ (serveurs_bd | default({}))[serveur_forgejo_entree.serveur].port | default(5432) }} - name: Creer l'utilisateur systeme git ansible.builtin.user: - name: "{{ serveurs_forgejo_utilisateur }}" + name: "{{ serveur_forgejo_utilisateur }}" system: true shell: /bin/bash - home: "/home/{{ serveurs_forgejo_utilisateur }}" + home: "/home/{{ serveur_forgejo_utilisateur }}" create_home: true comment: "Git Version Control" - name: Telecharger le binaire Forgejo ansible.builtin.get_url: - url: "{{ serveurs_forgejo_url }}" - dest: "/usr/local/bin/forgejo-{{ serveurs_forgejo_version }}" + url: "{{ serveur_forgejo_url }}" + dest: "/usr/local/bin/forgejo-{{ serveur_forgejo_version }}" owner: root group: root mode: "0755" - name: Activer la version courante du binaire ansible.builtin.file: - src: "/usr/local/bin/forgejo-{{ serveurs_forgejo_version }}" - dest: "{{ serveurs_forgejo_binaire }}" + src: "/usr/local/bin/forgejo-{{ serveur_forgejo_version }}" + dest: "{{ serveur_forgejo_binaire }}" state: link notify: Redemarrer forgejo - name: Creer les repertoires de donnees ansible.builtin.file: - path: "{{ serveurs_forgejo_data }}/{{ item }}" + path: "{{ serveur_forgejo_data }}/{{ item }}" state: directory - owner: "{{ serveurs_forgejo_utilisateur }}" - group: "{{ serveurs_forgejo_utilisateur }}" + owner: "{{ serveur_forgejo_utilisateur }}" + group: "{{ serveur_forgejo_utilisateur }}" mode: "0750" loop: - "" @@ -78,18 +78,18 @@ - name: Creer le repertoire de configuration ansible.builtin.file: - path: "{{ serveurs_forgejo_config_dir }}" + path: "{{ serveur_forgejo_config_dir }}" state: directory owner: root - group: "{{ serveurs_forgejo_utilisateur }}" + group: "{{ serveur_forgejo_utilisateur }}" mode: "0770" - name: Deployer app.ini ansible.builtin.template: src: app.ini.j2 - dest: "{{ serveurs_forgejo_config }}" + dest: "{{ serveur_forgejo_config }}" owner: root - group: "{{ serveurs_forgejo_utilisateur }}" + group: "{{ serveur_forgejo_utilisateur }}" mode: "0640" no_log: true notify: Redemarrer forgejo @@ -105,7 +105,7 @@ - name: Activer et demarrer Forgejo ansible.builtin.systemd: - name: "{{ serveurs_forgejo_service }}" + name: "{{ serveur_forgejo_service }}" enabled: true state: started daemon_reload: true @@ -113,15 +113,15 @@ - name: Creer le compte administrateur (une fois) ansible.builtin.shell: cmd: >- - {{ serveurs_forgejo_binaire }} admin user create - --admin --username {{ serveurs_forgejo_admin_user }} - --email {{ serveurs_forgejo_admin_email }} - --password '{{ serveurs_forgejo_admin_password }}' - --config {{ serveurs_forgejo_config }} - && touch {{ serveurs_forgejo_data }}/.admin-created - creates: "{{ serveurs_forgejo_data }}/.admin-created" + {{ serveur_forgejo_binaire }} admin user create + --admin --username {{ serveur_forgejo_admin_user }} + --email {{ serveur_forgejo_admin_email }} + --password '{{ serveur_forgejo_admin_password }}' + --config {{ serveur_forgejo_config }} + && touch {{ serveur_forgejo_data }}/.admin-created + creates: "{{ serveur_forgejo_data }}/.admin-created" become: true - become_user: "{{ serveurs_forgejo_utilisateur }}" + become_user: "{{ serveur_forgejo_utilisateur }}" environment: - GITEA_WORK_DIR: "{{ serveurs_forgejo_data }}" + GITEA_WORK_DIR: "{{ serveur_forgejo_data }}" no_log: true diff --git a/roles/serveur_forgejo/templates/app.ini.j2 b/roles/serveur_forgejo/templates/app.ini.j2 new file mode 100644 index 0000000..2a99d3e --- /dev/null +++ b/roles/serveur_forgejo/templates/app.ini.j2 @@ -0,0 +1,34 @@ +; Gere par Set-OPS (role serveur_forgejo). Ne pas editer a la main. +APP_NAME = Forgejo Chezlepro +RUN_USER = {{ serveur_forgejo_utilisateur }} +RUN_MODE = prod +WORK_PATH = {{ serveur_forgejo_data }} + +[server] +DOMAIN = {{ serveur_forgejo_hostname }} +ROOT_URL = https://{{ serveur_forgejo_hostname }}/ +HTTP_ADDR = 127.0.0.1 +HTTP_PORT = {{ serveur_forgejo_http_port }} +SSH_DOMAIN = {{ serveur_forgejo_hostname }} + +[database] +DB_TYPE = postgres +HOST = {{ serveur_forgejo_db_host }}:{{ serveur_forgejo_db_port | default(5432) }} +NAME = {{ serveur_forgejo_entree.base }} +USER = {{ serveur_forgejo_entree.proprietaire }} +PASSWD = {{ serveur_forgejo_db_password }} + +[security] +INSTALL_LOCK = true +SECRET_KEY = {{ serveur_forgejo_secret_key }} +INTERNAL_TOKEN = {{ serveur_forgejo_internal_token }} + +[service] +DISABLE_REGISTRATION = true + +[mailer] +ENABLED = true +PROTOCOL = smtp +SMTP_ADDR = {{ serveur_forgejo_smtp }} +SMTP_PORT = 25 +FROM = forge@chezlepro.internal diff --git a/roles/serveur_forgejo/templates/forgejo.service.j2 b/roles/serveur_forgejo/templates/forgejo.service.j2 new file mode 100644 index 0000000..790b84e --- /dev/null +++ b/roles/serveur_forgejo/templates/forgejo.service.j2 @@ -0,0 +1,20 @@ +[Unit] +Description=Forgejo (forge Git) +Documentation=https://forgejo.org/docs/ +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +User={{ serveur_forgejo_utilisateur }} +Group={{ serveur_forgejo_utilisateur }} +WorkingDirectory={{ serveur_forgejo_data }} +ExecStart={{ serveur_forgejo_binaire }} web --config {{ serveur_forgejo_config }} +Restart=always +RestartSec=5 +Environment=USER={{ serveur_forgejo_utilisateur }} +Environment=HOME=/home/{{ serveur_forgejo_utilisateur }} +Environment=GITEA_WORK_DIR={{ serveur_forgejo_data }} + +[Install] +WantedBy=multi-user.target diff --git a/roles/serveurs_grafana/README.md b/roles/serveur_grafana/README.md similarity index 60% rename from roles/serveurs_grafana/README.md rename to roles/serveur_grafana/README.md index 333523f..5209585 100644 --- a/roles/serveurs_grafana/README.md +++ b/roles/serveur_grafana/README.md @@ -1,4 +1,4 @@ -# serveurs_grafana +# serveur_grafana Tableaux de bord **Grafana** (dépôt apt officiel Grafana). Interface d'observabilité au-dessus de Prometheus (métriques) et Loki (journaux). @@ -10,24 +10,24 @@ au-dessus de Prometheus (métriques) et Loki (journaux). - Inscriptions publiques désactivées. ## Publication -- Derrière `serveurs_nginx` (TLS à l'edge) ; `GF_SERVER_ROOT_URL=https://grafana.chezlepro.internal/`. -- Le site nginx se déclare côté `serveurs_nginx`. +- Derrière `serveur_nginx` (TLS à l'edge) ; `GF_SERVER_ROOT_URL=https://grafana.chezlepro.internal/`. +- Le site nginx se déclare côté `serveur_nginx`. ## Secret requis (Vault) ```yaml -serveurs_grafana_admin_password: "{{ vault_grafana_admin }}" +serveur_grafana_admin_password: "{{ vault_grafana_admin }}" ``` ## Variables principales | Variable | Défaut | Rôle | | --- | --- | --- | -| `serveurs_grafana_hostname` | `grafana.chezlepro.internal` | Domaine | -| `serveurs_grafana_prometheus_url` | `http://localhost:9090` | Datasource Prometheus | -| `serveurs_grafana_loki_url` | `http://localhost:3100` | Datasource Loki | +| `serveur_grafana_hostname` | `grafana.chezlepro.internal` | Domaine | +| `serveur_grafana_prometheus_url` | `http://localhost:9090` | Datasource Prometheus | +| `serveur_grafana_loki_url` | `http://localhost:3100` | Datasource Loki | ## Notes - Prometheus, Loki et Grafana sont co-localisés sur `obs-01` → datasources en `localhost`. -- Dépendance `serveurs_grafana requiert serveurs_prometheus + serveurs_loki actifs` (déjà dans `docs/dependances-groupes.yml`). +- Dépendance `serveur_grafana requiert serveur_prometheus + serveur_loki actifs` (déjà dans `docs/dependances-groupes.yml`). ## Hors périmètre - Dashboards provisionnés (à ajouter ensuite), alerting Grafana, authentification OIDC via Keycloak (intégration ultérieure). diff --git a/roles/serveur_grafana/defaults/main.yml b/roles/serveur_grafana/defaults/main.yml new file mode 100644 index 0000000..4fa56a6 --- /dev/null +++ b/roles/serveur_grafana/defaults/main.yml @@ -0,0 +1,22 @@ +--- +serveur_grafana_paquets: + - grafana + +serveur_grafana_service: "grafana-server" +serveur_grafana_port: 3000 + +# Publication (derriere serveur_nginx, TLS termine a l'edge). +serveur_grafana_hostname: "grafana.chezlepro.internal" +serveur_grafana_root_url: "https://{{ serveur_grafana_hostname }}/" + +# Datasources (Prometheus + Loki, co-localises sur obs-01). +serveur_grafana_prometheus_url: "http://localhost:9090" +serveur_grafana_loki_url: "http://localhost:3100" + +# Secret OBLIGATOIRE (Ansible Vault). +serveur_grafana_admin_password: "" # {{ vault_grafana_admin }} + +# Depot apt officiel Grafana (partage avec serveur_loki). +serveur_grafana_depot_cle_url: "https://apt.grafana.com/gpg-full.key" +serveur_grafana_depot_cle_fichier: "/etc/apt/keyrings/grafana.asc" +serveur_grafana_depot_source: "deb [signed-by=/etc/apt/keyrings/grafana.asc] https://apt.grafana.com stable main" diff --git a/roles/serveurs_grafana/handlers/main.yml b/roles/serveur_grafana/handlers/main.yml similarity index 75% rename from roles/serveurs_grafana/handlers/main.yml rename to roles/serveur_grafana/handlers/main.yml index 7f6aa1a..0ca026e 100644 --- a/roles/serveurs_grafana/handlers/main.yml +++ b/roles/serveur_grafana/handlers/main.yml @@ -1,7 +1,7 @@ --- - name: Redemarrer grafana ansible.builtin.systemd: - name: "{{ serveurs_grafana_service }}" + name: "{{ serveur_grafana_service }}" state: restarted daemon_reload: true listen: Redemarrer grafana diff --git a/roles/serveurs_grafana/tasks/main.yml b/roles/serveur_grafana/tasks/main.yml similarity index 80% rename from roles/serveurs_grafana/tasks/main.yml rename to roles/serveur_grafana/tasks/main.yml index 39d6d7b..d912ef8 100644 --- a/roles/serveurs_grafana/tasks/main.yml +++ b/roles/serveur_grafana/tasks/main.yml @@ -2,8 +2,8 @@ - name: Exiger le mot de passe admin Grafana (Vault) ansible.builtin.assert: that: - - serveurs_grafana_admin_password | length > 0 - fail_msg: "serveurs_grafana_admin_password est requis (Ansible Vault)." + - serveur_grafana_admin_password | length > 0 + fail_msg: "serveur_grafana_admin_password est requis (Ansible Vault)." - name: Assurer le repertoire des trousseaux apt ansible.builtin.file: @@ -15,21 +15,21 @@ - name: Telecharger la cle de signature Grafana ansible.builtin.get_url: - url: "{{ serveurs_grafana_depot_cle_url }}" - dest: "{{ serveurs_grafana_depot_cle_fichier }}" + url: "{{ serveur_grafana_depot_cle_url }}" + dest: "{{ serveur_grafana_depot_cle_fichier }}" owner: root group: root mode: "0644" - name: Ajouter le depot apt Grafana ansible.builtin.apt_repository: - repo: "{{ serveurs_grafana_depot_source }}" + repo: "{{ serveur_grafana_depot_source }}" filename: grafana state: present - name: Installer Grafana ansible.builtin.apt: - name: "{{ serveurs_grafana_paquets }}" + name: "{{ serveur_grafana_paquets }}" state: present update_cache: true @@ -62,7 +62,7 @@ - name: Activer et demarrer Grafana ansible.builtin.systemd: - name: "{{ serveurs_grafana_service }}" + name: "{{ serveur_grafana_service }}" enabled: true state: started daemon_reload: true diff --git a/roles/serveur_grafana/templates/chezlepro.conf.j2 b/roles/serveur_grafana/templates/chezlepro.conf.j2 new file mode 100644 index 0000000..bdf601d --- /dev/null +++ b/roles/serveur_grafana/templates/chezlepro.conf.j2 @@ -0,0 +1,5 @@ +[Service] +Environment=GF_SERVER_DOMAIN={{ serveur_grafana_hostname }} +Environment=GF_SERVER_ROOT_URL={{ serveur_grafana_root_url }} +Environment=GF_SECURITY_ADMIN_PASSWORD={{ serveur_grafana_admin_password }} +Environment=GF_USERS_ALLOW_SIGN_UP=false diff --git a/roles/serveur_grafana/templates/datasources.yaml.j2 b/roles/serveur_grafana/templates/datasources.yaml.j2 new file mode 100644 index 0000000..5887fcb --- /dev/null +++ b/roles/serveur_grafana/templates/datasources.yaml.j2 @@ -0,0 +1,13 @@ +# Gere par Set-OPS (role serveur_grafana). Ne pas editer a la main. +apiVersion: 1 + +datasources: + - name: Prometheus + type: prometheus + access: proxy + url: {{ serveur_grafana_prometheus_url }} + isDefault: true + - name: Loki + type: loki + access: proxy + url: {{ serveur_grafana_loki_url }} diff --git a/roles/serveurs_icinga/README.md b/roles/serveur_icinga/README.md similarity index 85% rename from roles/serveurs_icinga/README.md rename to roles/serveur_icinga/README.md index f9e473f..bbf3efe 100644 --- a/roles/serveurs_icinga/README.md +++ b/roles/serveur_icinga/README.md @@ -1,4 +1,4 @@ -# serveurs_icinga +# serveur_icinga Supervision active **Icinga** — cœur de surveillance. Portée actuelle : **Icinga 2 + Icinga DB** (avec son Redis dédié et sa base PostgreSQL). **Icinga Web 2 est différé** @@ -14,8 +14,8 @@ Icinga DB** (avec son Redis dédié et sa base PostgreSQL). **Icinga Web 2 est d ## Base de données Entrée registre `icingadb` (PostgreSQL sur data-01). Mot de passe partagé via Vault -(`vault_bd_icingadb`), comme Keycloak. Dépendance `serveurs_icinga requiert -serveurs_postgresql actif` (déjà dans `docs/dependances-groupes.yml`). +(`vault_bd_icingadb`), comme Keycloak. Dépendance `serveur_icinga requiert +serveur_postgresql actif` (déjà dans `docs/dependances-groupes.yml`). ## Différé (phase Icinga Web 2) - `icingaweb2` + sa **2e base** (`icingaweb`) + PHP-FPM + vhost nginx + assistant de @@ -30,4 +30,4 @@ serveurs_postgresql actif` (déjà dans `docs/dependances-groupes.yml`). - L'import de schéma s'exécute une seule fois (marqueur `/etc/icingadb/.schema-imported`). ## Prérequis -- `serveurs_postgresql` actif (base `icingadb` créée), accès réseau à data-01:5432. +- `serveur_postgresql` actif (base `icingadb` créée), accès réseau à data-01:5432. diff --git a/roles/serveurs_icinga/defaults/main.yml b/roles/serveur_icinga/defaults/main.yml similarity index 51% rename from roles/serveurs_icinga/defaults/main.yml rename to roles/serveur_icinga/defaults/main.yml index 5094049..8071b5a 100644 --- a/roles/serveurs_icinga/defaults/main.yml +++ b/roles/serveur_icinga/defaults/main.yml @@ -1,28 +1,28 @@ --- -serveurs_icinga_paquets: +serveur_icinga_paquets: - icinga2 - icingadb - icingadb-redis - postgresql-client # pour importer le schema vers la BD distante -serveurs_icinga_service_icinga2: "icinga2" -serveurs_icinga_service_icingadb: "icingadb" -serveurs_icinga_service_redis: "icingadb-redis" +serveur_icinga_service_icinga2: "icinga2" +serveur_icinga_service_icingadb: "icingadb" +serveur_icinga_service_redis: "icingadb-redis" # Depot apt officiel Icinga (paquet trousseau + source signee). -serveurs_icinga_keyring_url: >- +serveur_icinga_keyring_url: >- https://packages.icinga.com/icinga-archive-keyring_latest+debian{{ ansible_distribution_major_version }}.deb -serveurs_icinga_depot_source: >- +serveur_icinga_depot_source: >- deb [signed-by=/usr/share/keyrings/icinga-archive-keyring.gpg] https://packages.icinga.com/debian icinga-{{ ansible_distribution_release }} main # Base Icinga DB : resolue depuis le registre par le groupe consommateur. -serveurs_icinga_groupe: "serveurs_icinga" -serveurs_icinga_db_host: "10.1.13.11" # data-01 (serveurs_postgresql) +serveur_icinga_groupe: "serveur_icinga" +serveur_icinga_db_host: "10.1.13.11" # data-01 (serveur_postgresql) # Redis dedie a Icinga DB (paquet icingadb-redis). -serveurs_icinga_redis_host: "localhost" -serveurs_icinga_redis_port: 6380 +serveur_icinga_redis_host: "localhost" +serveur_icinga_redis_port: 6380 -serveurs_icinga_config: "/etc/icingadb/config.yml" -serveurs_icinga_schema: "/usr/share/icingadb/schema/pgsql/schema.sql" +serveur_icinga_config: "/etc/icingadb/config.yml" +serveur_icinga_schema: "/usr/share/icingadb/schema/pgsql/schema.sql" diff --git a/roles/serveurs_icinga/handlers/main.yml b/roles/serveur_icinga/handlers/main.yml similarity index 68% rename from roles/serveurs_icinga/handlers/main.yml rename to roles/serveur_icinga/handlers/main.yml index 2ecbb9c..24233e5 100644 --- a/roles/serveurs_icinga/handlers/main.yml +++ b/roles/serveur_icinga/handlers/main.yml @@ -1,12 +1,12 @@ --- - name: Redemarrer icinga2 ansible.builtin.systemd: - name: "{{ serveurs_icinga_service_icinga2 }}" + name: "{{ serveur_icinga_service_icinga2 }}" state: restarted listen: Redemarrer icinga2 - name: Redemarrer icingadb ansible.builtin.systemd: - name: "{{ serveurs_icinga_service_icingadb }}" + name: "{{ serveur_icinga_service_icingadb }}" state: restarted listen: Redemarrer icingadb diff --git a/roles/serveurs_icinga/tasks/main.yml b/roles/serveur_icinga/tasks/main.yml similarity index 67% rename from roles/serveurs_icinga/tasks/main.yml rename to roles/serveur_icinga/tasks/main.yml index b670ee5..0eb5847 100644 --- a/roles/serveurs_icinga/tasks/main.yml +++ b/roles/serveur_icinga/tasks/main.yml @@ -1,7 +1,7 @@ --- - name: Telecharger le trousseau de cles Icinga ansible.builtin.get_url: - url: "{{ serveurs_icinga_keyring_url }}" + url: "{{ serveur_icinga_keyring_url }}" dest: "/tmp/icinga-archive-keyring.deb" mode: "0644" @@ -12,13 +12,13 @@ - name: Ajouter le depot apt Icinga ansible.builtin.apt_repository: - repo: "{{ serveurs_icinga_depot_source }}" + repo: "{{ serveur_icinga_depot_source }}" filename: icinga state: present - name: Installer Icinga 2, Icinga DB et Redis dedie ansible.builtin.apt: - name: "{{ serveurs_icinga_paquets }}" + name: "{{ serveur_icinga_paquets }}" state: present update_cache: true @@ -28,29 +28,29 @@ - name: Resoudre l'entree de base Icinga DB (par consommateur) ansible.builtin.set_fact: - serveurs_icinga_entree: >- + serveur_icinga_entree: >- {{ ((bases_donnees | default({})) | dict2items | selectattr('value.consommateur', 'defined') - | selectattr('value.consommateur', 'equalto', serveurs_icinga_groupe) + | selectattr('value.consommateur', 'equalto', serveur_icinga_groupe) | map(attribute='value') | list | first) | default({}) }} - name: Exiger l'entree de registre et son secret ansible.builtin.assert: that: - - serveurs_icinga_entree.base is defined - - serveurs_icinga_entree.secret is defined - fail_msg: "Aucune base avec consommateur '{{ serveurs_icinga_groupe }}' dans docs/bases-donnees.yml." + - serveur_icinga_entree.base is defined + - serveur_icinga_entree.secret is defined + fail_msg: "Aucune base avec consommateur '{{ serveur_icinga_groupe }}' dans docs/bases-donnees.yml." - name: Resoudre le mot de passe de base (Vault) ansible.builtin.set_fact: - serveurs_icinga_db_password: "{{ lookup('vars', serveurs_icinga_entree.secret) }}" + serveur_icinga_db_password: "{{ lookup('vars', serveur_icinga_entree.secret) }}" no_log: true - name: Resoudre l'hote du serveur de base de donnees (registre) ansible.builtin.set_fact: - serveurs_icinga_db_host: >- - {{ (serveurs_bd | default({}))[serveurs_icinga_entree.serveur].hote - | default(serveurs_icinga_db_host) }} + serveur_icinga_db_host: >- + {{ (serveurs_bd | default({}))[serveur_icinga_entree.serveur].hote + | default(serveur_icinga_db_host) }} - name: Configurer l'API Icinga 2 ansible.builtin.command: @@ -66,16 +66,16 @@ - name: Activer et demarrer le Redis Icinga DB ansible.builtin.systemd: - name: "{{ serveurs_icinga_service_redis }}" + name: "{{ serveur_icinga_service_redis }}" enabled: true state: started - name: Importer le schema Icinga DB dans PostgreSQL (une fois) ansible.builtin.shell: cmd: >- - PGPASSWORD='{{ serveurs_icinga_db_password }}' - psql -h {{ serveurs_icinga_db_host }} -U {{ serveurs_icinga_entree.proprietaire }} - -d {{ serveurs_icinga_entree.base }} -f {{ serveurs_icinga_schema }} + PGPASSWORD='{{ serveur_icinga_db_password }}' + psql -h {{ serveur_icinga_db_host }} -U {{ serveur_icinga_entree.proprietaire }} + -d {{ serveur_icinga_entree.base }} -f {{ serveur_icinga_schema }} && touch /etc/icingadb/.schema-imported creates: /etc/icingadb/.schema-imported no_log: true @@ -83,7 +83,7 @@ - name: Deployer la configuration Icinga DB ansible.builtin.template: src: config.yml.j2 - dest: "{{ serveurs_icinga_config }}" + dest: "{{ serveur_icinga_config }}" owner: root group: icingadb mode: "0640" @@ -96,5 +96,5 @@ enabled: true state: started loop: - - "{{ serveurs_icinga_service_icinga2 }}" - - "{{ serveurs_icinga_service_icingadb }}" + - "{{ serveur_icinga_service_icinga2 }}" + - "{{ serveur_icinga_service_icingadb }}" diff --git a/roles/serveur_icinga/templates/config.yml.j2 b/roles/serveur_icinga/templates/config.yml.j2 new file mode 100644 index 0000000..c2645a4 --- /dev/null +++ b/roles/serveur_icinga/templates/config.yml.j2 @@ -0,0 +1,11 @@ +# Gere par Set-OPS (role serveur_icinga). Ne pas editer a la main. +database: + type: pgsql + host: {{ serveur_icinga_db_host }} + database: {{ serveur_icinga_entree.base }} + user: {{ serveur_icinga_entree.proprietaire }} + password: {{ serveur_icinga_db_password }} + +redis: + host: {{ serveur_icinga_redis_host }} + port: {{ serveur_icinga_redis_port }} diff --git a/roles/serveurs_keycloak/README.md b/roles/serveur_keycloak/README.md similarity index 61% rename from roles/serveurs_keycloak/README.md rename to roles/serveur_keycloak/README.md index 919c36b..5fc84fd 100644 --- a/roles/serveurs_keycloak/README.md +++ b/roles/serveur_keycloak/README.md @@ -1,4 +1,4 @@ -# serveurs_keycloak +# serveur_keycloak SSO / IAM **Keycloak** (distribution Quarkus) — hub d'authentification centralisée (OIDC/SAML) pour les services Chezlepro. @@ -6,37 +6,37 @@ SSO / IAM **Keycloak** (distribution Quarkus) — hub d'authentification central ## Rôle - Installe un JRE, télécharge et extrait la distribution Keycloak dans `/opt/keycloak`. - Configure la **base PostgreSQL via le registre** `docs/bases-donnees.yml` (entrée `keycloak`). -- Publie derrière `serveurs_nginx` (TLS à l'edge) : `hostname`, `proxy-headers=xforwarded`, `http-enabled=true`. +- Publie derrière `serveur_nginx` (TLS à l'edge) : `hostname`, `proxy-headers=xforwarded`, `http-enabled=true`. - Secrets (mot de passe BD + admin bootstrap) dans `/etc/keycloak/keycloak.env` (`0640`, `no_log`). - `kc.sh build --db=postgres` (une fois par version) puis service systemd `start --optimized`. ## Premier consommateur du registre de BD L'entrée `keycloak` de `docs/bases-donnees.yml` fait que : -1. `serveurs_postgresql` crée la base `keycloak` + le compte propriétaire `keycloak`. +1. `serveur_postgresql` crée la base `keycloak` + le compte propriétaire `keycloak`. 2. Ce rôle lit **la même entrée** pour bâtir sa connexion (`db-url-database`, `db-username`, mot de passe = `vault_bd_keycloak`). -Mot de passe partagé, source unique. Dépendance `serveurs_keycloak requiert serveurs_postgresql actif` déjà dans `docs/dependances-groupes.yml`. +Mot de passe partagé, source unique. Dépendance `serveur_keycloak requiert serveur_postgresql actif` déjà dans `docs/dependances-groupes.yml`. ## Secrets requis (Vault) ```yaml -serveurs_keycloak_admin_password: "{{ vault_keycloak_admin }}" # admin bootstrap +serveur_keycloak_admin_password: "{{ vault_keycloak_admin }}" # admin bootstrap vault_bd_keycloak: "..." # mot de passe BD (partage avec postgres) ``` ## Variables principales | Variable | Défaut | Rôle | | --- | --- | --- | -| `serveurs_keycloak_version` | `26.0.7` | Version (à vérifier/bumper sur keycloak.org/downloads) | -| `serveurs_keycloak_hostname` | `keycloak.chezlepro.internal` | Hostname public (via nginx) | -| `serveurs_keycloak_db_host` | `10.1.13.11` | IP de data-01 (serveurs_postgresql) | -| `serveurs_keycloak_admin_user` | `admin` | Admin bootstrap | +| `serveur_keycloak_version` | `26.0.7` | Version (à vérifier/bumper sur keycloak.org/downloads) | +| `serveur_keycloak_hostname` | `keycloak.chezlepro.internal` | Hostname public (via nginx) | +| `serveur_keycloak_db_host` | `10.1.13.11` | IP de data-01 (serveur_postgresql) | +| `serveur_keycloak_admin_user` | `admin` | Admin bootstrap | ## Notes / limites - **Version** : à confirmer/bumper ; l'URL suit le motif officiel des releases GitHub. - L'unité systemd est dérivée des conventions Keycloak (la doc officielle ne fournit pas d'unité) — sandboxing volontairement modéré pour ne pas casser le démarrage. -- Le **site nginx** publiant Keycloak se déclare côté `serveurs_nginx` (`serveurs_nginx_sites`), pas ici. +- Le **site nginx** publiant Keycloak se déclare côté `serveur_nginx` (`serveur_nginx_sites`), pas ici. - Certificats : TLS terminé à l'edge ; aucun certificat sur Keycloak. ## Prérequis - Réseau sortant pour télécharger la distribution. -- Base PostgreSQL atteignable (dépendance `serveurs_postgresql`). +- Base PostgreSQL atteignable (dépendance `serveur_postgresql`). diff --git a/roles/serveur_keycloak/defaults/main.yml b/roles/serveur_keycloak/defaults/main.yml new file mode 100644 index 0000000..47eca07 --- /dev/null +++ b/roles/serveur_keycloak/defaults/main.yml @@ -0,0 +1,21 @@ +--- +# Distribution Keycloak (Quarkus). Verifier/ajuster la version sur keycloak.org/downloads. +serveur_keycloak_version: "26.0.7" +serveur_keycloak_url: "https://github.com/keycloak/keycloak/releases/download/{{ serveur_keycloak_version }}/keycloak-{{ serveur_keycloak_version }}.tar.gz" +serveur_keycloak_java_paquet: "default-jre-headless" + +serveur_keycloak_home: "/opt/keycloak" +serveur_keycloak_utilisateur: "keycloak" +serveur_keycloak_service: "keycloak" + +# Publication (derriere serveur_nginx, TLS termine a l'edge). +serveur_keycloak_hostname: "keycloak.chezlepro.internal" + +# Base de donnees : resolue depuis le registre par le groupe consommateur. +serveur_keycloak_groupe: "serveur_keycloak" +# IP interne du serveur PostgreSQL (data-01, cf. nomenclature). +serveur_keycloak_db_host: "10.1.13.11" + +# Secrets (Ansible Vault) — obligatoires. +serveur_keycloak_admin_user: "admin" +serveur_keycloak_admin_password: "" # {{ vault_keycloak_admin }} diff --git a/roles/serveurs_keycloak/handlers/main.yml b/roles/serveur_keycloak/handlers/main.yml similarity index 75% rename from roles/serveurs_keycloak/handlers/main.yml rename to roles/serveur_keycloak/handlers/main.yml index 2589c52..37f1c47 100644 --- a/roles/serveurs_keycloak/handlers/main.yml +++ b/roles/serveur_keycloak/handlers/main.yml @@ -1,7 +1,7 @@ --- - name: Redemarrer keycloak ansible.builtin.systemd: - name: "{{ serveurs_keycloak_service }}" + name: "{{ serveur_keycloak_service }}" state: restarted daemon_reload: true listen: Redemarrer keycloak diff --git a/roles/serveurs_keycloak/tasks/main.yml b/roles/serveur_keycloak/tasks/main.yml similarity index 54% rename from roles/serveurs_keycloak/tasks/main.yml rename to roles/serveur_keycloak/tasks/main.yml index 2ad7813..969c7c1 100644 --- a/roles/serveurs_keycloak/tasks/main.yml +++ b/roles/serveur_keycloak/tasks/main.yml @@ -2,8 +2,8 @@ - name: Exiger le mot de passe admin Keycloak (Vault) ansible.builtin.assert: that: - - serveurs_keycloak_admin_password | length > 0 - fail_msg: "serveurs_keycloak_admin_password est requis (Ansible Vault)." + - serveur_keycloak_admin_password | length > 0 + fail_msg: "serveur_keycloak_admin_password est requis (Ansible Vault)." - name: Charger le registre des bases applicatives ansible.builtin.include_vars: @@ -11,76 +11,76 @@ - name: Resoudre l'entree de base de donnees Keycloak (par consommateur) ansible.builtin.set_fact: - serveurs_keycloak_entree: >- + serveur_keycloak_entree: >- {{ ((bases_donnees | default({})) | dict2items | selectattr('value.consommateur', 'defined') - | selectattr('value.consommateur', 'equalto', serveurs_keycloak_groupe) + | selectattr('value.consommateur', 'equalto', serveur_keycloak_groupe) | map(attribute='value') | list | first) | default({}) }} - name: Exiger une entree de registre et son secret ansible.builtin.assert: that: - - serveurs_keycloak_entree.base is defined - - serveurs_keycloak_entree.proprietaire is defined - - serveurs_keycloak_entree.secret is defined - fail_msg: "Aucune base avec consommateur '{{ serveurs_keycloak_groupe }}' dans docs/bases-donnees.yml." + - serveur_keycloak_entree.base is defined + - serveur_keycloak_entree.proprietaire is defined + - serveur_keycloak_entree.secret is defined + fail_msg: "Aucune base avec consommateur '{{ serveur_keycloak_groupe }}' dans docs/bases-donnees.yml." - name: Resoudre le mot de passe de base de donnees (Vault) ansible.builtin.set_fact: - serveurs_keycloak_db_password: "{{ lookup('vars', serveurs_keycloak_entree.secret) }}" + serveur_keycloak_db_password: "{{ lookup('vars', serveur_keycloak_entree.secret) }}" no_log: true - name: Resoudre l'hote du serveur de base de donnees (registre) ansible.builtin.set_fact: - serveurs_keycloak_db_host: >- - {{ (serveurs_bd | default({}))[serveurs_keycloak_entree.serveur].hote - | default(serveurs_keycloak_db_host) }} + serveur_keycloak_db_host: >- + {{ (serveurs_bd | default({}))[serveur_keycloak_entree.serveur].hote + | default(serveur_keycloak_db_host) }} - name: Installer le JRE ansible.builtin.apt: - name: "{{ serveurs_keycloak_java_paquet }}" + name: "{{ serveur_keycloak_java_paquet }}" state: present update_cache: true cache_valid_time: 3600 - name: Creer l'utilisateur systeme keycloak ansible.builtin.user: - name: "{{ serveurs_keycloak_utilisateur }}" + name: "{{ serveur_keycloak_utilisateur }}" system: true - home: "{{ serveurs_keycloak_home }}" + home: "{{ serveur_keycloak_home }}" create_home: false shell: /usr/sbin/nologin - name: Creer le repertoire d'installation ansible.builtin.file: - path: "{{ serveurs_keycloak_home }}" + path: "{{ serveur_keycloak_home }}" state: directory - owner: "{{ serveurs_keycloak_utilisateur }}" - group: "{{ serveurs_keycloak_utilisateur }}" + owner: "{{ serveur_keycloak_utilisateur }}" + group: "{{ serveur_keycloak_utilisateur }}" mode: "0750" - name: Telecharger la distribution Keycloak ansible.builtin.get_url: - url: "{{ serveurs_keycloak_url }}" - dest: "/tmp/keycloak-{{ serveurs_keycloak_version }}.tar.gz" + url: "{{ serveur_keycloak_url }}" + dest: "/tmp/keycloak-{{ serveur_keycloak_version }}.tar.gz" mode: "0644" - name: Extraire Keycloak ansible.builtin.unarchive: - src: "/tmp/keycloak-{{ serveurs_keycloak_version }}.tar.gz" - dest: "{{ serveurs_keycloak_home }}" + src: "/tmp/keycloak-{{ serveur_keycloak_version }}.tar.gz" + dest: "{{ serveur_keycloak_home }}" remote_src: true extra_opts: ["--strip-components=1"] - owner: "{{ serveurs_keycloak_utilisateur }}" - group: "{{ serveurs_keycloak_utilisateur }}" - creates: "{{ serveurs_keycloak_home }}/bin/kc.sh" + owner: "{{ serveur_keycloak_utilisateur }}" + group: "{{ serveur_keycloak_utilisateur }}" + creates: "{{ serveur_keycloak_home }}/bin/kc.sh" - name: Deployer keycloak.conf (config non sensible) ansible.builtin.template: src: keycloak.conf.j2 - dest: "{{ serveurs_keycloak_home }}/conf/keycloak.conf" - owner: "{{ serveurs_keycloak_utilisateur }}" - group: "{{ serveurs_keycloak_utilisateur }}" + dest: "{{ serveur_keycloak_home }}/conf/keycloak.conf" + owner: "{{ serveur_keycloak_utilisateur }}" + group: "{{ serveur_keycloak_utilisateur }}" mode: "0640" notify: Redemarrer keycloak @@ -89,7 +89,7 @@ path: /etc/keycloak state: directory owner: root - group: "{{ serveurs_keycloak_utilisateur }}" + group: "{{ serveur_keycloak_utilisateur }}" mode: "0750" - name: Deployer le fichier d'environnement (secrets) @@ -97,7 +97,7 @@ src: keycloak.env.j2 dest: /etc/keycloak/keycloak.env owner: root - group: "{{ serveurs_keycloak_utilisateur }}" + group: "{{ serveur_keycloak_utilisateur }}" mode: "0640" no_log: true notify: Redemarrer keycloak @@ -105,11 +105,11 @@ - name: Construire Keycloak (une fois par version) ansible.builtin.shell: cmd: >- - {{ serveurs_keycloak_home }}/bin/kc.sh build --db=postgres - && touch {{ serveurs_keycloak_home }}/.kc-built-{{ serveurs_keycloak_version }} - creates: "{{ serveurs_keycloak_home }}/.kc-built-{{ serveurs_keycloak_version }}" + {{ serveur_keycloak_home }}/bin/kc.sh build --db=postgres + && touch {{ serveur_keycloak_home }}/.kc-built-{{ serveur_keycloak_version }} + creates: "{{ serveur_keycloak_home }}/.kc-built-{{ serveur_keycloak_version }}" become: true - become_user: "{{ serveurs_keycloak_utilisateur }}" + become_user: "{{ serveur_keycloak_utilisateur }}" notify: Redemarrer keycloak - name: Deployer l'unite systemd keycloak @@ -123,7 +123,7 @@ - name: Activer et demarrer keycloak ansible.builtin.systemd: - name: "{{ serveurs_keycloak_service }}" + name: "{{ serveur_keycloak_service }}" enabled: true state: started daemon_reload: true diff --git a/roles/serveur_keycloak/templates/keycloak.conf.j2 b/roles/serveur_keycloak/templates/keycloak.conf.j2 new file mode 100644 index 0000000..ef93818 --- /dev/null +++ b/roles/serveur_keycloak/templates/keycloak.conf.j2 @@ -0,0 +1,10 @@ +# Gere par Set-OPS (role serveur_keycloak). Ne pas editer a la main. +db=postgres +db-url-host={{ serveur_keycloak_db_host }} +db-url-database={{ serveur_keycloak_entree.base }} +db-username={{ serveur_keycloak_entree.proprietaire }} + +# Derriere serveur_nginx (TLS termine a l'edge). +hostname={{ serveur_keycloak_hostname }} +proxy-headers=xforwarded +http-enabled=true diff --git a/roles/serveur_keycloak/templates/keycloak.env.j2 b/roles/serveur_keycloak/templates/keycloak.env.j2 new file mode 100644 index 0000000..ea87ebe --- /dev/null +++ b/roles/serveur_keycloak/templates/keycloak.env.j2 @@ -0,0 +1,4 @@ +# Gere par Set-OPS (role serveur_keycloak). Secrets — ne pas editer a la main. +KC_DB_PASSWORD={{ serveur_keycloak_db_password }} +KC_BOOTSTRAP_ADMIN_USERNAME={{ serveur_keycloak_admin_user }} +KC_BOOTSTRAP_ADMIN_PASSWORD={{ serveur_keycloak_admin_password }} diff --git a/roles/serveurs_keycloak/templates/keycloak.service.j2 b/roles/serveur_keycloak/templates/keycloak.service.j2 similarity index 68% rename from roles/serveurs_keycloak/templates/keycloak.service.j2 rename to roles/serveur_keycloak/templates/keycloak.service.j2 index fc3be26..1ed68f7 100644 --- a/roles/serveurs_keycloak/templates/keycloak.service.j2 +++ b/roles/serveur_keycloak/templates/keycloak.service.j2 @@ -6,11 +6,11 @@ Wants=network-online.target [Service] Type=simple -User={{ serveurs_keycloak_utilisateur }} -Group={{ serveurs_keycloak_utilisateur }} +User={{ serveur_keycloak_utilisateur }} +Group={{ serveur_keycloak_utilisateur }} EnvironmentFile=/etc/keycloak/keycloak.env -WorkingDirectory={{ serveurs_keycloak_home }} -ExecStart={{ serveurs_keycloak_home }}/bin/kc.sh start --optimized +WorkingDirectory={{ serveur_keycloak_home }} +ExecStart={{ serveur_keycloak_home }}/bin/kc.sh start --optimized Restart=on-failure RestartSec=5 TimeoutStartSec=120 diff --git a/roles/serveurs_loki/README.md b/roles/serveur_loki/README.md similarity index 77% rename from roles/serveurs_loki/README.md rename to roles/serveur_loki/README.md index d0ff5fe..948734d 100644 --- a/roles/serveurs_loki/README.md +++ b/roles/serveur_loki/README.md @@ -1,4 +1,4 @@ -# serveurs_loki +# serveur_loki Agrégation de journaux **Loki** (dépôt apt officiel Grafana), plateforme d'observabilité. @@ -11,14 +11,14 @@ Agrégation de journaux **Loki** (dépôt apt officiel Grafana), plateforme d'ob ## Variables principales | Variable | Défaut | Rôle | | --- | --- | --- | -| `serveurs_loki_port` | `3100` | Port HTTP | -| `serveurs_loki_chemin` | `/var/lib/loki` | Stockage local | -| `serveurs_loki_retention` | `744h` (31 j) | Rétention des journaux | +| `serveur_loki_port` | `3100` | Port HTTP | +| `serveur_loki_chemin` | `/var/lib/loki` | Stockage local | +| `serveur_loki_retention` | `744h` (31 j) | Rétention des journaux | ## Intégration - Côté VM : l'expédition des journaux (promtail / Grafana Alloy) sera gérée par le - futur rôle `clients_journaux`. -- `serveurs_grafana` consommera Loki comme datasource. + futur rôle `client_journal`. +- `serveur_grafana` consommera Loki comme datasource. ## Notes / limites - Le format de configuration Loki **évolue entre versions** ; la config fournie cible diff --git a/roles/serveur_loki/defaults/main.yml b/roles/serveur_loki/defaults/main.yml new file mode 100644 index 0000000..32ce9ba --- /dev/null +++ b/roles/serveur_loki/defaults/main.yml @@ -0,0 +1,14 @@ +--- +serveur_loki_paquets: + - loki + +serveur_loki_service: "loki" +serveur_loki_config: "/etc/loki/config.yml" +serveur_loki_port: 3100 +serveur_loki_chemin: "/var/lib/loki" +serveur_loki_retention: "744h" # 31 jours + +# Depot apt officiel Grafana (partage avec serveur_grafana). +serveur_loki_depot_cle_url: "https://apt.grafana.com/gpg-full.key" +serveur_loki_depot_cle_fichier: "/etc/apt/keyrings/grafana.asc" +serveur_loki_depot_source: "deb [signed-by=/etc/apt/keyrings/grafana.asc] https://apt.grafana.com stable main" diff --git a/roles/serveurs_loki/handlers/main.yml b/roles/serveur_loki/handlers/main.yml similarity index 71% rename from roles/serveurs_loki/handlers/main.yml rename to roles/serveur_loki/handlers/main.yml index 5a84b8b..959f819 100644 --- a/roles/serveurs_loki/handlers/main.yml +++ b/roles/serveur_loki/handlers/main.yml @@ -1,6 +1,6 @@ --- - name: Redemarrer loki ansible.builtin.systemd: - name: "{{ serveurs_loki_service }}" + name: "{{ serveur_loki_service }}" state: restarted listen: Redemarrer loki diff --git a/roles/serveurs_loki/tasks/main.yml b/roles/serveur_loki/tasks/main.yml similarity index 75% rename from roles/serveurs_loki/tasks/main.yml rename to roles/serveur_loki/tasks/main.yml index a40c9d4..3e11112 100644 --- a/roles/serveurs_loki/tasks/main.yml +++ b/roles/serveur_loki/tasks/main.yml @@ -9,27 +9,27 @@ - name: Telecharger la cle de signature Grafana ansible.builtin.get_url: - url: "{{ serveurs_loki_depot_cle_url }}" - dest: "{{ serveurs_loki_depot_cle_fichier }}" + url: "{{ serveur_loki_depot_cle_url }}" + dest: "{{ serveur_loki_depot_cle_fichier }}" owner: root group: root mode: "0644" - name: Ajouter le depot apt Grafana ansible.builtin.apt_repository: - repo: "{{ serveurs_loki_depot_source }}" + repo: "{{ serveur_loki_depot_source }}" filename: grafana state: present - name: Installer Loki ansible.builtin.apt: - name: "{{ serveurs_loki_paquets }}" + name: "{{ serveur_loki_paquets }}" state: present update_cache: true - name: Assurer le repertoire de donnees Loki ansible.builtin.file: - path: "{{ serveurs_loki_chemin }}" + path: "{{ serveur_loki_chemin }}" state: directory owner: loki group: loki @@ -38,7 +38,7 @@ - name: Deployer la configuration Loki ansible.builtin.template: src: config.yml.j2 - dest: "{{ serveurs_loki_config }}" + dest: "{{ serveur_loki_config }}" owner: root group: loki mode: "0640" @@ -46,6 +46,6 @@ - name: Activer et demarrer Loki ansible.builtin.systemd: - name: "{{ serveurs_loki_service }}" + name: "{{ serveur_loki_service }}" enabled: true state: started diff --git a/roles/serveurs_loki/templates/config.yml.j2 b/roles/serveur_loki/templates/config.yml.j2 similarity index 52% rename from roles/serveurs_loki/templates/config.yml.j2 rename to roles/serveur_loki/templates/config.yml.j2 index 7fe7bf9..eb62be7 100644 --- a/roles/serveurs_loki/templates/config.yml.j2 +++ b/roles/serveur_loki/templates/config.yml.j2 @@ -1,16 +1,16 @@ -# Gere par Set-OPS (role serveurs_loki). Ne pas editer a la main. +# Gere par Set-OPS (role serveur_loki). Ne pas editer a la main. auth_enabled: false server: - http_listen_port: {{ serveurs_loki_port }} + http_listen_port: {{ serveur_loki_port }} grpc_listen_port: 9096 common: - path_prefix: {{ serveurs_loki_chemin }} + path_prefix: {{ serveur_loki_chemin }} storage: filesystem: - chunks_directory: {{ serveurs_loki_chemin }}/chunks - rules_directory: {{ serveurs_loki_chemin }}/rules + chunks_directory: {{ serveur_loki_chemin }}/chunks + rules_directory: {{ serveur_loki_chemin }}/rules replication_factor: 1 ring: kvstore: @@ -27,9 +27,9 @@ schema_config: period: 24h compactor: - working_directory: {{ serveurs_loki_chemin }}/compactor + working_directory: {{ serveur_loki_chemin }}/compactor retention_enabled: true delete_request_store: filesystem limits_config: - retention_period: {{ serveurs_loki_retention }} + retention_period: {{ serveur_loki_retention }} diff --git a/roles/serveur_nginx/README.md b/roles/serveur_nginx/README.md new file mode 100644 index 0000000..d3f7191 --- /dev/null +++ b/roles/serveur_nginx/README.md @@ -0,0 +1,37 @@ +# serveur_nginx + +Installe et configure nginx comme **edge** interne : reverse proxy et terminaison TLS. + +## Rôle +- Installe `nginx` et `ssl-cert` (certificat auto-signé). +- Durcissement de base via `conf.d/99-chezlepro.conf` (`server_tokens off`, TLS 1.2/1.3, taille de corps). +- Publie des sites de reverse proxy déclarés dans `serveur_nginx_sites` (vide par défaut). +- **Valide la configuration (`nginx -t`) avant de recharger** (handler `Valider et recharger nginx`). + +## TLS +- Par défaut, certificat auto-signé Debian (`snakeoil`) — l'edge répond en HTTPS dès l'installation. +- `serveur_nginx_certificat` / `serveur_nginx_cle` (ou par site) permettent de basculer vers les certificats de l'AC interne / ACME quand `serveur_step_ca` existera. + +## Variables principales +| Variable | Défaut | Rôle | +| --- | --- | --- | +| `serveur_nginx_certificat` / `_cle` | snakeoil | Certificat TLS par défaut | +| `serveur_nginx_ssl_protocols` | `TLSv1.2 TLSv1.3` | Protocoles TLS | +| `serveur_nginx_server_tokens` | `off` | Masque la version | +| `serveur_nginx_taille_max_corps` | `16m` | `client_max_body_size` | +| `serveur_nginx_redirection_http` | `true` | Redirige 80 → 443 | +| `serveur_nginx_desactiver_defaut` | `false` | Retire le site Debian par défaut | +| `serveur_nginx_sites` | `[]` | Sites reverse proxy | + +## Déclarer un site +```yaml +serveur_nginx_sites: + - nom: forge + domaine: forge.chezlepro.internal + amont: "http://10.1.15.11:3000" + # certificat / cle optionnels (sinon snakeoil) +``` + +## Hors périmètre +- WAF (ModSecurity) — lift externe, à traiter dans une phase dédiée. +- Émission automatique des certificats (dépend de `serveur_step_ca`). diff --git a/roles/serveurs_nginx/defaults/main.yml b/roles/serveur_nginx/defaults/main.yml similarity index 67% rename from roles/serveurs_nginx/defaults/main.yml rename to roles/serveur_nginx/defaults/main.yml index 0b56e2c..b1494df 100644 --- a/roles/serveurs_nginx/defaults/main.yml +++ b/roles/serveur_nginx/defaults/main.yml @@ -1,27 +1,27 @@ --- -serveurs_nginx_packages: +serveur_nginx_packages: - nginx - ssl-cert # fournit le certificat auto-signe (snakeoil) -serveurs_nginx_service_name: "nginx" +serveur_nginx_service_name: "nginx" # TLS : par defaut le certificat auto-signe Debian (snakeoil). # A remplacer par des certificats de l'AC interne / ACME (step_ca) plus tard. -serveurs_nginx_certificat: "/etc/ssl/certs/ssl-cert-snakeoil.pem" -serveurs_nginx_cle: "/etc/ssl/private/ssl-cert-snakeoil.key" +serveur_nginx_certificat: "/etc/ssl/certs/ssl-cert-snakeoil.pem" +serveur_nginx_cle: "/etc/ssl/private/ssl-cert-snakeoil.key" # Durcissement de base. -serveurs_nginx_server_tokens: "off" -serveurs_nginx_ssl_protocols: "TLSv1.2 TLSv1.3" -serveurs_nginx_taille_max_corps: "16m" +serveur_nginx_server_tokens: "off" +serveur_nginx_ssl_protocols: "TLSv1.2 TLSv1.3" +serveur_nginx_taille_max_corps: "16m" # Comportement des sites. -serveurs_nginx_redirection_http: true # 80 -> 443 -serveurs_nginx_desactiver_defaut: false # retirer le site Debian par defaut +serveur_nginx_redirection_http: true # 80 -> 443 +serveur_nginx_desactiver_defaut: false # retirer le site Debian par defaut # Sites de reverse proxy declares a la main. Vide par defaut. # S'AJOUTENT aux vhosts derives automatiquement de docs/domaines.yml. -serveurs_nginx_sites: [] +serveur_nginx_sites: [] # - nom: forge # domaine: forge.chezlepro.internal # amont: "http://10.1.15.11:3000" @@ -30,11 +30,11 @@ serveurs_nginx_sites: [] # Groupe edge auquel ce role s'identifie (pour filtrer le champ "edge" de # docs/domaines.yml). Permet plusieurs edges distincts a terme. -serveurs_nginx_groupe: "serveurs_nginx" +serveur_nginx_groupe: "serveur_nginx" # Deriver automatiquement des vhosts depuis docs/domaines.yml (bloc "exposition"). # Pour chaque exposition de type "web" dont l'edge vise ce groupe, un vhost est # genere : amont = entree "amont" explicite, sinon http://:. Une exposition non resolvable (cible sans hote actif, ou sans # port) est ignoree (binding declare mais pas encore cablable). -serveurs_nginx_publier_expositions: true +serveur_nginx_publier_expositions: true diff --git a/roles/serveurs_nginx/handlers/main.yml b/roles/serveur_nginx/handlers/main.yml similarity index 84% rename from roles/serveurs_nginx/handlers/main.yml rename to roles/serveur_nginx/handlers/main.yml index 1401af3..babb941 100644 --- a/roles/serveurs_nginx/handlers/main.yml +++ b/roles/serveur_nginx/handlers/main.yml @@ -7,6 +7,6 @@ - name: Recharger nginx ansible.builtin.systemd: - name: "{{ serveurs_nginx_service_name }}" + name: "{{ serveur_nginx_service_name }}" state: reloaded listen: Valider et recharger nginx diff --git a/roles/serveurs_nginx/tasks/main.yml b/roles/serveur_nginx/tasks/main.yml similarity index 81% rename from roles/serveurs_nginx/tasks/main.yml rename to roles/serveur_nginx/tasks/main.yml index 1e24ddf..039a940 100644 --- a/roles/serveurs_nginx/tasks/main.yml +++ b/roles/serveur_nginx/tasks/main.yml @@ -1,7 +1,7 @@ --- - name: Installer nginx ansible.builtin.apt: - name: "{{ serveurs_nginx_packages }}" + name: "{{ serveur_nginx_packages }}" state: present update_cache: true cache_valid_time: 3600 @@ -19,7 +19,7 @@ ansible.builtin.file: path: /etc/nginx/sites-enabled/default state: absent - when: serveurs_nginx_desactiver_defaut | bool + when: serveur_nginx_desactiver_defaut | bool notify: Valider et recharger nginx - name: Deployer les sites reverse proxy declares a la main @@ -29,7 +29,7 @@ owner: root group: root mode: "0644" - loop: "{{ serveurs_nginx_sites }}" + loop: "{{ serveur_nginx_sites }}" loop_control: label: "{{ item.nom }}" notify: Valider et recharger nginx @@ -39,7 +39,7 @@ src: "/etc/nginx/sites-available/{{ item.nom }}.conf" dest: "/etc/nginx/sites-enabled/{{ item.nom }}.conf" state: link - loop: "{{ serveurs_nginx_sites }}" + loop: "{{ serveur_nginx_sites }}" loop_control: label: "{{ item.nom }}" notify: Valider et recharger nginx @@ -51,14 +51,14 @@ loop: - "{{ role_path }}/../../docs/applications.yml" - "{{ role_path }}/../../docs/domaines.yml" - when: serveurs_nginx_publier_expositions | bool + when: serveur_nginx_publier_expositions | bool - name: Lister les expositions destinees a cet edge ansible.builtin.set_fact: - serveurs_nginx_expositions: >- + serveur_nginx_expositions: >- {{ {'applications': applications | default({})} - | expositions_des_applications({'domaines_publics': domaines_publics | default({})}, serveurs_nginx_groupe) }} - when: serveurs_nginx_publier_expositions | bool + | 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: @@ -67,7 +67,7 @@ owner: root group: root mode: "0644" - when: serveurs_nginx_publier_expositions | bool + when: serveur_nginx_publier_expositions | bool notify: Valider et recharger nginx - name: Activer les vhosts derives des expositions web @@ -75,11 +75,11 @@ src: /etc/nginx/sites-available/expositions.conf dest: /etc/nginx/sites-enabled/expositions.conf state: link - when: serveurs_nginx_publier_expositions | bool + when: serveur_nginx_publier_expositions | bool notify: Valider et recharger nginx - name: Activer et demarrer nginx ansible.builtin.systemd: - name: "{{ serveurs_nginx_service_name }}" + name: "{{ serveur_nginx_service_name }}" enabled: true state: started diff --git a/roles/serveur_nginx/templates/99-chezlepro.conf.j2 b/roles/serveur_nginx/templates/99-chezlepro.conf.j2 new file mode 100644 index 0000000..9d5cd5f --- /dev/null +++ b/roles/serveur_nginx/templates/99-chezlepro.conf.j2 @@ -0,0 +1,4 @@ +# Gere par Set-OPS (role serveur_nginx). Ne pas editer a la main. +server_tokens {{ serveur_nginx_server_tokens }}; +ssl_protocols {{ serveur_nginx_ssl_protocols }}; +client_max_body_size {{ serveur_nginx_taille_max_corps }}; diff --git a/roles/serveurs_nginx/templates/expositions.conf.j2 b/roles/serveur_nginx/templates/expositions.conf.j2 similarity index 86% rename from roles/serveurs_nginx/templates/expositions.conf.j2 rename to roles/serveur_nginx/templates/expositions.conf.j2 index 7854bf9..d0800d3 100644 --- a/roles/serveurs_nginx/templates/expositions.conf.j2 +++ b/roles/serveur_nginx/templates/expositions.conf.j2 @@ -1,12 +1,12 @@ # Vhosts derives des applications (champ 'expose' de docs/applications.yml, -# edge depuis docs/domaines.yml) — gere par Set-OPS (role serveurs_nginx). +# edge depuis docs/domaines.yml) — gere par Set-OPS (role serveur_nginx). # Ne pas editer a la main. # # Un FQDN expose produit un vhost si l'hote de l'application est resolvable : # amont = http://:. 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([]) %} +{% for expo in serveur_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 %} @@ -14,7 +14,7 @@ {% if ns.amont %} # {{ expo.fqdn }} -> application {{ expo.application }} sur {{ expo.hote }} ({{ ns.amont }}) -{% if serveurs_nginx_redirection_http | bool %} +{% if serveur_nginx_redirection_http | bool %} server { listen 80; listen [::]:80; @@ -28,8 +28,8 @@ server { http2 on; server_name {{ expo.fqdn }}; - ssl_certificate {{ serveurs_nginx_certificat }}; - ssl_certificate_key {{ serveurs_nginx_cle }}; + ssl_certificate {{ serveur_nginx_certificat }}; + ssl_certificate_key {{ serveur_nginx_cle }}; location / { proxy_pass {{ ns.amont }}; diff --git a/roles/serveurs_nginx/templates/site.conf.j2 b/roles/serveur_nginx/templates/site.conf.j2 similarity index 64% rename from roles/serveurs_nginx/templates/site.conf.j2 rename to roles/serveur_nginx/templates/site.conf.j2 index 354ac7a..a4143ef 100644 --- a/roles/serveurs_nginx/templates/site.conf.j2 +++ b/roles/serveur_nginx/templates/site.conf.j2 @@ -1,5 +1,5 @@ -# {{ item.nom }} — gere par Set-OPS (role serveurs_nginx). Ne pas editer a la main. -{% if serveurs_nginx_redirection_http | bool %} +# {{ item.nom }} — gere par Set-OPS (role serveur_nginx). Ne pas editer a la main. +{% if serveur_nginx_redirection_http | bool %} server { listen 80; listen [::]:80; @@ -13,8 +13,8 @@ server { http2 on; server_name {{ item.domaine }}; - ssl_certificate {{ item.certificat | default(serveurs_nginx_certificat) }}; - ssl_certificate_key {{ item.cle | default(serveurs_nginx_cle) }}; + ssl_certificate {{ item.certificat | default(serveur_nginx_certificat) }}; + ssl_certificate_key {{ item.cle | default(serveur_nginx_cle) }}; location / { proxy_pass {{ item.amont }}; diff --git a/roles/serveurs_openldap/README.md b/roles/serveur_openldap/README.md similarity index 72% rename from roles/serveurs_openldap/README.md rename to roles/serveur_openldap/README.md index 43e813d..64d20f9 100644 --- a/roles/serveurs_openldap/README.md +++ b/roles/serveur_openldap/README.md @@ -1,6 +1,6 @@ -# serveurs_openldap +# serveur_openldap -Annuaire interne OpenLDAP (slapd Debian), socle d'identité pour `clients_ldap` +Annuaire interne OpenLDAP (slapd Debian), socle d'identité pour `client_ldap` et fédération applicative (Keycloak). ## Rôle @@ -15,24 +15,24 @@ et fédération applicative (Keycloak). ## Secret requis (Vault) ```yaml -serveurs_openldap_admin_password: "{{ vault_openldap_admin }}" +serveur_openldap_admin_password: "{{ vault_openldap_admin }}" ``` -À placer dans un `group_vars/serveurs_openldap/vault.yml` chiffré. Sans lui, le rôle +À placer dans un `group_vars/serveur_openldap/vault.yml` chiffré. Sans lui, le rôle refuse de s'exécuter (assertion explicite). ## Variables principales | Variable | Défaut | Rôle | | --- | --- | --- | -| `serveurs_openldap_domaine` | `chezlepro.internal` | Domaine → base DN | -| `serveurs_openldap_organisation` | `Chezlepro Inc` | Organisation | -| `serveurs_openldap_ou` | `[people, groups]` | OU de base créées | +| `serveur_openldap_domaine` | `chezlepro.internal` | Domaine → base DN | +| `serveur_openldap_organisation` | `Chezlepro Inc` | Organisation | +| `serveur_openldap_ou` | `[people, groups]` | OU de base créées | ## Notes / limites - Le préseed debconf configure slapd à l'**installation initiale**. Reconfigurer un slapd déjà installé (changer domaine/mot de passe) nécessite `dpkg-reconfigure slapd` manuel (non automatisé ici pour éviter une purge accidentelle de la base). -- TLS (LDAPS) : hors périmètre du socle — viendra avec les certificats de `serveurs_step_ca`. -- Entrées utilisateurs/groupes : gérées ailleurs (identité / `clients_ldap`). +- TLS (LDAPS) : hors périmètre du socle — viendra avec les certificats de `serveur_step_ca`. +- Entrées utilisateurs/groupes : gérées ailleurs (identité / `client_ldap`). ## Prérequis - Collection `community.general` (`ldap_entry`) + `python3-ldap` sur la cible. diff --git a/roles/serveur_openldap/defaults/main.yml b/roles/serveur_openldap/defaults/main.yml new file mode 100644 index 0000000..cab1055 --- /dev/null +++ b/roles/serveur_openldap/defaults/main.yml @@ -0,0 +1,22 @@ +--- +serveur_openldap_paquets: + - slapd + - ldap-utils + - python3-ldap # requis par community.general.ldap_entry sur la cible + +serveur_openldap_service: "slapd" + +# Identite de l'annuaire. +serveur_openldap_domaine: "chezlepro.internal" +serveur_openldap_organisation: "Chezlepro Inc" +# Base DN derivee du domaine : chezlepro.internal -> dc=chezlepro,dc=internal +serveur_openldap_base_dn: "dc={{ serveur_openldap_domaine.split('.') | join(',dc=') }}" +serveur_openldap_admin_dn: "cn=admin,{{ serveur_openldap_base_dn }}" + +# Secret OBLIGATOIRE (Ansible Vault). +serveur_openldap_admin_password: "" # {{ vault_openldap_admin }} + +# Unites organisationnelles de base. +serveur_openldap_ou: + - people + - groups diff --git a/roles/serveurs_openldap/tasks/main.yml b/roles/serveur_openldap/tasks/main.yml similarity index 72% rename from roles/serveurs_openldap/tasks/main.yml rename to roles/serveur_openldap/tasks/main.yml index 2589688..a3dc273 100644 --- a/roles/serveurs_openldap/tasks/main.yml +++ b/roles/serveur_openldap/tasks/main.yml @@ -2,8 +2,8 @@ - name: Exiger le mot de passe admin LDAP (Vault) ansible.builtin.assert: that: - - serveurs_openldap_admin_password | length > 0 - fail_msg: "serveurs_openldap_admin_password est requis (a fournir via Ansible Vault)." + - serveur_openldap_admin_password | length > 0 + fail_msg: "serveur_openldap_admin_password est requis (a fournir via Ansible Vault)." - name: Preconfigurer slapd (debconf) ansible.builtin.debconf: @@ -13,8 +13,8 @@ value: "{{ item.value }}" loop: - { question: "slapd/no_configuration", vtype: "boolean", value: "false" } - - { question: "slapd/domain", vtype: "string", value: "{{ serveurs_openldap_domaine }}" } - - { question: "shared/organization", vtype: "string", value: "{{ serveurs_openldap_organisation }}" } + - { question: "slapd/domain", vtype: "string", value: "{{ serveur_openldap_domaine }}" } + - { question: "shared/organization", vtype: "string", value: "{{ serveur_openldap_organisation }}" } - { question: "slapd/backend", vtype: "select", value: "MDB" } - { question: "slapd/purge_database", vtype: "boolean", value: "true" } - { question: "slapd/move_old_database", vtype: "boolean", value: "true" } @@ -27,7 +27,7 @@ name: slapd question: "{{ item }}" vtype: password - value: "{{ serveurs_openldap_admin_password }}" + value: "{{ serveur_openldap_admin_password }}" loop: - slapd/password1 - slapd/password2 @@ -35,25 +35,25 @@ - name: Installer OpenLDAP ansible.builtin.apt: - name: "{{ serveurs_openldap_paquets }}" + name: "{{ serveur_openldap_paquets }}" state: present update_cache: true cache_valid_time: 3600 - name: Activer et demarrer slapd ansible.builtin.systemd: - name: "{{ serveurs_openldap_service }}" + name: "{{ serveur_openldap_service }}" enabled: true state: started - name: Creer les unites organisationnelles de base community.general.ldap_entry: - dn: "ou={{ item }},{{ serveurs_openldap_base_dn }}" + dn: "ou={{ item }},{{ serveur_openldap_base_dn }}" objectClass: organizationalUnit server_uri: "ldapi:///" - bind_dn: "{{ serveurs_openldap_admin_dn }}" - bind_pw: "{{ serveurs_openldap_admin_password }}" - loop: "{{ serveurs_openldap_ou }}" + bind_dn: "{{ serveur_openldap_admin_dn }}" + bind_pw: "{{ serveur_openldap_admin_password }}" + loop: "{{ serveur_openldap_ou }}" loop_control: label: "ou={{ item }}" no_log: true diff --git a/roles/serveurs_postgresql/README.md b/roles/serveur_postgresql/README.md similarity index 68% rename from roles/serveurs_postgresql/README.md rename to roles/serveur_postgresql/README.md index 44c716a..042e045 100644 --- a/roles/serveurs_postgresql/README.md +++ b/roles/serveur_postgresql/README.md @@ -1,4 +1,4 @@ -# serveurs_postgresql +# serveur_postgresql Installe et configure PostgreSQL (paquet Debian 13) comme base relationnelle partagée interne. @@ -12,30 +12,30 @@ Installe et configure PostgreSQL (paquet Debian 13) comme base relationnelle par ## Réseau et sécurité - Écoute par défaut sur `127.0.0.1` et l'IP interne de l'hôte (`ansible_host`). -- `serveurs_postgresql_reseaux_autorises` ouvre l'accès aux clients internes (défaut `10.1.0.0/16`). +- `serveur_postgresql_reseaux_autorises` ouvre l'accès aux clients internes (défaut `10.1.0.0/16`). - Authentification `scram-sha-256` (jamais `md5`/`trust`). - `pg_hba.conf` et la conf sont **entièrement gérés** par le rôle ; les modifications manuelles sont écrasées. ## Variables principales | Variable | Défaut | Rôle | | --- | --- | --- | -| `serveurs_postgresql_version` | `""` (auto) | Version majeure du cluster | -| `serveurs_postgresql_port` | `5432` | Port d'écoute | -| `serveurs_postgresql_ecoute` | `127.0.0.1` + IP interne | `listen_addresses` | -| `serveurs_postgresql_reseaux_autorises` | `["10.1.0.0/16"]` | Réseaux clients en `pg_hba` | -| `serveurs_postgresql_methode_auth` | `scram-sha-256` | Méthode d'authentification | -| `serveurs_postgresql_parametres` | `{}` | Réglages additionnels | -| `serveurs_postgresql_comptes` | `[]` | Comptes applicatifs (mot de passe via Vault) | -| `serveurs_postgresql_bases` | `[]` | Bases applicatives | +| `serveur_postgresql_version` | `""` (auto) | Version majeure du cluster | +| `serveur_postgresql_port` | `5432` | Port d'écoute | +| `serveur_postgresql_ecoute` | `127.0.0.1` + IP interne | `listen_addresses` | +| `serveur_postgresql_reseaux_autorises` | `["10.1.0.0/16"]` | Réseaux clients en `pg_hba` | +| `serveur_postgresql_methode_auth` | `scram-sha-256` | Méthode d'authentification | +| `serveur_postgresql_parametres` | `{}` | Réglages additionnels | +| `serveur_postgresql_comptes` | `[]` | Comptes applicatifs (mot de passe via Vault) | +| `serveur_postgresql_bases` | `[]` | Bases applicatives | ## Provisionnement applicatif À déclarer quand un service en a besoin, mots de passe **depuis Ansible Vault** : ```yaml -serveurs_postgresql_comptes: +serveur_postgresql_comptes: - nom: keycloak mot_de_passe: "{{ vault_postgresql_keycloak }}" -serveurs_postgresql_bases: +serveur_postgresql_bases: - nom: keycloak proprietaire: keycloak ``` @@ -43,7 +43,7 @@ serveurs_postgresql_bases: ## Registre partagé des bases applicatives En plus des listes explicites, le rôle lit **`docs/bases-donnees.yml`** (registre déclaratif) et crée chaque base + son compte propriétaire dont `serveur` vaut -`serveurs_postgresql`. Le mot de passe vient de la variable Vault nommée par le +`serveur_postgresql`. Le mot de passe vient de la variable Vault nommée par le champ `secret`. Le rôle applicatif lit le même registre pour bâtir sa chaîne de connexion — secret partagé, source unique. Patron : 1 appli → 1 base → 1 owner → 1 chaîne de connexion. Voir l'en-tête de `docs/bases-donnees.yml`. diff --git a/roles/serveurs_postgresql/defaults/main.yml b/roles/serveur_postgresql/defaults/main.yml similarity index 70% rename from roles/serveurs_postgresql/defaults/main.yml rename to roles/serveur_postgresql/defaults/main.yml index 2029fd9..26d83ad 100644 --- a/roles/serveurs_postgresql/defaults/main.yml +++ b/roles/serveur_postgresql/defaults/main.yml @@ -1,38 +1,38 @@ --- -serveurs_postgresql_packages: +serveur_postgresql_packages: - postgresql - postgresql-contrib - python3-psycopg2 # requis par community.postgresql sur la cible -serveurs_postgresql_service_name: "postgresql" +serveur_postgresql_service_name: "postgresql" # Version majeure du cluster. Vide => detection automatique du cluster installe # par Debian (repertoire sous /etc/postgresql//main). -serveurs_postgresql_version: "" +serveur_postgresql_version: "" # Reseau et acces. -serveurs_postgresql_port: 5432 -serveurs_postgresql_ecoute: +serveur_postgresql_port: 5432 +serveur_postgresql_ecoute: - "127.0.0.1" - "{{ ansible_host | default(ansible_default_ipv4.address, true) }}" -serveurs_postgresql_reseaux_autorises: +serveur_postgresql_reseaux_autorises: - "10.1.0.0/16" -serveurs_postgresql_methode_auth: "scram-sha-256" +serveur_postgresql_methode_auth: "scram-sha-256" # Reglages additionnels (vide => valeurs par defaut de Debian). # Exemple : { shared_buffers: "256MB", work_mem: "16MB" } -serveurs_postgresql_parametres: {} +serveur_postgresql_parametres: {} # Nom du groupe serveur (pour filtrer le registre des bases applicatives). # Le registre lui-meme (bases_donnees) est charge depuis docs/bases-donnees.yml. -serveurs_postgresql_groupe: "serveurs_postgresql" +serveur_postgresql_groupe: "serveur_postgresql" # Provisioning applicatif explicite. Vide par defaut : aucune base ni compte cree. # Les mots de passe doivent venir d'Ansible Vault, jamais en clair. -serveurs_postgresql_comptes: [] +serveur_postgresql_comptes: [] # - nom: keycloak # mot_de_passe: "{{ vault_postgresql_keycloak }}" # attributs: "LOGIN" -serveurs_postgresql_bases: [] +serveur_postgresql_bases: [] # - nom: keycloak # proprietaire: keycloak diff --git a/roles/serveurs_postgresql/handlers/main.yml b/roles/serveur_postgresql/handlers/main.yml similarity index 60% rename from roles/serveurs_postgresql/handlers/main.yml rename to roles/serveur_postgresql/handlers/main.yml index e9886bb..65089d5 100644 --- a/roles/serveurs_postgresql/handlers/main.yml +++ b/roles/serveur_postgresql/handlers/main.yml @@ -1,10 +1,10 @@ --- - name: Recharger PostgreSQL ansible.builtin.systemd: - name: "{{ serveurs_postgresql_service_name }}" + name: "{{ serveur_postgresql_service_name }}" state: reloaded - name: Redemarrer PostgreSQL ansible.builtin.systemd: - name: "{{ serveurs_postgresql_service_name }}" + name: "{{ serveur_postgresql_service_name }}" state: restarted diff --git a/roles/serveurs_postgresql/tasks/main.yml b/roles/serveur_postgresql/tasks/main.yml similarity index 71% rename from roles/serveurs_postgresql/tasks/main.yml rename to roles/serveur_postgresql/tasks/main.yml index 22d1aa0..f358d93 100644 --- a/roles/serveurs_postgresql/tasks/main.yml +++ b/roles/serveur_postgresql/tasks/main.yml @@ -1,7 +1,7 @@ --- - name: Installer PostgreSQL ansible.builtin.apt: - name: "{{ serveurs_postgresql_packages }}" + name: "{{ serveur_postgresql_packages }}" state: present update_cache: true cache_valid_time: 3600 @@ -11,27 +11,27 @@ paths: /etc/postgresql file_type: directory recurse: false - register: serveurs_postgresql_clusters + register: serveur_postgresql_clusters - name: Determiner la version du cluster ansible.builtin.set_fact: - serveurs_postgresql_version_effective: >- - {{ serveurs_postgresql_version - or (serveurs_postgresql_clusters.files | map(attribute='path') | map('basename') | sort | last | default('')) }} + serveur_postgresql_version_effective: >- + {{ serveur_postgresql_version + or (serveur_postgresql_clusters.files | map(attribute='path') | map('basename') | sort | last | default('')) }} - name: Refuser si aucun cluster PostgreSQL n'est present ansible.builtin.assert: that: - - serveurs_postgresql_version_effective | length > 0 + - serveur_postgresql_version_effective | length > 0 fail_msg: "Aucun cluster PostgreSQL trouve sous /etc/postgresql." - name: Definir le repertoire de configuration du cluster ansible.builtin.set_fact: - serveurs_postgresql_conf_dir: "/etc/postgresql/{{ serveurs_postgresql_version_effective }}/main" + serveur_postgresql_conf_dir: "/etc/postgresql/{{ serveur_postgresql_version_effective }}/main" - name: Assurer le repertoire conf.d ansible.builtin.file: - path: "{{ serveurs_postgresql_conf_dir }}/conf.d" + path: "{{ serveur_postgresql_conf_dir }}/conf.d" state: directory owner: postgres group: postgres @@ -40,7 +40,7 @@ - name: Deployer la configuration Chezlepro ansible.builtin.template: src: 99-chezlepro.conf.j2 - dest: "{{ serveurs_postgresql_conf_dir }}/conf.d/99-chezlepro.conf" + dest: "{{ serveur_postgresql_conf_dir }}/conf.d/99-chezlepro.conf" owner: postgres group: postgres mode: "0640" @@ -49,7 +49,7 @@ - name: Deployer pg_hba.conf ansible.builtin.template: src: pg_hba.conf.j2 - dest: "{{ serveurs_postgresql_conf_dir }}/pg_hba.conf" + dest: "{{ serveur_postgresql_conf_dir }}/pg_hba.conf" owner: postgres group: postgres mode: "0640" @@ -57,7 +57,7 @@ - name: Activer et demarrer PostgreSQL ansible.builtin.systemd: - name: "{{ serveurs_postgresql_service_name }}" + name: "{{ serveur_postgresql_service_name }}" enabled: true state: started @@ -72,11 +72,11 @@ state: present become: true become_user: postgres - loop: "{{ serveurs_postgresql_comptes }}" + loop: "{{ serveur_postgresql_comptes }}" loop_control: label: "{{ item.nom }}" no_log: true - when: serveurs_postgresql_comptes | length > 0 + when: serveur_postgresql_comptes | length > 0 - name: Creer les bases applicatives PostgreSQL community.postgresql.postgresql_db: @@ -86,10 +86,10 @@ state: present become: true become_user: postgres - loop: "{{ serveurs_postgresql_bases }}" + loop: "{{ serveur_postgresql_bases }}" loop_control: label: "{{ item.nom }}" - when: serveurs_postgresql_bases | length > 0 + when: serveur_postgresql_bases | length > 0 # --- Provisioning depuis le registre partage docs/bases-donnees.yml --- @@ -100,18 +100,18 @@ - name: Determiner les serveurs BD nommes heberges par ce groupe ansible.builtin.set_fact: - serveurs_postgresql_noms_bd: >- + serveur_postgresql_noms_bd: >- {{ (serveurs_bd | default({})) | dict2items | selectattr('value.groupe', 'defined') - | selectattr('value.groupe', 'equalto', serveurs_postgresql_groupe) + | selectattr('value.groupe', 'equalto', serveur_postgresql_groupe) | map(attribute='key') | list }} - name: Selectionner les bases hebergees par ce serveur ansible.builtin.set_fact: - serveurs_postgresql_registre: >- + serveur_postgresql_registre: >- {{ (bases_donnees | default({})) | dict2items | selectattr('value.serveur', 'defined') - | selectattr('value.serveur', 'in', serveurs_postgresql_noms_bd) + | selectattr('value.serveur', 'in', serveur_postgresql_noms_bd) | list }} - name: Creer les comptes proprietaires (registre) @@ -122,11 +122,11 @@ state: present become: true become_user: postgres - loop: "{{ serveurs_postgresql_registre }}" + loop: "{{ serveur_postgresql_registre }}" loop_control: label: "{{ item.value.proprietaire }}" no_log: true - when: serveurs_postgresql_registre | length > 0 + when: serveur_postgresql_registre | length > 0 - name: Creer les bases applicatives (registre) community.postgresql.postgresql_db: @@ -136,7 +136,7 @@ state: present become: true become_user: postgres - loop: "{{ serveurs_postgresql_registre }}" + loop: "{{ serveur_postgresql_registre }}" loop_control: label: "{{ item.value.base }}" - when: serveurs_postgresql_registre | length > 0 + when: serveur_postgresql_registre | length > 0 diff --git a/roles/serveur_postgresql/templates/99-chezlepro.conf.j2 b/roles/serveur_postgresql/templates/99-chezlepro.conf.j2 new file mode 100644 index 0000000..a3bf21d --- /dev/null +++ b/roles/serveur_postgresql/templates/99-chezlepro.conf.j2 @@ -0,0 +1,7 @@ +# Gere par Set-OPS (role serveur_postgresql). Ne pas editer a la main. +listen_addresses = '{{ serveur_postgresql_ecoute | join(",") }}' +port = {{ serveur_postgresql_port }} +password_encryption = '{{ serveur_postgresql_methode_auth }}' +{% for cle, valeur in serveur_postgresql_parametres.items() %} +{{ cle }} = '{{ valeur }}' +{% endfor %} diff --git a/roles/serveur_postgresql/templates/pg_hba.conf.j2 b/roles/serveur_postgresql/templates/pg_hba.conf.j2 new file mode 100644 index 0000000..ee2a30e --- /dev/null +++ b/roles/serveur_postgresql/templates/pg_hba.conf.j2 @@ -0,0 +1,11 @@ +# Gere par Set-OPS (role serveur_postgresql). Ne pas editer a la main. +# Acces administrateur local par socket (requis par Ansible/postgres). +local all postgres peer +local all all peer +# Boucle locale. +host all all 127.0.0.1/32 {{ serveur_postgresql_methode_auth }} +host all all ::1/128 {{ serveur_postgresql_methode_auth }} +# Reseaux internes autorises (clients applicatifs). +{% for reseau in serveur_postgresql_reseaux_autorises %} +host all all {{ reseau }} {{ serveur_postgresql_methode_auth }} +{% endfor %} diff --git a/roles/serveurs_powerdns/README.md b/roles/serveur_powerdns/README.md similarity index 65% rename from roles/serveurs_powerdns/README.md rename to roles/serveur_powerdns/README.md index 6ea03c3..f346cd3 100644 --- a/roles/serveurs_powerdns/README.md +++ b/roles/serveur_powerdns/README.md @@ -1,17 +1,17 @@ -# Role `serveurs_powerdns` +# Role `serveur_powerdns` Installe et configure PowerDNS Authoritative comme service DNS interne initial. Ce premier jalon utilise le backend BIND et une zone generee par Ansible depuis l'inventaire. Cela evite de rendre DNS dependant de PostgreSQL avant que le -service `serveurs_postgresql` soit disponible. +service `serveur_postgresql` soit disponible. Variables principales : -- `serveurs_powerdns_zone` -- `serveurs_powerdns_nameserver` -- `serveurs_powerdns_contact` -- `serveurs_powerdns_records` +- `serveur_powerdns_zone` +- `serveur_powerdns_nameserver` +- `serveur_powerdns_contact` +- `serveur_powerdns_records` Les hotes actifs portant `ansible_host` sont ajoutes automatiquement dans la zone par le template. diff --git a/roles/serveur_powerdns/defaults/main.yml b/roles/serveur_powerdns/defaults/main.yml new file mode 100644 index 0000000..99fd4a1 --- /dev/null +++ b/roles/serveur_powerdns/defaults/main.yml @@ -0,0 +1,33 @@ +--- +serveur_powerdns_packages: + - pdns-server + - pdns-backend-bind + - bind9-utils + - dnsutils + +serveur_powerdns_service_name: "pdns" +serveur_powerdns_zone_directory: "/etc/powerdns/zones" +serveur_powerdns_bind_config: "/etc/powerdns/bindbackend.conf" +serveur_powerdns_zone: "chezlepro.internal" +serveur_powerdns_nameserver: "ns1" +serveur_powerdns_contact: "hostmaster.chezlepro.internal" +serveur_powerdns_ttl: 3600 +serveur_powerdns_serial: 2026062201 +serveur_powerdns_soa_refresh: 3600 +serveur_powerdns_soa_retry: 900 +serveur_powerdns_soa_expire: 1209600 +serveur_powerdns_soa_minimum: 3600 +serveur_powerdns_listen_addresses: + - "0.0.0.0" + - "::" +serveur_powerdns_allow_axfr_ips: [] + +# Enregistrements additionnels geres explicitement. +serveur_powerdns_records: + - name: "dns" + type: "CNAME" + value: "ns1.{{ serveur_powerdns_zone }}." + +# Groupes dont les hotes actifs avec ansible_host seront ajoutes a la zone. +serveur_powerdns_inventory_groups: + - hotes_actifs diff --git a/roles/serveurs_powerdns/handlers/main.yml b/roles/serveur_powerdns/handlers/main.yml similarity index 57% rename from roles/serveurs_powerdns/handlers/main.yml rename to roles/serveur_powerdns/handlers/main.yml index e8d3103..4678271 100644 --- a/roles/serveurs_powerdns/handlers/main.yml +++ b/roles/serveur_powerdns/handlers/main.yml @@ -1,12 +1,12 @@ --- - name: Validate PowerDNS zone ansible.builtin.command: - cmd: "named-checkzone {{ serveurs_powerdns_zone }} {{ serveurs_powerdns_zone_directory }}/{{ serveurs_powerdns_zone }}.zone" + cmd: "named-checkzone {{ serveur_powerdns_zone }} {{ serveur_powerdns_zone_directory }}/{{ serveur_powerdns_zone }}.zone" changed_when: false listen: Validate and reload PowerDNS - name: Restart PowerDNS ansible.builtin.systemd: - name: "{{ serveurs_powerdns_service_name }}" + name: "{{ serveur_powerdns_service_name }}" state: restarted listen: Validate and reload PowerDNS diff --git a/roles/serveurs_powerdns/tasks/main.yml b/roles/serveur_powerdns/tasks/main.yml similarity index 78% rename from roles/serveurs_powerdns/tasks/main.yml rename to roles/serveur_powerdns/tasks/main.yml index 1c4dcc7..4e8460e 100644 --- a/roles/serveurs_powerdns/tasks/main.yml +++ b/roles/serveur_powerdns/tasks/main.yml @@ -1,14 +1,14 @@ --- - name: Installer PowerDNS Authoritative ansible.builtin.apt: - name: "{{ serveurs_powerdns_packages }}" + name: "{{ serveur_powerdns_packages }}" state: present update_cache: true cache_valid_time: 3600 - name: Créer le répertoire des zones PowerDNS ansible.builtin.file: - path: "{{ serveurs_powerdns_zone_directory }}" + path: "{{ serveur_powerdns_zone_directory }}" state: directory owner: root group: root @@ -26,7 +26,7 @@ - name: Déployer l'index des zones PowerDNS ansible.builtin.template: src: bindbackend.conf.j2 - dest: "{{ serveurs_powerdns_bind_config }}" + dest: "{{ serveur_powerdns_bind_config }}" owner: root group: root mode: "0644" @@ -35,7 +35,7 @@ - name: Générer la zone DNS interne depuis l'inventaire ansible.builtin.template: src: zone.db.j2 - dest: "{{ serveurs_powerdns_zone_directory }}/{{ serveurs_powerdns_zone }}.zone" + dest: "{{ serveur_powerdns_zone_directory }}/{{ serveur_powerdns_zone }}.zone" owner: root group: root mode: "0644" @@ -43,6 +43,6 @@ - name: Activer et démarrer PowerDNS ansible.builtin.systemd: - name: "{{ serveurs_powerdns_service_name }}" + name: "{{ serveur_powerdns_service_name }}" enabled: true state: started diff --git a/roles/serveur_powerdns/templates/bindbackend.conf.j2 b/roles/serveur_powerdns/templates/bindbackend.conf.j2 new file mode 100644 index 0000000..8a3e60e --- /dev/null +++ b/roles/serveur_powerdns/templates/bindbackend.conf.j2 @@ -0,0 +1,4 @@ +zone "{{ serveur_powerdns_zone }}" { + type master; + file "{{ serveur_powerdns_zone_directory }}/{{ serveur_powerdns_zone }}.zone"; +}; diff --git a/roles/serveur_powerdns/templates/chezlepro-bind.conf.j2 b/roles/serveur_powerdns/templates/chezlepro-bind.conf.j2 new file mode 100644 index 0000000..8138e81 --- /dev/null +++ b/roles/serveur_powerdns/templates/chezlepro-bind.conf.j2 @@ -0,0 +1,9 @@ +launch+=bind +bind-config={{ serveur_powerdns_bind_config }} +local-address={{ serveur_powerdns_listen_addresses | join(',') }} +{% if serveur_powerdns_allow_axfr_ips | length > 0 %} +allow-axfr-ips={{ serveur_powerdns_allow_axfr_ips | join(',') }} +disable-axfr=no +{% else %} +disable-axfr=yes +{% endif %} diff --git a/roles/serveur_powerdns/templates/zone.db.j2 b/roles/serveur_powerdns/templates/zone.db.j2 new file mode 100644 index 0000000..5b5fa68 --- /dev/null +++ b/roles/serveur_powerdns/templates/zone.db.j2 @@ -0,0 +1,26 @@ +$ORIGIN {{ serveur_powerdns_zone }}. +$TTL {{ serveur_powerdns_ttl }} +@ IN SOA {{ serveur_powerdns_nameserver }}.{{ serveur_powerdns_zone }}. {{ serveur_powerdns_contact }}. ( + {{ serveur_powerdns_serial }} + {{ serveur_powerdns_soa_refresh }} + {{ serveur_powerdns_soa_retry }} + {{ serveur_powerdns_soa_expire }} + {{ serveur_powerdns_soa_minimum }} +) + +@ IN NS {{ serveur_powerdns_nameserver }}.{{ serveur_powerdns_zone }}. +{{ serveur_powerdns_nameserver }} IN A {{ hostvars[groups['serveur_powerdns'][0]].ansible_host | default('127.0.0.1') }} + +{% for record in serveur_powerdns_records %} +{{ record.name }} IN {{ record.type }} {{ record.value }} +{% endfor %} + +{% set emitted = [] %} +{% for group_name in serveur_powerdns_inventory_groups %} +{% for host_name in groups.get(group_name, []) | sort %} +{% if hostvars[host_name].ansible_host is defined and host_name not in emitted %} +{{ host_name }} IN A {{ hostvars[host_name].ansible_host }} +{% set _ = emitted.append(host_name) %} +{% endif %} +{% endfor %} +{% endfor %} diff --git a/roles/serveurs_prometheus/README.md b/roles/serveur_prometheus/README.md similarity index 59% rename from roles/serveurs_prometheus/README.md rename to roles/serveur_prometheus/README.md index 78980b3..40bfeea 100644 --- a/roles/serveurs_prometheus/README.md +++ b/roles/serveur_prometheus/README.md @@ -1,31 +1,31 @@ -# serveurs_prometheus +# serveur_prometheus Collecte de métriques **Prometheus** (paquet Debian), plateforme d'observabilité. ## Rôle - Installe `prometheus`. - Déploie `/etc/prometheus/prometheus.yml` : job `prometheus` (soi-même) + job `node` - dont les **cibles sont dérivées de l'inventaire** (hôtes actifs de `clients_metriques` + dont les **cibles sont dérivées de l'inventaire** (hôtes actifs de `client_metrique` → `node_exporter` sur `:9100`). - Rétention via `/etc/default/prometheus` (`--storage.tsdb.retention.time`). - **`promtool check config` avant rechargement** (handler `Valider et recharger prometheus`). ## Cibles dérivées de l'inventaire Comme la zone DNS, la liste de scrape se construit toute seule : ajouter un hôte au -groupe `clients_metriques` et l'activer suffit à le faire scraper. Aucun edit manuel. +groupe `client_metrique` et l'activer suffit à le faire scraper. Aucun edit manuel. ## Variables principales | Variable | Défaut | Rôle | | --- | --- | --- | -| `serveurs_prometheus_intervalle` | `15s` | `scrape_interval` | -| `serveurs_prometheus_retention` | `15d` | Rétention TSDB | -| `serveurs_prometheus_groupe_metriques` | `clients_metriques` | Groupe source des cibles | -| `serveurs_prometheus_port_node` | `9100` | Port node_exporter | -| `serveurs_prometheus_cibles_supplementaires` | `[]` | Jobs additionnels libres | +| `serveur_prometheus_intervalle` | `15s` | `scrape_interval` | +| `serveur_prometheus_retention` | `15d` | Rétention TSDB | +| `serveur_prometheus_groupe_metriques` | `client_metrique` | Groupe source des cibles | +| `serveur_prometheus_port_node` | `9100` | Port node_exporter | +| `serveur_prometheus_cibles_supplementaires` | `[]` | Jobs additionnels libres | ## Intégration -- Côté VM : `node_exporter` est installé par le futur rôle `clients_metriques`. -- `serveurs_grafana` consommera Prometheus comme datasource. +- Côté VM : `node_exporter` est installé par le futur rôle `client_metrique`. +- `serveur_grafana` consommera Prometheus comme datasource. ## Hors périmètre - Alerting (Alertmanager), règles d'alerte, fédération — phases dédiées. diff --git a/roles/serveur_prometheus/defaults/main.yml b/roles/serveur_prometheus/defaults/main.yml new file mode 100644 index 0000000..eabc9fa --- /dev/null +++ b/roles/serveur_prometheus/defaults/main.yml @@ -0,0 +1,16 @@ +--- +serveur_prometheus_paquets: + - prometheus + +serveur_prometheus_service: "prometheus" +serveur_prometheus_config: "/etc/prometheus/prometheus.yml" + +serveur_prometheus_intervalle: "15s" +serveur_prometheus_retention: "15d" + +# Cibles node_exporter derivees de l'inventaire (hotes actifs de ce groupe). +serveur_prometheus_groupe_metriques: "client_metrique" +serveur_prometheus_port_node: 9100 + +# Jobs additionnels libres : [{ job: nom, cibles: ["hote:port", ...] }] +serveur_prometheus_cibles_supplementaires: [] diff --git a/roles/serveurs_prometheus/handlers/main.yml b/roles/serveur_prometheus/handlers/main.yml similarity index 69% rename from roles/serveurs_prometheus/handlers/main.yml rename to roles/serveur_prometheus/handlers/main.yml index 8d3c56b..769549c 100644 --- a/roles/serveurs_prometheus/handlers/main.yml +++ b/roles/serveur_prometheus/handlers/main.yml @@ -1,12 +1,12 @@ --- - name: Valider la configuration prometheus ansible.builtin.command: - cmd: "promtool check config {{ serveurs_prometheus_config }}" + cmd: "promtool check config {{ serveur_prometheus_config }}" changed_when: false listen: Valider et recharger prometheus - name: Redemarrer prometheus ansible.builtin.systemd: - name: "{{ serveurs_prometheus_service }}" + name: "{{ serveur_prometheus_service }}" state: restarted listen: Valider et recharger prometheus diff --git a/roles/serveurs_prometheus/tasks/main.yml b/roles/serveur_prometheus/tasks/main.yml similarity index 82% rename from roles/serveurs_prometheus/tasks/main.yml rename to roles/serveur_prometheus/tasks/main.yml index a294c2a..20a2a3d 100644 --- a/roles/serveurs_prometheus/tasks/main.yml +++ b/roles/serveur_prometheus/tasks/main.yml @@ -1,7 +1,7 @@ --- - name: Installer Prometheus ansible.builtin.apt: - name: "{{ serveurs_prometheus_paquets }}" + name: "{{ serveur_prometheus_paquets }}" state: present update_cache: true cache_valid_time: 3600 @@ -9,7 +9,7 @@ - name: Deployer la configuration Prometheus ansible.builtin.template: src: prometheus.yml.j2 - dest: "{{ serveurs_prometheus_config }}" + dest: "{{ serveur_prometheus_config }}" owner: root group: root mode: "0644" @@ -26,6 +26,6 @@ - name: Activer et demarrer Prometheus ansible.builtin.systemd: - name: "{{ serveurs_prometheus_service }}" + name: "{{ serveur_prometheus_service }}" enabled: true state: started diff --git a/roles/serveur_prometheus/templates/default-prometheus.j2 b/roles/serveur_prometheus/templates/default-prometheus.j2 new file mode 100644 index 0000000..c1c09ab --- /dev/null +++ b/roles/serveur_prometheus/templates/default-prometheus.j2 @@ -0,0 +1,2 @@ +# Gere par Set-OPS (role serveur_prometheus). +ARGS="--storage.tsdb.retention.time={{ serveur_prometheus_retention }}" diff --git a/roles/serveurs_prometheus/templates/prometheus.yml.j2 b/roles/serveur_prometheus/templates/prometheus.yml.j2 similarity index 56% rename from roles/serveurs_prometheus/templates/prometheus.yml.j2 rename to roles/serveur_prometheus/templates/prometheus.yml.j2 index e1fdf61..8b81732 100644 --- a/roles/serveurs_prometheus/templates/prometheus.yml.j2 +++ b/roles/serveur_prometheus/templates/prometheus.yml.j2 @@ -1,6 +1,6 @@ -# Gere par Set-OPS (role serveurs_prometheus). Ne pas editer a la main. +# Gere par Set-OPS (role serveur_prometheus). Ne pas editer a la main. global: - scrape_interval: {{ serveurs_prometheus_intervalle }} + scrape_interval: {{ serveur_prometheus_intervalle }} scrape_configs: - job_name: prometheus @@ -9,13 +9,13 @@ scrape_configs: - job_name: node static_configs: - - targets: {{ groups.get(serveurs_prometheus_groupe_metriques, []) + - targets: {{ groups.get(serveur_prometheus_groupe_metriques, []) | map('extract', hostvars) | selectattr('ansible_host', 'defined') | map(attribute='ansible_host') - | map('regex_replace', '$', ':' ~ serveurs_prometheus_port_node) + | map('regex_replace', '$', ':' ~ serveur_prometheus_port_node) | list | to_json }} -{% for job in serveurs_prometheus_cibles_supplementaires %} +{% for job in serveur_prometheus_cibles_supplementaires %} - job_name: {{ job.job }} static_configs: diff --git a/roles/serveurs_redis/README.md b/roles/serveur_redis/README.md similarity index 76% rename from roles/serveurs_redis/README.md rename to roles/serveur_redis/README.md index f37bb89..62bf732 100644 --- a/roles/serveurs_redis/README.md +++ b/roles/serveur_redis/README.md @@ -1,4 +1,4 @@ -# serveurs_redis +# serveur_redis Cache / files **Redis** (paquet Debian) sur le nœud données (data-01), aux côtés de PostgreSQL. @@ -17,10 +17,10 @@ PostgreSQL. ## Variables principales | Variable | Défaut | Rôle | | --- | --- | --- | -| `serveurs_redis_ecoute` | `127.0.0.1` + IP interne | Adresses d'écoute (`bind`) | -| `serveurs_redis_maxmemory` | `256mb` | Limite mémoire | -| `serveurs_redis_maxmemory_policy` | `allkeys-lru` | Éviction (cache) | -| `serveurs_redis_password` | `""` (Vault requis) | `requirepass` | +| `serveur_redis_ecoute` | `127.0.0.1` + IP interne | Adresses d'écoute (`bind`) | +| `serveur_redis_maxmemory` | `256mb` | Limite mémoire | +| `serveur_redis_maxmemory_policy` | `allkeys-lru` | Éviction (cache) | +| `serveur_redis_password` | `""` (Vault requis) | `requirepass` | ## Intégration - Consommé par les applis qui ont besoin d'un cache (Nextcloud, etc.) via leur chaîne diff --git a/roles/serveur_redis/defaults/main.yml b/roles/serveur_redis/defaults/main.yml new file mode 100644 index 0000000..af64148 --- /dev/null +++ b/roles/serveur_redis/defaults/main.yml @@ -0,0 +1,18 @@ +--- +serveur_redis_paquets: + - redis-server + +serveur_redis_service: "redis-server" +serveur_redis_config_principal: "/etc/redis/redis.conf" +serveur_redis_config: "/etc/redis/chezlepro.conf" + +serveur_redis_port: 6379 +serveur_redis_ecoute: + - "127.0.0.1" + - "{{ ansible_host | default(ansible_default_ipv4.address, true) }}" + +serveur_redis_maxmemory: "256mb" +serveur_redis_maxmemory_policy: "allkeys-lru" + +# Mot de passe OBLIGATOIRE (expose sur le reseau interne). Ansible Vault. +serveur_redis_password: "" # {{ vault_redis }} diff --git a/roles/serveurs_redis/handlers/main.yml b/roles/serveur_redis/handlers/main.yml similarity index 71% rename from roles/serveurs_redis/handlers/main.yml rename to roles/serveur_redis/handlers/main.yml index 188525f..d743c3d 100644 --- a/roles/serveurs_redis/handlers/main.yml +++ b/roles/serveur_redis/handlers/main.yml @@ -1,6 +1,6 @@ --- - name: Redemarrer redis ansible.builtin.systemd: - name: "{{ serveurs_redis_service }}" + name: "{{ serveur_redis_service }}" state: restarted listen: Redemarrer redis diff --git a/roles/serveurs_redis/tasks/main.yml b/roles/serveur_redis/tasks/main.yml similarity index 64% rename from roles/serveurs_redis/tasks/main.yml rename to roles/serveur_redis/tasks/main.yml index eed0877..e5ee026 100644 --- a/roles/serveurs_redis/tasks/main.yml +++ b/roles/serveur_redis/tasks/main.yml @@ -2,12 +2,12 @@ - name: Exiger le mot de passe Redis (Vault) ansible.builtin.assert: that: - - serveurs_redis_password | length > 0 - fail_msg: "serveurs_redis_password est requis (Redis est expose sur le reseau interne)." + - serveur_redis_password | length > 0 + fail_msg: "serveur_redis_password est requis (Redis est expose sur le reseau interne)." - name: Installer Redis ansible.builtin.apt: - name: "{{ serveurs_redis_paquets }}" + name: "{{ serveur_redis_paquets }}" state: present update_cache: true cache_valid_time: 3600 @@ -15,7 +15,7 @@ - name: Deployer la surcharge de configuration Chezlepro ansible.builtin.template: src: chezlepro.conf.j2 - dest: "{{ serveurs_redis_config }}" + dest: "{{ serveur_redis_config }}" owner: redis group: redis mode: "0640" @@ -24,14 +24,14 @@ - name: Inclure la surcharge depuis redis.conf ansible.builtin.lineinfile: - path: "{{ serveurs_redis_config_principal }}" - line: "include {{ serveurs_redis_config }}" + path: "{{ serveur_redis_config_principal }}" + line: "include {{ serveur_redis_config }}" insertafter: EOF state: present notify: Redemarrer redis - name: Activer et demarrer Redis ansible.builtin.systemd: - name: "{{ serveurs_redis_service }}" + name: "{{ serveur_redis_service }}" enabled: true state: started diff --git a/roles/serveur_redis/templates/chezlepro.conf.j2 b/roles/serveur_redis/templates/chezlepro.conf.j2 new file mode 100644 index 0000000..ce7c073 --- /dev/null +++ b/roles/serveur_redis/templates/chezlepro.conf.j2 @@ -0,0 +1,7 @@ +# Gere par Set-OPS (role serveur_redis). Surcharge /etc/redis/redis.conf. +bind {{ serveur_redis_ecoute | join(' ') }} +port {{ serveur_redis_port }} +protected-mode yes +requirepass {{ serveur_redis_password }} +maxmemory {{ serveur_redis_maxmemory }} +maxmemory-policy {{ serveur_redis_maxmemory_policy }} diff --git a/roles/serveurs_sendmail/README.md b/roles/serveur_sendmail/README.md similarity index 73% rename from roles/serveurs_sendmail/README.md rename to roles/serveur_sendmail/README.md index 2820c1b..03417e7 100644 --- a/roles/serveurs_sendmail/README.md +++ b/roles/serveur_sendmail/README.md @@ -1,4 +1,4 @@ -# serveurs_sendmail +# serveur_sendmail Relais SMTP sortant interne. **Implémenté avec Postfix** (fournit l'interface `sendmail`-compatible `/usr/sbin/sendmail` qu'utilisent les clients). @@ -18,15 +18,15 @@ Relais SMTP sortant interne. **Implémenté avec Postfix** (fournit l'interface ## Variables principales | Variable | Défaut | Rôle | | --- | --- | --- | -| `serveurs_sendmail_domaine` | `chezlepro.internal` | `mydomain` / mailname | -| `serveurs_sendmail_reseaux_autorises` | boucle + `10.1.0.0/16` | `mynetworks` (qui peut relayer) | -| `serveurs_sendmail_smarthost` | `""` | Relais amont (vide = remise directe MX) | -| `serveurs_sendmail_inet_interfaces` | `all` | Interfaces d'écoute | -| `serveurs_sendmail_tls_cert` / `_cle` | snakeoil | Certificat TLS | +| `serveur_sendmail_domaine` | `chezlepro.internal` | `mydomain` / mailname | +| `serveur_sendmail_reseaux_autorises` | boucle + `10.1.0.0/16` | `mynetworks` (qui peut relayer) | +| `serveur_sendmail_smarthost` | `""` | Relais amont (vide = remise directe MX) | +| `serveur_sendmail_inet_interfaces` | `all` | Interfaces d'écoute | +| `serveur_sendmail_tls_cert` / `_cle` | snakeoil | Certificat TLS | ## Smarthost amont ```yaml -serveurs_sendmail_smarthost: "[smtp.exemple.com]:587" +serveur_sendmail_smarthost: "[smtp.exemple.com]:587" ``` (L'authentification SASL vers un smarthost externe, si requise, viendra avec ses identifiants depuis Ansible Vault — hors périmètre du socle actuel.) diff --git a/roles/serveur_sendmail/defaults/main.yml b/roles/serveur_sendmail/defaults/main.yml new file mode 100644 index 0000000..bbfac24 --- /dev/null +++ b/roles/serveur_sendmail/defaults/main.yml @@ -0,0 +1,31 @@ +--- +# Relais SMTP sortant base sur Postfix (fournit l'interface sendmail-compatible). +serveur_sendmail_packages: + - postfix + - ssl-cert + +serveur_sendmail_service_name: "postfix" + +# Identite. +serveur_sendmail_domaine: "chezlepro.internal" +serveur_sendmail_origine: "$mydomain" +serveur_sendmail_nom_hote: "{{ ansible_fqdn | default(ansible_hostname) }}" + +# Reseaux internes autorises a relayer (client_smtp). +serveur_sendmail_reseaux_autorises: + - "127.0.0.0/8" + - "[::1]/128" + - "10.1.0.0/16" + +# Smarthost amont optionnel. Vide => remise directe (MX). +serveur_sendmail_smarthost: "" # ex. "[smtp.exemple.com]:587" + +# Relais uniquement : ne pas heberger de boites pour le domaine. +serveur_sendmail_destinations_locales: "$myhostname, localhost.$mydomain, localhost" + +# Interfaces d'ecoute. +serveur_sendmail_inet_interfaces: "all" + +# TLS (snakeoil par defaut ; bascule vers l'AC interne plus tard). +serveur_sendmail_tls_cert: "/etc/ssl/certs/ssl-cert-snakeoil.pem" +serveur_sendmail_tls_cle: "/etc/ssl/private/ssl-cert-snakeoil.key" diff --git a/roles/serveurs_sendmail/handlers/main.yml b/roles/serveur_sendmail/handlers/main.yml similarity index 84% rename from roles/serveurs_sendmail/handlers/main.yml rename to roles/serveur_sendmail/handlers/main.yml index 65319e8..ac565ce 100644 --- a/roles/serveurs_sendmail/handlers/main.yml +++ b/roles/serveur_sendmail/handlers/main.yml @@ -7,6 +7,6 @@ - name: Recharger postfix ansible.builtin.systemd: - name: "{{ serveurs_sendmail_service_name }}" + name: "{{ serveur_sendmail_service_name }}" state: reloaded listen: Valider et recharger postfix diff --git a/roles/serveurs_sendmail/tasks/main.yml b/roles/serveur_sendmail/tasks/main.yml similarity index 86% rename from roles/serveurs_sendmail/tasks/main.yml rename to roles/serveur_sendmail/tasks/main.yml index 113aa0a..25c6763 100644 --- a/roles/serveurs_sendmail/tasks/main.yml +++ b/roles/serveur_sendmail/tasks/main.yml @@ -7,13 +7,13 @@ value: "{{ item.value }}" loop: - { question: "postfix/main_mailer_type", vtype: "select", value: "Internet Site" } - - { question: "postfix/mailname", vtype: "string", value: "{{ serveurs_sendmail_domaine }}" } + - { question: "postfix/mailname", vtype: "string", value: "{{ serveur_sendmail_domaine }}" } loop_control: label: "{{ item.question }}" - name: Installer Postfix ansible.builtin.apt: - name: "{{ serveurs_sendmail_packages }}" + name: "{{ serveur_sendmail_packages }}" state: present update_cache: true cache_valid_time: 3600 @@ -29,6 +29,6 @@ - name: Activer et demarrer Postfix ansible.builtin.systemd: - name: "{{ serveurs_sendmail_service_name }}" + name: "{{ serveur_sendmail_service_name }}" enabled: true state: started diff --git a/roles/serveurs_sendmail/templates/main.cf.j2 b/roles/serveur_sendmail/templates/main.cf.j2 similarity index 51% rename from roles/serveurs_sendmail/templates/main.cf.j2 rename to roles/serveur_sendmail/templates/main.cf.j2 index dc3a2c2..7c4e26b 100644 --- a/roles/serveurs_sendmail/templates/main.cf.j2 +++ b/roles/serveur_sendmail/templates/main.cf.j2 @@ -1,17 +1,17 @@ -# Gere par Set-OPS (role serveurs_sendmail, base Postfix). Ne pas editer a la main. +# Gere par Set-OPS (role serveur_sendmail, base Postfix). Ne pas editer a la main. smtpd_banner = $myhostname ESMTP biff = no append_dot_mydomain = no readme_directory = no compatibility_level = 3.6 -myhostname = {{ serveurs_sendmail_nom_hote }} -mydomain = {{ serveurs_sendmail_domaine }} -myorigin = {{ serveurs_sendmail_origine }} -mydestination = {{ serveurs_sendmail_destinations_locales }} -mynetworks = {{ serveurs_sendmail_reseaux_autorises | join(', ') }} -relayhost = {{ serveurs_sendmail_smarthost }} -inet_interfaces = {{ serveurs_sendmail_inet_interfaces }} +myhostname = {{ serveur_sendmail_nom_hote }} +mydomain = {{ serveur_sendmail_domaine }} +myorigin = {{ serveur_sendmail_origine }} +mydestination = {{ serveur_sendmail_destinations_locales }} +mynetworks = {{ serveur_sendmail_reseaux_autorises | join(', ') }} +relayhost = {{ serveur_sendmail_smarthost }} +inet_interfaces = {{ serveur_sendmail_inet_interfaces }} inet_protocols = all alias_maps = hash:/etc/aliases @@ -23,8 +23,8 @@ recipient_delimiter = + smtpd_relay_restrictions = permit_mynetworks, reject_unauth_destination # TLS opportuniste. -smtpd_tls_cert_file = {{ serveurs_sendmail_tls_cert }} -smtpd_tls_key_file = {{ serveurs_sendmail_tls_cle }} +smtpd_tls_cert_file = {{ serveur_sendmail_tls_cert }} +smtpd_tls_key_file = {{ serveur_sendmail_tls_cle }} smtpd_tls_security_level = may smtp_tls_security_level = may smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache diff --git a/roles/serveurs_step_ca/README.md b/roles/serveur_step_ca/README.md similarity index 62% rename from roles/serveurs_step_ca/README.md rename to roles/serveur_step_ca/README.md index 681de84..654db24 100644 --- a/roles/serveurs_step_ca/README.md +++ b/roles/serveur_step_ca/README.md @@ -1,7 +1,7 @@ -# serveurs_step_ca +# serveur_step_ca Autorité de certification interne **Smallstep step-ca** avec provisioner **ACME**, -pour émettre les certificats internes de Chezlepro (`clients_pki` est le client ACME). +pour émettre les certificats internes de Chezlepro (`client_pki` est le client ACME). ## Rôle - Ajoute le **dépôt apt officiel Smallstep** (clé + source deb822) et installe `step-ca` + `step-cli`. @@ -14,28 +14,28 @@ pour émettre les certificats internes de Chezlepro (`clients_pki` est le client Obligatoires dès l'installation : ```yaml -serveurs_step_ca_password: "{{ vault_step_ca_password }}" -serveurs_step_ca_provisioner_password: "{{ vault_step_ca_provisioner_password }}" +serveur_step_ca_password: "{{ vault_step_ca_password }}" +serveur_step_ca_provisioner_password: "{{ vault_step_ca_provisioner_password }}" ``` -À placer dans `inventories/production/group_vars/serveurs_step_ca/vault.yml` (chiffré), -les variables en clair référençant ces secrets dans `.../serveurs_step_ca/main.yml`. +À placer dans `inventories/production/group_vars/serveur_step_ca/vault.yml` (chiffré), +les variables en clair référençant ces secrets dans `.../serveur_step_ca/main.yml`. ## Variables principales | Variable | Défaut | Rôle | | --- | --- | --- | -| `serveurs_step_ca_nom` | `Chezlepro Internal CA` | Nom de l'AC | -| `serveurs_step_ca_dns` | FQDN + IP | SAN/DNS du certificat de l'AC | -| `serveurs_step_ca_adresse` | `:8443` | Adresse d'écoute | -| `serveurs_step_ca_provisioner` | `admin@chezlepro.internal` | Provisioner JWK admin | -| `serveurs_step_ca_acme` | `true` | Ajoute un provisioner ACME | +| `serveur_step_ca_nom` | `Chezlepro Internal CA` | Nom de l'AC | +| `serveur_step_ca_dns` | FQDN + IP | SAN/DNS du certificat de l'AC | +| `serveur_step_ca_adresse` | `:8443` | Adresse d'écoute | +| `serveur_step_ca_provisioner` | `admin@chezlepro.internal` | Provisioner JWK admin | +| `serveur_step_ca_acme` | `true` | Ajoute un provisioner ACME | ## Notes - La ligne `step ca init` utilise les drapeaux documentés par Smallstep ; selon la version de `step-cli` installée, un ajustement mineur peut être nécessaire. L'init ne s'exécute qu'une fois (présence de `config/ca.json`). - L'unité systemd provient de la doc de production Smallstep (sandboxing systemd). -- Émission/renouvellement côté clients : voir le futur rôle `clients_pki` (ACME). +- Émission/renouvellement côté clients : voir le futur rôle `client_pki` (ACME). ## Hors périmètre - Sauvegarde/HA de l'AC, RA (registration authority), rotation des clés racine. diff --git a/roles/serveur_step_ca/defaults/main.yml b/roles/serveur_step_ca/defaults/main.yml new file mode 100644 index 0000000..675b65a --- /dev/null +++ b/roles/serveur_step_ca/defaults/main.yml @@ -0,0 +1,27 @@ +--- +# Autorite de certification interne (Smallstep step-ca) + ACME. +serveur_step_ca_paquets: + - step-cli + - step-ca + +# Depot apt officiel Smallstep. +serveur_step_ca_depot_cle_url: "https://packages.smallstep.com/keys/apt/repo-signing-key.gpg" +serveur_step_ca_depot_cle_fichier: "/etc/apt/keyrings/smallstep.asc" +serveur_step_ca_depot_uri: "https://packages.smallstep.com/stable/debian" +serveur_step_ca_depot_suite: "debs" + +# Service. +serveur_step_ca_utilisateur: "step" +serveur_step_ca_steppath: "/etc/step-ca" +serveur_step_ca_service: "step-ca" + +# Identite de l'AC. +serveur_step_ca_nom: "Chezlepro Internal CA" +serveur_step_ca_dns: "{{ ansible_fqdn | default(ansible_hostname) }},{{ ansible_host | default('127.0.0.1') }}" +serveur_step_ca_adresse: ":8443" +serveur_step_ca_provisioner: "admin@chezlepro.internal" +serveur_step_ca_acme: true + +# Secrets (Ansible Vault) — obligatoires pour l'initialisation. +serveur_step_ca_password: "" # {{ vault_step_ca_password }} +serveur_step_ca_provisioner_password: "" # {{ vault_step_ca_provisioner_password }} diff --git a/roles/serveurs_step_ca/handlers/main.yml b/roles/serveur_step_ca/handlers/main.yml similarity index 75% rename from roles/serveurs_step_ca/handlers/main.yml rename to roles/serveur_step_ca/handlers/main.yml index 2dbd286..71d739f 100644 --- a/roles/serveurs_step_ca/handlers/main.yml +++ b/roles/serveur_step_ca/handlers/main.yml @@ -1,7 +1,7 @@ --- - name: Redemarrer step-ca ansible.builtin.systemd: - name: "{{ serveurs_step_ca_service }}" + name: "{{ serveur_step_ca_service }}" state: restarted daemon_reload: true listen: Redemarrer step-ca diff --git a/roles/serveurs_step_ca/tasks/main.yml b/roles/serveur_step_ca/tasks/main.yml similarity index 52% rename from roles/serveurs_step_ca/tasks/main.yml rename to roles/serveur_step_ca/tasks/main.yml index f57f797..22cb249 100644 --- a/roles/serveurs_step_ca/tasks/main.yml +++ b/roles/serveur_step_ca/tasks/main.yml @@ -2,10 +2,10 @@ - name: Exiger les secrets de l'AC (Vault) ansible.builtin.assert: that: - - serveurs_step_ca_password | length > 0 - - serveurs_step_ca_provisioner_password | length > 0 + - serveur_step_ca_password | length > 0 + - serveur_step_ca_provisioner_password | length > 0 fail_msg: >- - serveurs_step_ca_password et serveurs_step_ca_provisioner_password + serveur_step_ca_password et serveur_step_ca_provisioner_password sont requis (a fournir via Ansible Vault). - name: Assurer le repertoire des trousseaux apt @@ -18,8 +18,8 @@ - name: Telecharger la cle de signature Smallstep ansible.builtin.get_url: - url: "{{ serveurs_step_ca_depot_cle_url }}" - dest: "{{ serveurs_step_ca_depot_cle_fichier }}" + url: "{{ serveur_step_ca_depot_cle_url }}" + dest: "{{ serveur_step_ca_depot_cle_fichier }}" owner: root group: root mode: "0644" @@ -34,42 +34,42 @@ - name: Installer step-ca et step-cli ansible.builtin.apt: - name: "{{ serveurs_step_ca_paquets }}" + name: "{{ serveur_step_ca_paquets }}" state: present update_cache: true - name: Creer l'utilisateur systeme step ansible.builtin.user: - name: "{{ serveurs_step_ca_utilisateur }}" + name: "{{ serveur_step_ca_utilisateur }}" system: true - home: "{{ serveurs_step_ca_steppath }}" + home: "{{ serveur_step_ca_steppath }}" create_home: false shell: /usr/sbin/nologin - name: Creer le repertoire STEPPATH ansible.builtin.file: - path: "{{ serveurs_step_ca_steppath }}" + path: "{{ serveur_step_ca_steppath }}" state: directory - owner: "{{ serveurs_step_ca_utilisateur }}" - group: "{{ serveurs_step_ca_utilisateur }}" + owner: "{{ serveur_step_ca_utilisateur }}" + group: "{{ serveur_step_ca_utilisateur }}" mode: "0700" - name: Deployer le mot de passe de l'AC ansible.builtin.copy: - content: "{{ serveurs_step_ca_password }}" - dest: "{{ serveurs_step_ca_steppath }}/password.txt" - owner: "{{ serveurs_step_ca_utilisateur }}" - group: "{{ serveurs_step_ca_utilisateur }}" + content: "{{ serveur_step_ca_password }}" + dest: "{{ serveur_step_ca_steppath }}/password.txt" + owner: "{{ serveur_step_ca_utilisateur }}" + group: "{{ serveur_step_ca_utilisateur }}" mode: "0600" no_log: true notify: Redemarrer step-ca - name: Deployer le mot de passe du provisioner ansible.builtin.copy: - content: "{{ serveurs_step_ca_provisioner_password }}" - dest: "{{ serveurs_step_ca_steppath }}/provisioner_password.txt" - owner: "{{ serveurs_step_ca_utilisateur }}" - group: "{{ serveurs_step_ca_utilisateur }}" + content: "{{ serveur_step_ca_provisioner_password }}" + dest: "{{ serveur_step_ca_steppath }}/provisioner_password.txt" + owner: "{{ serveur_step_ca_utilisateur }}" + group: "{{ serveur_step_ca_utilisateur }}" mode: "0600" no_log: true @@ -78,18 +78,18 @@ cmd: >- step ca init --deployment-type standalone - --name "{{ serveurs_step_ca_nom }}" - --dns "{{ serveurs_step_ca_dns }}" - --address "{{ serveurs_step_ca_adresse }}" - --provisioner "{{ serveurs_step_ca_provisioner }}" - --password-file {{ serveurs_step_ca_steppath }}/password.txt - --provisioner-password-file {{ serveurs_step_ca_steppath }}/provisioner_password.txt - {{ '--acme' if serveurs_step_ca_acme | bool else '' }} - creates: "{{ serveurs_step_ca_steppath }}/config/ca.json" + --name "{{ serveur_step_ca_nom }}" + --dns "{{ serveur_step_ca_dns }}" + --address "{{ serveur_step_ca_adresse }}" + --provisioner "{{ serveur_step_ca_provisioner }}" + --password-file {{ serveur_step_ca_steppath }}/password.txt + --provisioner-password-file {{ serveur_step_ca_steppath }}/provisioner_password.txt + {{ '--acme' if serveur_step_ca_acme | bool else '' }} + creates: "{{ serveur_step_ca_steppath }}/config/ca.json" become: true - become_user: "{{ serveurs_step_ca_utilisateur }}" + become_user: "{{ serveur_step_ca_utilisateur }}" environment: - STEPPATH: "{{ serveurs_step_ca_steppath }}" + STEPPATH: "{{ serveur_step_ca_steppath }}" - name: Deployer l'unite systemd step-ca ansible.builtin.template: @@ -102,7 +102,7 @@ - name: Activer et demarrer step-ca ansible.builtin.systemd: - name: "{{ serveurs_step_ca_service }}" + name: "{{ serveur_step_ca_service }}" enabled: true state: started daemon_reload: true diff --git a/roles/serveur_step_ca/templates/smallstep.sources.j2 b/roles/serveur_step_ca/templates/smallstep.sources.j2 new file mode 100644 index 0000000..8b7faa5 --- /dev/null +++ b/roles/serveur_step_ca/templates/smallstep.sources.j2 @@ -0,0 +1,5 @@ +Types: deb +URIs: {{ serveur_step_ca_depot_uri }} +Suites: {{ serveur_step_ca_depot_suite }} +Components: main +Signed-By: {{ serveur_step_ca_depot_cle_fichier }} diff --git a/roles/serveurs_step_ca/templates/step-ca.service.j2 b/roles/serveur_step_ca/templates/step-ca.service.j2 similarity index 74% rename from roles/serveurs_step_ca/templates/step-ca.service.j2 rename to roles/serveur_step_ca/templates/step-ca.service.j2 index 50307eb..15a950a 100644 --- a/roles/serveurs_step_ca/templates/step-ca.service.j2 +++ b/roles/serveur_step_ca/templates/step-ca.service.j2 @@ -6,15 +6,15 @@ After=network-online.target Wants=network-online.target StartLimitIntervalSec=30 StartLimitBurst=3 -ConditionFileNotEmpty={{ serveurs_step_ca_steppath }}/config/ca.json -ConditionFileNotEmpty={{ serveurs_step_ca_steppath }}/password.txt +ConditionFileNotEmpty={{ serveur_step_ca_steppath }}/config/ca.json +ConditionFileNotEmpty={{ serveur_step_ca_steppath }}/password.txt [Service] Type=simple -User={{ serveurs_step_ca_utilisateur }} -Group={{ serveurs_step_ca_utilisateur }} -Environment=STEPPATH={{ serveurs_step_ca_steppath }} -WorkingDirectory={{ serveurs_step_ca_steppath }} +User={{ serveur_step_ca_utilisateur }} +Group={{ serveur_step_ca_utilisateur }} +Environment=STEPPATH={{ serveur_step_ca_steppath }} +WorkingDirectory={{ serveur_step_ca_steppath }} ExecStart=/usr/bin/step-ca config/ca.json --password-file password.txt ExecReload=/bin/kill --signal HUP $MAINPID Restart=on-failure @@ -46,7 +46,7 @@ RestrictRealtime=true SystemCallFilter=@system-service SystemCallArchitectures=native MemoryDenyWriteExecute=true -ReadWriteDirectories={{ serveurs_step_ca_steppath }}/db +ReadWriteDirectories={{ serveur_step_ca_steppath }}/db [Install] WantedBy=multi-user.target diff --git a/roles/serveurs_forgejo/defaults/main.yml b/roles/serveurs_forgejo/defaults/main.yml deleted file mode 100644 index 79cf4b9..0000000 --- a/roles/serveurs_forgejo/defaults/main.yml +++ /dev/null @@ -1,30 +0,0 @@ ---- -# Version Forgejo : verifier/ajuster sur https://forgejo.org/download/ -serveurs_forgejo_version: "10.0.0" -serveurs_forgejo_url: >- - https://codeberg.org/forgejo/forgejo/releases/download/v{{ serveurs_forgejo_version }}/forgejo-{{ serveurs_forgejo_version }}-linux-amd64 - -serveurs_forgejo_binaire: "/usr/local/bin/forgejo" -serveurs_forgejo_utilisateur: "git" -serveurs_forgejo_data: "/var/lib/forgejo" -serveurs_forgejo_config_dir: "/etc/forgejo" -serveurs_forgejo_config: "/etc/forgejo/app.ini" -serveurs_forgejo_service: "forgejo" - -# Publication (derriere serveurs_nginx, TLS a l'edge). -serveurs_forgejo_hostname: "forge.chezlepro.internal" -serveurs_forgejo_http_port: 3000 - -# Base de donnees : resolue depuis le registre par le groupe consommateur. -serveurs_forgejo_groupe: "serveurs_forgejo" -serveurs_forgejo_db_host: "10.1.13.11" # data-01 - -# Relais courriel. -serveurs_forgejo_smtp: "infra-mail-01.chezlepro.internal" - -# Secrets OBLIGATOIRES (Ansible Vault). -serveurs_forgejo_secret_key: "" # {{ vault_forgejo_secret_key }} -serveurs_forgejo_internal_token: "" # {{ vault_forgejo_internal_token }} -serveurs_forgejo_admin_user: "forgejo-admin" -serveurs_forgejo_admin_email: "admin@chezlepro.internal" -serveurs_forgejo_admin_password: "" # {{ vault_forgejo_admin }} diff --git a/roles/serveurs_forgejo/templates/app.ini.j2 b/roles/serveurs_forgejo/templates/app.ini.j2 deleted file mode 100644 index ff267bf..0000000 --- a/roles/serveurs_forgejo/templates/app.ini.j2 +++ /dev/null @@ -1,34 +0,0 @@ -; Gere par Set-OPS (role serveurs_forgejo). Ne pas editer a la main. -APP_NAME = Forgejo Chezlepro -RUN_USER = {{ serveurs_forgejo_utilisateur }} -RUN_MODE = prod -WORK_PATH = {{ serveurs_forgejo_data }} - -[server] -DOMAIN = {{ serveurs_forgejo_hostname }} -ROOT_URL = https://{{ serveurs_forgejo_hostname }}/ -HTTP_ADDR = 127.0.0.1 -HTTP_PORT = {{ serveurs_forgejo_http_port }} -SSH_DOMAIN = {{ serveurs_forgejo_hostname }} - -[database] -DB_TYPE = postgres -HOST = {{ serveurs_forgejo_db_host }}:{{ serveurs_forgejo_db_port | default(5432) }} -NAME = {{ serveurs_forgejo_entree.base }} -USER = {{ serveurs_forgejo_entree.proprietaire }} -PASSWD = {{ serveurs_forgejo_db_password }} - -[security] -INSTALL_LOCK = true -SECRET_KEY = {{ serveurs_forgejo_secret_key }} -INTERNAL_TOKEN = {{ serveurs_forgejo_internal_token }} - -[service] -DISABLE_REGISTRATION = true - -[mailer] -ENABLED = true -PROTOCOL = smtp -SMTP_ADDR = {{ serveurs_forgejo_smtp }} -SMTP_PORT = 25 -FROM = forge@chezlepro.internal diff --git a/roles/serveurs_forgejo/templates/forgejo.service.j2 b/roles/serveurs_forgejo/templates/forgejo.service.j2 deleted file mode 100644 index d54ddbd..0000000 --- a/roles/serveurs_forgejo/templates/forgejo.service.j2 +++ /dev/null @@ -1,20 +0,0 @@ -[Unit] -Description=Forgejo (forge Git) -Documentation=https://forgejo.org/docs/ -After=network-online.target -Wants=network-online.target - -[Service] -Type=simple -User={{ serveurs_forgejo_utilisateur }} -Group={{ serveurs_forgejo_utilisateur }} -WorkingDirectory={{ serveurs_forgejo_data }} -ExecStart={{ serveurs_forgejo_binaire }} web --config {{ serveurs_forgejo_config }} -Restart=always -RestartSec=5 -Environment=USER={{ serveurs_forgejo_utilisateur }} -Environment=HOME=/home/{{ serveurs_forgejo_utilisateur }} -Environment=GITEA_WORK_DIR={{ serveurs_forgejo_data }} - -[Install] -WantedBy=multi-user.target diff --git a/roles/serveurs_grafana/defaults/main.yml b/roles/serveurs_grafana/defaults/main.yml deleted file mode 100644 index a95ce15..0000000 --- a/roles/serveurs_grafana/defaults/main.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -serveurs_grafana_paquets: - - grafana - -serveurs_grafana_service: "grafana-server" -serveurs_grafana_port: 3000 - -# Publication (derriere serveurs_nginx, TLS termine a l'edge). -serveurs_grafana_hostname: "grafana.chezlepro.internal" -serveurs_grafana_root_url: "https://{{ serveurs_grafana_hostname }}/" - -# Datasources (Prometheus + Loki, co-localises sur obs-01). -serveurs_grafana_prometheus_url: "http://localhost:9090" -serveurs_grafana_loki_url: "http://localhost:3100" - -# Secret OBLIGATOIRE (Ansible Vault). -serveurs_grafana_admin_password: "" # {{ vault_grafana_admin }} - -# Depot apt officiel Grafana (partage avec serveurs_loki). -serveurs_grafana_depot_cle_url: "https://apt.grafana.com/gpg-full.key" -serveurs_grafana_depot_cle_fichier: "/etc/apt/keyrings/grafana.asc" -serveurs_grafana_depot_source: "deb [signed-by=/etc/apt/keyrings/grafana.asc] https://apt.grafana.com stable main" diff --git a/roles/serveurs_grafana/templates/chezlepro.conf.j2 b/roles/serveurs_grafana/templates/chezlepro.conf.j2 deleted file mode 100644 index 6f26c8b..0000000 --- a/roles/serveurs_grafana/templates/chezlepro.conf.j2 +++ /dev/null @@ -1,5 +0,0 @@ -[Service] -Environment=GF_SERVER_DOMAIN={{ serveurs_grafana_hostname }} -Environment=GF_SERVER_ROOT_URL={{ serveurs_grafana_root_url }} -Environment=GF_SECURITY_ADMIN_PASSWORD={{ serveurs_grafana_admin_password }} -Environment=GF_USERS_ALLOW_SIGN_UP=false diff --git a/roles/serveurs_grafana/templates/datasources.yaml.j2 b/roles/serveurs_grafana/templates/datasources.yaml.j2 deleted file mode 100644 index 7761c3f..0000000 --- a/roles/serveurs_grafana/templates/datasources.yaml.j2 +++ /dev/null @@ -1,13 +0,0 @@ -# Gere par Set-OPS (role serveurs_grafana). Ne pas editer a la main. -apiVersion: 1 - -datasources: - - name: Prometheus - type: prometheus - access: proxy - url: {{ serveurs_grafana_prometheus_url }} - isDefault: true - - name: Loki - type: loki - access: proxy - url: {{ serveurs_grafana_loki_url }} diff --git a/roles/serveurs_icinga/templates/config.yml.j2 b/roles/serveurs_icinga/templates/config.yml.j2 deleted file mode 100644 index 874256f..0000000 --- a/roles/serveurs_icinga/templates/config.yml.j2 +++ /dev/null @@ -1,11 +0,0 @@ -# Gere par Set-OPS (role serveurs_icinga). Ne pas editer a la main. -database: - type: pgsql - host: {{ serveurs_icinga_db_host }} - database: {{ serveurs_icinga_entree.base }} - user: {{ serveurs_icinga_entree.proprietaire }} - password: {{ serveurs_icinga_db_password }} - -redis: - host: {{ serveurs_icinga_redis_host }} - port: {{ serveurs_icinga_redis_port }} diff --git a/roles/serveurs_keycloak/defaults/main.yml b/roles/serveurs_keycloak/defaults/main.yml deleted file mode 100644 index 5476b28..0000000 --- a/roles/serveurs_keycloak/defaults/main.yml +++ /dev/null @@ -1,21 +0,0 @@ ---- -# Distribution Keycloak (Quarkus). Verifier/ajuster la version sur keycloak.org/downloads. -serveurs_keycloak_version: "26.0.7" -serveurs_keycloak_url: "https://github.com/keycloak/keycloak/releases/download/{{ serveurs_keycloak_version }}/keycloak-{{ serveurs_keycloak_version }}.tar.gz" -serveurs_keycloak_java_paquet: "default-jre-headless" - -serveurs_keycloak_home: "/opt/keycloak" -serveurs_keycloak_utilisateur: "keycloak" -serveurs_keycloak_service: "keycloak" - -# Publication (derriere serveurs_nginx, TLS termine a l'edge). -serveurs_keycloak_hostname: "keycloak.chezlepro.internal" - -# Base de donnees : resolue depuis le registre par le groupe consommateur. -serveurs_keycloak_groupe: "serveurs_keycloak" -# IP interne du serveur PostgreSQL (data-01, cf. nomenclature). -serveurs_keycloak_db_host: "10.1.13.11" - -# Secrets (Ansible Vault) — obligatoires. -serveurs_keycloak_admin_user: "admin" -serveurs_keycloak_admin_password: "" # {{ vault_keycloak_admin }} diff --git a/roles/serveurs_keycloak/templates/keycloak.conf.j2 b/roles/serveurs_keycloak/templates/keycloak.conf.j2 deleted file mode 100644 index 5a9eb9f..0000000 --- a/roles/serveurs_keycloak/templates/keycloak.conf.j2 +++ /dev/null @@ -1,10 +0,0 @@ -# Gere par Set-OPS (role serveurs_keycloak). Ne pas editer a la main. -db=postgres -db-url-host={{ serveurs_keycloak_db_host }} -db-url-database={{ serveurs_keycloak_entree.base }} -db-username={{ serveurs_keycloak_entree.proprietaire }} - -# Derriere serveurs_nginx (TLS termine a l'edge). -hostname={{ serveurs_keycloak_hostname }} -proxy-headers=xforwarded -http-enabled=true diff --git a/roles/serveurs_keycloak/templates/keycloak.env.j2 b/roles/serveurs_keycloak/templates/keycloak.env.j2 deleted file mode 100644 index bc19d34..0000000 --- a/roles/serveurs_keycloak/templates/keycloak.env.j2 +++ /dev/null @@ -1,4 +0,0 @@ -# Gere par Set-OPS (role serveurs_keycloak). Secrets — ne pas editer a la main. -KC_DB_PASSWORD={{ serveurs_keycloak_db_password }} -KC_BOOTSTRAP_ADMIN_USERNAME={{ serveurs_keycloak_admin_user }} -KC_BOOTSTRAP_ADMIN_PASSWORD={{ serveurs_keycloak_admin_password }} diff --git a/roles/serveurs_loki/defaults/main.yml b/roles/serveurs_loki/defaults/main.yml deleted file mode 100644 index b9bc378..0000000 --- a/roles/serveurs_loki/defaults/main.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -serveurs_loki_paquets: - - loki - -serveurs_loki_service: "loki" -serveurs_loki_config: "/etc/loki/config.yml" -serveurs_loki_port: 3100 -serveurs_loki_chemin: "/var/lib/loki" -serveurs_loki_retention: "744h" # 31 jours - -# Depot apt officiel Grafana (partage avec serveurs_grafana). -serveurs_loki_depot_cle_url: "https://apt.grafana.com/gpg-full.key" -serveurs_loki_depot_cle_fichier: "/etc/apt/keyrings/grafana.asc" -serveurs_loki_depot_source: "deb [signed-by=/etc/apt/keyrings/grafana.asc] https://apt.grafana.com stable main" diff --git a/roles/serveurs_nginx/README.md b/roles/serveurs_nginx/README.md deleted file mode 100644 index 100cd83..0000000 --- a/roles/serveurs_nginx/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# serveurs_nginx - -Installe et configure nginx comme **edge** interne : reverse proxy et terminaison TLS. - -## Rôle -- Installe `nginx` et `ssl-cert` (certificat auto-signé). -- Durcissement de base via `conf.d/99-chezlepro.conf` (`server_tokens off`, TLS 1.2/1.3, taille de corps). -- Publie des sites de reverse proxy déclarés dans `serveurs_nginx_sites` (vide par défaut). -- **Valide la configuration (`nginx -t`) avant de recharger** (handler `Valider et recharger nginx`). - -## TLS -- Par défaut, certificat auto-signé Debian (`snakeoil`) — l'edge répond en HTTPS dès l'installation. -- `serveurs_nginx_certificat` / `serveurs_nginx_cle` (ou par site) permettent de basculer vers les certificats de l'AC interne / ACME quand `serveurs_step_ca` existera. - -## Variables principales -| Variable | Défaut | Rôle | -| --- | --- | --- | -| `serveurs_nginx_certificat` / `_cle` | snakeoil | Certificat TLS par défaut | -| `serveurs_nginx_ssl_protocols` | `TLSv1.2 TLSv1.3` | Protocoles TLS | -| `serveurs_nginx_server_tokens` | `off` | Masque la version | -| `serveurs_nginx_taille_max_corps` | `16m` | `client_max_body_size` | -| `serveurs_nginx_redirection_http` | `true` | Redirige 80 → 443 | -| `serveurs_nginx_desactiver_defaut` | `false` | Retire le site Debian par défaut | -| `serveurs_nginx_sites` | `[]` | Sites reverse proxy | - -## Déclarer un site -```yaml -serveurs_nginx_sites: - - nom: forge - domaine: forge.chezlepro.internal - amont: "http://10.1.15.11:3000" - # certificat / cle optionnels (sinon snakeoil) -``` - -## Hors périmètre -- WAF (ModSecurity) — lift externe, à traiter dans une phase dédiée. -- Émission automatique des certificats (dépend de `serveurs_step_ca`). diff --git a/roles/serveurs_nginx/templates/99-chezlepro.conf.j2 b/roles/serveurs_nginx/templates/99-chezlepro.conf.j2 deleted file mode 100644 index 15cb457..0000000 --- a/roles/serveurs_nginx/templates/99-chezlepro.conf.j2 +++ /dev/null @@ -1,4 +0,0 @@ -# Gere par Set-OPS (role serveurs_nginx). Ne pas editer a la main. -server_tokens {{ serveurs_nginx_server_tokens }}; -ssl_protocols {{ serveurs_nginx_ssl_protocols }}; -client_max_body_size {{ serveurs_nginx_taille_max_corps }}; diff --git a/roles/serveurs_openldap/defaults/main.yml b/roles/serveurs_openldap/defaults/main.yml deleted file mode 100644 index 80ac4ab..0000000 --- a/roles/serveurs_openldap/defaults/main.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -serveurs_openldap_paquets: - - slapd - - ldap-utils - - python3-ldap # requis par community.general.ldap_entry sur la cible - -serveurs_openldap_service: "slapd" - -# Identite de l'annuaire. -serveurs_openldap_domaine: "chezlepro.internal" -serveurs_openldap_organisation: "Chezlepro Inc" -# Base DN derivee du domaine : chezlepro.internal -> dc=chezlepro,dc=internal -serveurs_openldap_base_dn: "dc={{ serveurs_openldap_domaine.split('.') | join(',dc=') }}" -serveurs_openldap_admin_dn: "cn=admin,{{ serveurs_openldap_base_dn }}" - -# Secret OBLIGATOIRE (Ansible Vault). -serveurs_openldap_admin_password: "" # {{ vault_openldap_admin }} - -# Unites organisationnelles de base. -serveurs_openldap_ou: - - people - - groups diff --git a/roles/serveurs_postgresql/templates/99-chezlepro.conf.j2 b/roles/serveurs_postgresql/templates/99-chezlepro.conf.j2 deleted file mode 100644 index dcf6609..0000000 --- a/roles/serveurs_postgresql/templates/99-chezlepro.conf.j2 +++ /dev/null @@ -1,7 +0,0 @@ -# Gere par Set-OPS (role serveurs_postgresql). Ne pas editer a la main. -listen_addresses = '{{ serveurs_postgresql_ecoute | join(",") }}' -port = {{ serveurs_postgresql_port }} -password_encryption = '{{ serveurs_postgresql_methode_auth }}' -{% for cle, valeur in serveurs_postgresql_parametres.items() %} -{{ cle }} = '{{ valeur }}' -{% endfor %} diff --git a/roles/serveurs_postgresql/templates/pg_hba.conf.j2 b/roles/serveurs_postgresql/templates/pg_hba.conf.j2 deleted file mode 100644 index dea8c64..0000000 --- a/roles/serveurs_postgresql/templates/pg_hba.conf.j2 +++ /dev/null @@ -1,11 +0,0 @@ -# Gere par Set-OPS (role serveurs_postgresql). Ne pas editer a la main. -# Acces administrateur local par socket (requis par Ansible/postgres). -local all postgres peer -local all all peer -# Boucle locale. -host all all 127.0.0.1/32 {{ serveurs_postgresql_methode_auth }} -host all all ::1/128 {{ serveurs_postgresql_methode_auth }} -# Reseaux internes autorises (clients applicatifs). -{% for reseau in serveurs_postgresql_reseaux_autorises %} -host all all {{ reseau }} {{ serveurs_postgresql_methode_auth }} -{% endfor %} diff --git a/roles/serveurs_powerdns/defaults/main.yml b/roles/serveurs_powerdns/defaults/main.yml deleted file mode 100644 index 7f17a55..0000000 --- a/roles/serveurs_powerdns/defaults/main.yml +++ /dev/null @@ -1,33 +0,0 @@ ---- -serveurs_powerdns_packages: - - pdns-server - - pdns-backend-bind - - bind9-utils - - dnsutils - -serveurs_powerdns_service_name: "pdns" -serveurs_powerdns_zone_directory: "/etc/powerdns/zones" -serveurs_powerdns_bind_config: "/etc/powerdns/bindbackend.conf" -serveurs_powerdns_zone: "chezlepro.internal" -serveurs_powerdns_nameserver: "ns1" -serveurs_powerdns_contact: "hostmaster.chezlepro.internal" -serveurs_powerdns_ttl: 3600 -serveurs_powerdns_serial: 2026062201 -serveurs_powerdns_soa_refresh: 3600 -serveurs_powerdns_soa_retry: 900 -serveurs_powerdns_soa_expire: 1209600 -serveurs_powerdns_soa_minimum: 3600 -serveurs_powerdns_listen_addresses: - - "0.0.0.0" - - "::" -serveurs_powerdns_allow_axfr_ips: [] - -# Enregistrements additionnels geres explicitement. -serveurs_powerdns_records: - - name: "dns" - type: "CNAME" - value: "ns1.{{ serveurs_powerdns_zone }}." - -# Groupes dont les hotes actifs avec ansible_host seront ajoutes a la zone. -serveurs_powerdns_inventory_groups: - - hotes_actifs diff --git a/roles/serveurs_powerdns/templates/bindbackend.conf.j2 b/roles/serveurs_powerdns/templates/bindbackend.conf.j2 deleted file mode 100644 index 3e3b573..0000000 --- a/roles/serveurs_powerdns/templates/bindbackend.conf.j2 +++ /dev/null @@ -1,4 +0,0 @@ -zone "{{ serveurs_powerdns_zone }}" { - type master; - file "{{ serveurs_powerdns_zone_directory }}/{{ serveurs_powerdns_zone }}.zone"; -}; diff --git a/roles/serveurs_powerdns/templates/chezlepro-bind.conf.j2 b/roles/serveurs_powerdns/templates/chezlepro-bind.conf.j2 deleted file mode 100644 index 5fe1698..0000000 --- a/roles/serveurs_powerdns/templates/chezlepro-bind.conf.j2 +++ /dev/null @@ -1,9 +0,0 @@ -launch+=bind -bind-config={{ serveurs_powerdns_bind_config }} -local-address={{ serveurs_powerdns_listen_addresses | join(',') }} -{% if serveurs_powerdns_allow_axfr_ips | length > 0 %} -allow-axfr-ips={{ serveurs_powerdns_allow_axfr_ips | join(',') }} -disable-axfr=no -{% else %} -disable-axfr=yes -{% endif %} diff --git a/roles/serveurs_powerdns/templates/zone.db.j2 b/roles/serveurs_powerdns/templates/zone.db.j2 deleted file mode 100644 index acda006..0000000 --- a/roles/serveurs_powerdns/templates/zone.db.j2 +++ /dev/null @@ -1,26 +0,0 @@ -$ORIGIN {{ serveurs_powerdns_zone }}. -$TTL {{ serveurs_powerdns_ttl }} -@ IN SOA {{ serveurs_powerdns_nameserver }}.{{ serveurs_powerdns_zone }}. {{ serveurs_powerdns_contact }}. ( - {{ serveurs_powerdns_serial }} - {{ serveurs_powerdns_soa_refresh }} - {{ serveurs_powerdns_soa_retry }} - {{ serveurs_powerdns_soa_expire }} - {{ serveurs_powerdns_soa_minimum }} -) - -@ IN NS {{ serveurs_powerdns_nameserver }}.{{ serveurs_powerdns_zone }}. -{{ serveurs_powerdns_nameserver }} IN A {{ hostvars[groups['serveurs_powerdns'][0]].ansible_host | default('127.0.0.1') }} - -{% for record in serveurs_powerdns_records %} -{{ record.name }} IN {{ record.type }} {{ record.value }} -{% endfor %} - -{% set emitted = [] %} -{% for group_name in serveurs_powerdns_inventory_groups %} -{% for host_name in groups.get(group_name, []) | sort %} -{% if hostvars[host_name].ansible_host is defined and host_name not in emitted %} -{{ host_name }} IN A {{ hostvars[host_name].ansible_host }} -{% set _ = emitted.append(host_name) %} -{% endif %} -{% endfor %} -{% endfor %} diff --git a/roles/serveurs_prometheus/defaults/main.yml b/roles/serveurs_prometheus/defaults/main.yml deleted file mode 100644 index d5a455a..0000000 --- a/roles/serveurs_prometheus/defaults/main.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -serveurs_prometheus_paquets: - - prometheus - -serveurs_prometheus_service: "prometheus" -serveurs_prometheus_config: "/etc/prometheus/prometheus.yml" - -serveurs_prometheus_intervalle: "15s" -serveurs_prometheus_retention: "15d" - -# Cibles node_exporter derivees de l'inventaire (hotes actifs de ce groupe). -serveurs_prometheus_groupe_metriques: "clients_metriques" -serveurs_prometheus_port_node: 9100 - -# Jobs additionnels libres : [{ job: nom, cibles: ["hote:port", ...] }] -serveurs_prometheus_cibles_supplementaires: [] diff --git a/roles/serveurs_prometheus/templates/default-prometheus.j2 b/roles/serveurs_prometheus/templates/default-prometheus.j2 deleted file mode 100644 index 1ef72de..0000000 --- a/roles/serveurs_prometheus/templates/default-prometheus.j2 +++ /dev/null @@ -1,2 +0,0 @@ -# Gere par Set-OPS (role serveurs_prometheus). -ARGS="--storage.tsdb.retention.time={{ serveurs_prometheus_retention }}" diff --git a/roles/serveurs_redis/defaults/main.yml b/roles/serveurs_redis/defaults/main.yml deleted file mode 100644 index fe0072b..0000000 --- a/roles/serveurs_redis/defaults/main.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -serveurs_redis_paquets: - - redis-server - -serveurs_redis_service: "redis-server" -serveurs_redis_config_principal: "/etc/redis/redis.conf" -serveurs_redis_config: "/etc/redis/chezlepro.conf" - -serveurs_redis_port: 6379 -serveurs_redis_ecoute: - - "127.0.0.1" - - "{{ ansible_host | default(ansible_default_ipv4.address, true) }}" - -serveurs_redis_maxmemory: "256mb" -serveurs_redis_maxmemory_policy: "allkeys-lru" - -# Mot de passe OBLIGATOIRE (expose sur le reseau interne). Ansible Vault. -serveurs_redis_password: "" # {{ vault_redis }} diff --git a/roles/serveurs_redis/templates/chezlepro.conf.j2 b/roles/serveurs_redis/templates/chezlepro.conf.j2 deleted file mode 100644 index 92a0e55..0000000 --- a/roles/serveurs_redis/templates/chezlepro.conf.j2 +++ /dev/null @@ -1,7 +0,0 @@ -# Gere par Set-OPS (role serveurs_redis). Surcharge /etc/redis/redis.conf. -bind {{ serveurs_redis_ecoute | join(' ') }} -port {{ serveurs_redis_port }} -protected-mode yes -requirepass {{ serveurs_redis_password }} -maxmemory {{ serveurs_redis_maxmemory }} -maxmemory-policy {{ serveurs_redis_maxmemory_policy }} diff --git a/roles/serveurs_sendmail/defaults/main.yml b/roles/serveurs_sendmail/defaults/main.yml deleted file mode 100644 index 97beceb..0000000 --- a/roles/serveurs_sendmail/defaults/main.yml +++ /dev/null @@ -1,31 +0,0 @@ ---- -# Relais SMTP sortant base sur Postfix (fournit l'interface sendmail-compatible). -serveurs_sendmail_packages: - - postfix - - ssl-cert - -serveurs_sendmail_service_name: "postfix" - -# Identite. -serveurs_sendmail_domaine: "chezlepro.internal" -serveurs_sendmail_origine: "$mydomain" -serveurs_sendmail_nom_hote: "{{ ansible_fqdn | default(ansible_hostname) }}" - -# Reseaux internes autorises a relayer (clients_smtp). -serveurs_sendmail_reseaux_autorises: - - "127.0.0.0/8" - - "[::1]/128" - - "10.1.0.0/16" - -# Smarthost amont optionnel. Vide => remise directe (MX). -serveurs_sendmail_smarthost: "" # ex. "[smtp.exemple.com]:587" - -# Relais uniquement : ne pas heberger de boites pour le domaine. -serveurs_sendmail_destinations_locales: "$myhostname, localhost.$mydomain, localhost" - -# Interfaces d'ecoute. -serveurs_sendmail_inet_interfaces: "all" - -# TLS (snakeoil par defaut ; bascule vers l'AC interne plus tard). -serveurs_sendmail_tls_cert: "/etc/ssl/certs/ssl-cert-snakeoil.pem" -serveurs_sendmail_tls_cle: "/etc/ssl/private/ssl-cert-snakeoil.key" diff --git a/roles/serveurs_step_ca/defaults/main.yml b/roles/serveurs_step_ca/defaults/main.yml deleted file mode 100644 index 787a2e9..0000000 --- a/roles/serveurs_step_ca/defaults/main.yml +++ /dev/null @@ -1,27 +0,0 @@ ---- -# Autorite de certification interne (Smallstep step-ca) + ACME. -serveurs_step_ca_paquets: - - step-cli - - step-ca - -# Depot apt officiel Smallstep. -serveurs_step_ca_depot_cle_url: "https://packages.smallstep.com/keys/apt/repo-signing-key.gpg" -serveurs_step_ca_depot_cle_fichier: "/etc/apt/keyrings/smallstep.asc" -serveurs_step_ca_depot_uri: "https://packages.smallstep.com/stable/debian" -serveurs_step_ca_depot_suite: "debs" - -# Service. -serveurs_step_ca_utilisateur: "step" -serveurs_step_ca_steppath: "/etc/step-ca" -serveurs_step_ca_service: "step-ca" - -# Identite de l'AC. -serveurs_step_ca_nom: "Chezlepro Internal CA" -serveurs_step_ca_dns: "{{ ansible_fqdn | default(ansible_hostname) }},{{ ansible_host | default('127.0.0.1') }}" -serveurs_step_ca_adresse: ":8443" -serveurs_step_ca_provisioner: "admin@chezlepro.internal" -serveurs_step_ca_acme: true - -# Secrets (Ansible Vault) — obligatoires pour l'initialisation. -serveurs_step_ca_password: "" # {{ vault_step_ca_password }} -serveurs_step_ca_provisioner_password: "" # {{ vault_step_ca_provisioner_password }} diff --git a/roles/serveurs_step_ca/templates/smallstep.sources.j2 b/roles/serveurs_step_ca/templates/smallstep.sources.j2 deleted file mode 100644 index 438d7da..0000000 --- a/roles/serveurs_step_ca/templates/smallstep.sources.j2 +++ /dev/null @@ -1,5 +0,0 @@ -Types: deb -URIs: {{ serveurs_step_ca_depot_uri }} -Suites: {{ serveurs_step_ca_depot_suite }} -Components: main -Signed-By: {{ serveurs_step_ca_depot_cle_fichier }} diff --git a/roles/web/README.md b/roles/web/README.md index 5e19b10..5f187a7 100644 --- a/roles/web/README.md +++ b/roles/web/README.md @@ -1,8 +1,8 @@ # web -Couche applicative web Chezlepro, distincte de l'edge `serveurs_nginx`. +Couche applicative web Chezlepro, distincte de l'edge `serveur_nginx`. -- frontaux : présentation web (UI, rendu, assets), groupe `serveurs_web_frontaux` ; -- dorsaux : application web (API, traitement), groupe `serveurs_web_dorsaux`. +- frontaux : présentation web (UI, rendu, assets), groupe `serveur_web_frontal` ; +- dorsaux : application web (API, traitement), groupe `serveur_web_dorsal`. -Le mandataire inverse, la terminaison TLS et le WAF relèvent de `serveurs_nginx`, pas de ce rôle. +Le mandataire inverse, la terminaison TLS et le WAF relèvent de `serveur_nginx`, pas de ce rôle. diff --git a/scripts/applications (conflicted copy 2026-06-23 231110).py b/scripts/applications (conflicted copy 2026-06-23 231110).py new file mode 100644 index 0000000..b9794cc --- /dev/null +++ b/scripts/applications (conflicted copy 2026-06-23 231110).py @@ -0,0 +1,155 @@ +#!/usr/bin/env python3 +"""Lit et valide le registre des applications Set-OPS (docs/applications.yml).""" + +from __future__ import annotations + +import argparse +import sys +from pathlib import Path + +import yaml + +from inventory_gui import charger_yaml, liste_hotes +from inventory_rules import ( + bases_de_application, + chaine_connexion, + charger_applications, + charger_bases_donnees, + charger_domaines, + valider_applications, +) + +RACINE = Path(__file__).resolve().parents[1] +FICHIER = RACINE / "docs/applications.yml" +FICHIER_BASES = RACINE / "docs/bases-donnees.yml" +FICHIER_DOMAINES = RACINE / "docs/domaines.yml" +INVENTAIRE = RACINE / "inventories/production/hosts.yml" + +# Groupes 'serveurs_*' qui sont des capacites de SOCLE (sur toutes les VM), +# pas des applications a part entiere. +GROUPES_SOCLE = {"serveur_debian", "serveur_durci"} + + +def _liste(valeur: str) -> list: + return [v.strip() for v in (valeur or "").split(",") if v.strip()] + + +def ecrire(registre: dict) -> None: + entete = ( + "# Registre des applications Set-OPS (application = entite pivot).\n" + "# Edite par make inventaire-ui ou scripts/applications.py.\n" + "# Une VM peut porter plusieurs applications ; une base se lie a une application.\n" + "---\n" + ) + with FICHIER.open("w", encoding="utf-8") as fichier: + fichier.write(entete) + yaml.safe_dump({"applications": registre.get("applications", {}) or {}}, + fichier, default_flow_style=False, sort_keys=False, allow_unicode=True) + + +def lister(registre: dict, bases: dict) -> None: + apps = registre.get("applications", {}) + if not apps: + print("Aucune application declaree.") + return + for nom, app in apps.items(): + extras = [] + if app.get("port"): + extras.append(f"port {app['port']}") + if app.get("requiert"): + extras.append(f"requiert {', '.join(app['requiert'])}") + if app.get("expose"): + extras.append(f"expose {', '.join(app['expose'])}") + suffixe = (" {" + " ; ".join(extras) + "}") if extras else "" + print(f"{nom} [groupe {app.get('groupe', '?')}, hote {app.get('hote', '?')}]{suffixe}") + for entree in bases_de_application(bases, application=nom, + groupe=app.get("groupe"), hote=app.get("hote")): + base = entree["base"] + portee = base.get("portee", "groupe") + print(f" DSN ({portee}/{base.get('usage', '-')}): {chaine_connexion(base, entree['serveur'])}") + + +def bootstrap(registre_existant: dict) -> dict: + """(Re)genere les applications depuis les appartenances de groupes de l'inventaire. + + Un groupe 'serveurs_*' (hors socle) sur un hote = une application. Les entrees + existantes correspondant a un couple (groupe, hote) toujours present sont + preservees telles quelles (port / expose / requiert ...). + """ + existant = registre_existant.get("applications") or {} + par_cle = {(a.get("groupe"), a.get("hote")): (cle, a) for cle, a in existant.items()} + apps: dict = {} + for h in liste_hotes(charger_yaml(INVENTAIRE)): + hote = h.get("nom") + if not hote: + continue + for groupe in sorted(h.get("groupes", [])): + if not groupe.startswith("serveur_") or groupe in GROUPES_SOCLE: + continue + garde = par_cle.get((groupe, hote)) + if garde: + apps[garde[0]] = garde[1] + continue + base = groupe[len("serveur_"):] + app_id = base if base not in apps else f"{base}-{hote}" + apps[app_id] = {"groupe": groupe, "hote": hote} + return {"applications": apps} + + +def main() -> int: + parser = argparse.ArgumentParser(description="Registre des applications Set-OPS.") + sub = parser.add_subparsers(dest="commande", required=True) + sub.add_parser("lister", help="Affiche les applications et leurs DSN resolus.") + sub.add_parser("verifier", help="Valide la coherence du registre.") + sub.add_parser("bootstrap", help="(Re)genere applications.yml depuis les groupes de l'inventaire.") + + pa = sub.add_parser("ajouter", help="Ajoute ou met a jour une application.") + pa.add_argument("--id", required=True) + pa.add_argument("--groupe", required=True) + pa.add_argument("--hote", required=True) + pa.add_argument("--port", type=int) + pa.add_argument("--requiert", default="", help="Applications dont elle depend (separees par virgule).") + pa.add_argument("--expose", default="", help="FQDN publics qui la publient (separes par virgule).") + + pr = sub.add_parser("retirer", help="Retire une application.") + pr.add_argument("--id", required=True) + + args = parser.parse_args() + try: + registre = charger_applications(FICHIER) + domaines = charger_domaines(FICHIER_DOMAINES) + if args.commande == "lister": + lister(registre, charger_bases_donnees(FICHIER_BASES)) + elif args.commande == "verifier": + valider_applications(registre, domaines) + print("Registre des applications valide.") + elif args.commande == "bootstrap": + registre = bootstrap(registre) + valider_applications(registre, domaines) + ecrire(registre) + print(f"docs/applications.yml genere depuis l'inventaire ({len(registre['applications'])} applications).") + elif args.commande == "ajouter": + app = {"groupe": args.groupe, "hote": args.hote} + if args.port is not None: + app["port"] = args.port + if _liste(args.requiert): + app["requiert"] = _liste(args.requiert) + if _liste(args.expose): + app["expose"] = _liste(args.expose) + registre["applications"][args.id] = app + valider_applications(registre, domaines) + ecrire(registre) + print(f"Application '{args.id}' enregistree.") + elif args.commande == "retirer": + registre["applications"].pop(args.id, None) + valider_applications(registre, domaines) + ecrire(registre) + print(f"Application '{args.id}' retiree.") + except Exception as exc: + print(f"erreur: {exc}", file=sys.stderr) + return 2 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/applications.py b/scripts/applications.py index 1ffea3d..3f305b0 100644 --- a/scripts/applications.py +++ b/scripts/applications.py @@ -27,7 +27,7 @@ INVENTAIRE = RACINE / "inventories/production/hosts.yml" # Groupes 'serveurs_*' qui sont des capacites de SOCLE (sur toutes les VM), # pas des applications a part entiere. -GROUPES_SOCLE = {"serveurs_debian", "serveurs_durcis"} +GROUPES_SOCLE = {"serveur_debian", "serveur_durci"} def _liste(valeur: str) -> list: diff --git a/scripts/instancier.py b/scripts/instancier.py index 17c304f..fe41be8 100644 --- a/scripts/instancier.py +++ b/scripts/instancier.py @@ -8,7 +8,7 @@ bascule tant que la comparaison n'est pas vide et validee. Derivation : - host vars : ansible_host/ansible_user + proxmox_* (IP/VMID/VLAN/passerelle derives de la nomenclature ; placement/taille depuis docs/serveurs.yml) ; - - groupes : socle (serveurs_debian/durcis) + groupes de service derives des + - groupes : socle (serveur_debian/durcis) + groupes de service derives des applications de l'hote + groupe d'etat (hotes_actifs/hotes_planifies). - Les integrations clients_* ne sont PAS derivables du plan a ce stade : la comparaison les revele (lacune a combler en Phase 3b). @@ -38,7 +38,7 @@ FICHIER_SERVEURS = RACINE / "docs/serveurs.yml" FICHIER_APPLICATIONS = RACINE / "docs/applications.yml" FICHIER_NOMENCLATURE = RACINE / "docs/nomenclature.yml" -GROUPES_SOCLE = ["serveurs_debian", "serveurs_durcis"] +GROUPES_SOCLE = ["serveur_debian", "serveur_durci"] PLACEMENT = [("noeud", "proxmox_noeud"), ("stockage", "proxmox_stockage"), ("disque", "proxmox_disque_taille"), ("memoire", "proxmox_memoire"), ("coeurs", "proxmox_coeurs")] diff --git a/scripts/inventory_gui.py b/scripts/inventory_gui.py index cebd259..201bfab 100644 --- a/scripts/inventory_gui.py +++ b/scripts/inventory_gui.py @@ -727,7 +727,7 @@ HTML = r""" function marquerModifie() { modifie = true; verifie = {}; majIndicateurSauvegarde(); majBoutonsDeploiement(); } function ajouterHote() { - hotes.unshift({nom:'', etat:'planifie', utilisateur_ansible:'ansible', groupes:['serveurs_debian','serveurs_durcis']}); + hotes.unshift({nom:'', etat:'planifie', utilisateur_ansible:'ansible', groupes:['serveur_debian','serveur_durci']}); selection = 0; selectionNom = ''; filtre = ''; filtreEtat = 'tous'; document.getElementById('filtre').value = ''; marquerModifie(); dessiner(); @@ -968,7 +968,7 @@ HTML = r""" - + `).join('') : '
Aucun serveur de BD.
'; const sourceConso = (portee) => portee === 'hote' ? hotes.map(h => h.nom).filter(Boolean) @@ -1112,7 +1112,7 @@ HTML = r""" - +
dérivé → vmid ${echapper(d.vmid)} · ip ${echapper(d.ip)} · vlan ${echapper(d.vlan)}
`; diff --git a/scripts/inventory_rules.py b/scripts/inventory_rules.py index 1152171..9a5ccc6 100644 --- a/scripts/inventory_rules.py +++ b/scripts/inventory_rules.py @@ -9,7 +9,7 @@ from pathlib import Path import yaml -GROUPES_OPERATIONNELS_PREFIXES = ("serveurs_", "clients_") +GROUPES_OPERATIONNELS_PREFIXES = ("serveur_", "client_") GROUPE_HOTES_ACTIFS = "hotes_actifs" GROUPE_HOTES_PLANIFIES = "hotes_planifies" GROUPES_ETAT_HOTE = {GROUPE_HOTES_ACTIFS, GROUPE_HOTES_PLANIFIES} diff --git a/scripts/serveurs.py b/scripts/serveurs.py index 48dab6c..6e05774 100644 --- a/scripts/serveurs.py +++ b/scripts/serveurs.py @@ -60,7 +60,7 @@ def bootstrap() -> dict: v = str(h.get(cle_src, "")).strip() if v: srv[cle_dst] = int(v) if v.isdigit() else v - integrations = sorted(g for g in (h.get("groupes") or []) if g.startswith("clients_")) + integrations = sorted(g for g in (h.get("groupes") or []) if g.startswith("client_")) if integrations: srv["integrations"] = integrations serveurs[nom] = srv