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 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-06-23 23:18:52 -04:00
parent 30e405dc92
commit ca0f95da28
237 changed files with 1868 additions and 1543 deletions

5
.ansible-lint Normal file
View file

@ -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/

View file

@ -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.

View file

@ -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.

View file

@ -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'

View file

@ -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.

View file

@ -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

View file

@ -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 :

View file

@ -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

View file

@ -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.

View file

@ -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)."

View file

@ -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`.

View file

@ -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

View file

@ -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.

View file

@ -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.
---

View file

@ -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`.

View file

@ -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

View file

@ -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 :

View file

@ -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:

View file

@ -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.

View file

@ -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

View file

@ -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).

View file

@ -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.

View file

@ -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

View file

@ -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).

View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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).

View file

@ -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.

View file

@ -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/).

View file

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

View file

@ -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).

View file

@ -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: []

View file

@ -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 }}."

View file

@ -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).

View file

@ -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: ""

View file

@ -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).

View file

@ -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

View file

@ -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).

View file

@ -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.

View file

@ -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/).

View file

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

View file

@ -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 }}."

View file

@ -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).

View file

@ -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: "..."

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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."

View file

@ -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

View file

@ -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

View file

@ -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."

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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."

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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."

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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.

View file

@ -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`.

View file

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

View file

@ -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

View file

@ -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

View file

@ -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=<inventory_hostname>`.
## 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`).

View file

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

View file

@ -1,6 +1,6 @@
---
- name: Redemarrer alloy
ansible.builtin.systemd:
name: "{{ clients_journaux_service }}"
name: "{{ client_journal_service }}"
state: restarted
listen: Redemarrer alloy

View file

@ -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

View file

@ -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 }}"
}
}

View file

@ -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`).

View file

@ -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

Some files were not shown because too many files have changed in this diff Show more