Neutraliser le moteur pour partage public (100% neutre)
Suppression de toute trace Chezlepro de l'outil (roles, scripts, docs publiques, exemples, LICENSE). Prouve par scan exhaustif : git grep vide pour chezlepro, asgard/TrueNAS, supernet reel 10.1.x. Corrige 5 defauts de genericite fonctionnels (motd, app.ini Forgejo, organisation openldap, nom AC step-ca, et IP reelles codees en dur dans les defaults de roles -> plage d'exemple 10.0.x). LICENSE -> Alliance Boreale. Fichiers mainteneur + CHANGELOG conserves (par decision). La separation moteur/instance tient : OPS-Chezlepro surcharge deja ses vraies valeurs de topologie. Verifie : make verifier exit 0 (4 tests). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
f8e5e4d928
commit
b775b7f99d
53 changed files with 126 additions and 125 deletions
|
|
@ -5,6 +5,7 @@
|
|||
### Modifié
|
||||
- **Consolidation minimale post-diagnostic (ménage documentaire, sans risque).** Suite à une relecture à froid « auteur » de l'état réel du dépôt. (1) **En-tête généré rafraîchi** : `instance/inventories/production/hosts.yml` pointait encore vers l'ancienne source `docs/` ; régénéré via `instancier-appliquer` (diff sémantique **vide** — contenu inchangé, seul l'en-tête a bougé ; commité côté instance `OPS-Chezlepro`). (2) **`docs/catalogue-services.md`** : nouvelle section **« État d'implémentation des rôles »** qui distingue sans ambiguïté les rôles **implémentés** (validés *en tant que code*, **non éprouvés en prod**), les **échafaudages** (playbooks-ancres `debug` sans rôle : `serveur_nextcloud`, `serveur_collabora`, `client_supervision`, `serveur_web_frontal`, `serveur_web_dorsal`) et les **rôles-catégories inertes** (`applications`, `backup`, `database`, `identity`, `monitoring`, `proxmox`, `storage`, `web` — vestiges d'un regroupement par catégorie abandonné, l'architecture réelle étant plate `serveur_*`/`client_*`) ; colonnes « Rôle futur » → « Rôle ». (3) **`docs/vm-lifecycle.md` §8** : flux de déploiement réaligné sur le plan (`instancier-appliquer` puis `deployer`) au lieu de la commande supplantée `hote-ajouter`. Vérifié : `make verifier` (exit 0), `ansible-lint` 0 échec. **Non touché à dessein** : les références `instance/inventories/lab/` des docs de template sont **correctes** (contexte golden template, distinct de `production`) ; le bas du `README.md` (« Premier chantier »/« Principe ») est daté mais **exact** (template = socle), donc laissé tel quel pour éviter le churn.
|
||||
- **`creer-vm` enfin piloté par le plan — couture « inventaire → création VM » fermée (étape 4 du diagnostic).** `make creer-vm HOTE=<hôte>` ne prend plus qu'**un argument** : il **lit VMID/IP/CIDR/passerelle/VLAN/stockage/disque/nœud directement dans l'inventaire généré** (comme `deployer` lit ses groupes) au lieu de les redemander à la main, et **n'écrit plus** dans l'inventaire (l'appel à `hote-ajouter` est supprimé — l'hôte est déjà présent via le plan). Repli sur le nœud par défaut de `config` si `proxmox_noeud` absent. Les 3 cibles legacy `hote-ajouter` / `hote-planifier` / `hote-groupes` (qui éditaient l'inventaire généré à la main — anti-pattern) sont **neutralisées** : refus explicite renvoyant vers `serveurs.yml` + `instancier-appliquer`. `aide` et docs (`README`, `QUICKSTART`, `procedure-template-debian13-proxmox`) alignées sur `creer-vm HOTE=…`. La chaîne déclarative est désormais **continue** : `plan → instancier-appliquer → creer-vm HOTE → (activer) → deployer HOTE`. Activation laissée **manuelle** (édit du plan, par décision). Vérifié : `make verifier` exit 0 (dont 4 tests unitaires), extraction testée sur l'inventaire réel (`data-01` avec nœud, `collab-01` sans nœud → repli), chemins de refus (HOTE vide, hôte absent, cibles legacy) exit 2. *(Clonage réel non exécuté : exige Proxmox — c'est la preuve VM, étape suivante.)*
|
||||
- **Neutralisation complète pour partage public (« 100 % neutre »).** Préparation au don public du moteur : suppression de **toute** trace Chezlepro de l'**outil** (rôles, scripts, docs publiques, exemples, LICENSE) — prouvée par scan exhaustif (`git grep` revient **vide** pour `chezlepro`, pour `asgard`/`TrueNAS`, et pour le supernet réel `10.1.x`). Corrigés au passage **5 défauts de généricité fonctionnels** qui auraient déployé du Chezlepro chez tout hébergeur : `roles/motd/templates/motd.j2` (« Système Chezlepro » → `{{ domaine_interne | default('Set-OPS') }}`), `serveur_forgejo` (`APP_NAME`), `serveur_openldap` (organisation par défaut), `serveur_step_ca` (nom d'AC par défaut), et surtout les **IP réelles codées en dur dans les `defaults`** de plusieurs rôles (`db_host`, `loki_url`, `reseaux_autorises` → plage d'exemple `10.0.x`). Noms de tâches/playbooks et exemples de README généricisés ; marqueurs de fichiers gérés alignés sur `setops` (READMEs en retard) ; placeholder GUI neutralisé. **LICENSE : copyright → Alliance Boréale.** Fichiers **mainteneur** (`AGENTS.md`, `CLAUDE.md`, `SOLUTION.md`, doc Codex) et `CHANGELOG` conservés (couche gouvernance/historique — peuvent nommer Chezlepro, par décision). L'instance `OPS-Chezlepro` **surcharge déjà** ses vraies valeurs de topologie dans ses `group_vars` : la séparation moteur/instance tient, le changement des `defaults` ne casse pas Chezlepro (seule `client_journal_loki_url` reste à surcharger côté instance). Vérifié : `make verifier` exit 0 (4 tests), 42 fichiers, scans de fuite **vides**.
|
||||
|
||||
### Ajouté
|
||||
- **Sous-commande `inventory_host.py parametres-proxmox --hote X`** : émet, machine-lisible (`SETOPS_*='valeur'`), les paramètres de clonage Proxmox d'un hôte lus dans l'inventaire généré ; refuse si l'hôte est absent ou s'il manque un champ requis (VMID/IP/CIDR/passerelle/VLAN). Consommée par `make creer-vm`. **Premier test stdlib du dépôt** `scripts/tests/test_inventory_host.py` (sans pytest) + cible **`make test`**, câblée dans `make verifier`.
|
||||
|
|
|
|||
2
LICENSE
2
LICENSE
|
|
@ -220,7 +220,7 @@ If you develop a new program, and you want it to be of the greatest possible use
|
|||
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
Set-OPS
|
||||
Copyright (C) 2026 Chezlepro
|
||||
Copyright (C) 2026 Alliance Boréale
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
|
||||
|
|
|
|||
4
Makefile
4
Makefile
|
|
@ -99,7 +99,7 @@ aide:
|
|||
@printf '%s\n' ' Creer une VM (VMID/IP/VLAN/passerelle lus dans le plan):'
|
||||
@printf '%s\n' ' make creer-vm HOTE=web-frontal-01'
|
||||
@printf '%s\n' ' Cloner seulement, sans passer par le plan:'
|
||||
@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' ' make cloner-vm HOTE=web-frontal-01 VMID=95301 VLAN=15 ADRESSE_IP=10.0.2.31 PASSERELLE=10.0.2.1'
|
||||
@printf '%s\n' ' Configurer Proxmox et le Vault API:'
|
||||
@printf '%s\n' ' make config'
|
||||
@printf '%s\n' ''
|
||||
|
|
@ -148,7 +148,7 @@ aide:
|
|||
@printf '%s\n' ''
|
||||
@printf '%s\n' 'Variables frequentes'
|
||||
@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' ' VMID=95301 VLAN=15 ADRESSE_IP=10.0.2.31 PASSERELLE=10.0.2.1'
|
||||
@printf '%s\n' ' FICHIER_INVENTAIRE=$(SETOPS_INSTANCE)/inventories/production/hosts.yml FICHIER_DEPENDANCES=docs/dependances-groupes.yml CONFIRMER=true'
|
||||
|
||||
.PHONY: lint
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
**Set-OPS est un moteur Ansible générique** qui permet à un hébergeur de **construire et exploiter un écosystème numérique souverain** — DNS interne, AC/PKI, identité (LDAP + SSO), relais courriel, bases de données, observabilité, applications — sur sa propre grappe **Proxmox**, à partir d'un **plan déclaratif**.
|
||||
|
||||
Le dépôt est le **moteur** (générique, partageable). Chaque déploiement réel est une **instance** (le plan + l'inventaire d'un hébergeur, dans son propre dépôt). Chezlepro en est une ; tu crées la tienne à partir d'un **modèle prêt à déployer** (`exemples/modeles/`).
|
||||
Le dépôt est le **moteur** (générique, partageable). Chaque déploiement réel est une **instance** (le plan + l'inventaire d'un hébergeur, dans son propre dépôt). Tu crées la tienne à partir d'un **modèle prêt à déployer** (`exemples/modeles/`).
|
||||
|
||||
> 👉 **Tu débarques avec une grappe Proxmox et tu veux monter ton écosystème ? Commence par [`QUICKSTART.md`](QUICKSTART.md).**
|
||||
|
||||
|
|
@ -12,7 +12,7 @@ Le dépôt est le **moteur** (générique, partageable). Chaque déploiement ré
|
|||
|
||||
## Mission (la vision derrière l'outil)
|
||||
|
||||
`Set-OPS` ne se limite plus à l'exploitation : il **définit et construit l'écosystème numérique souverain de Chezlepro Inc.** — une infrastructure interne auto-suffisante, sans dépendance SaaS, décrite en code et pilotée par des registres machine-lisibles qui font office de **source unique de vérité** (`instance/plan/serveurs.yml`, `instance/plan/applications.yml`, `instance/plan/bases-donnees.yml`, `instance/plan/domaines.yml`, `instance/plan/nomenclature.yml`, `docs/dependances-groupes.yml`).
|
||||
`Set-OPS` ne se limite plus à l'exploitation : il **définit et construit un écosystème numérique souverain** — une infrastructure interne auto-suffisante, sans dépendance SaaS, décrite en code et pilotée par des registres machine-lisibles qui font office de **source unique de vérité** (`instance/plan/serveurs.yml`, `instance/plan/applications.yml`, `instance/plan/bases-donnees.yml`, `instance/plan/domaines.yml`, `instance/plan/nomenclature.yml`, `docs/dependances-groupes.yml`).
|
||||
|
||||
Piliers de l'écosystème :
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Architecture Set-OPS
|
||||
|
||||
Set-OPS définit et construit l'écosystème numérique souverain de Chezlepro. Il se
|
||||
Set-OPS définit et construit l'écosystème numérique souverain. Il se
|
||||
pilote par un **plan** : l'inventaire Ansible (`instance/inventories/production/hosts.yml`)
|
||||
est **généré** depuis le plan, pas édité à la main.
|
||||
|
||||
|
|
@ -51,7 +51,7 @@ Les groupes structurels ou vides peuvent exister, mais un groupe assigné à une
|
|||
|
||||
## Cycle de vie VM
|
||||
|
||||
Le cycle de vie des VM Chezlepro est documenté dans :
|
||||
Le cycle de vie des VM est documenté dans :
|
||||
|
||||
```text
|
||||
docs/vm-lifecycle.md
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Catalogue des services Chezlepro
|
||||
# Catalogue des services
|
||||
|
||||
Ce document fixe les noms de groupes et de playbooks pour les prochains services.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# DNS interne Chezlepro
|
||||
# DNS interne
|
||||
|
||||
Le service DNS interne est la premiere capacite de plateforme.
|
||||
|
||||
|
|
@ -16,7 +16,7 @@ client_dns -> integration cliente DNS
|
|||
La zone initiale est :
|
||||
|
||||
```text
|
||||
chezlepro.internal
|
||||
exemple.internal
|
||||
```
|
||||
|
||||
Elle est definie dans :
|
||||
|
|
@ -39,8 +39,8 @@ ansible_host defini
|
|||
Exemple :
|
||||
|
||||
```text
|
||||
web-frontal-01 ansible_host=10.1.15.31
|
||||
-> web-frontal-01.chezlepro.internal A 10.1.15.31
|
||||
web-frontal-01 ansible_host=10.0.2.31
|
||||
-> web-frontal-01.exemple.internal A 10.0.2.31
|
||||
```
|
||||
|
||||
Les enregistrements additionnels explicites sont dans `serveur_powerdns_records`.
|
||||
|
|
@ -83,8 +83,8 @@ Les premiers checks utiles :
|
|||
|
||||
- service `pdns` actif ;
|
||||
- port UDP/TCP 53 disponible ;
|
||||
- SOA de `chezlepro.internal` resoluble ;
|
||||
- enregistrement `ns1.chezlepro.internal` resoluble ;
|
||||
- SOA de `exemple.internal` resoluble ;
|
||||
- enregistrement `ns1.exemple.internal` resoluble ;
|
||||
- enregistrements des hotes actifs presents ;
|
||||
- serial de zone attendu ;
|
||||
- latence de resolution.
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
## Objet
|
||||
|
||||
Ce document justifie les ajouts appliqués par Set-OPS à une installation Debian 13 minimale pour obtenir le golden template Proxmox de Chezlepro.
|
||||
Ce document justifie les ajouts appliqués par Set-OPS à une installation Debian 13 minimale pour obtenir le golden template Proxmox.
|
||||
|
||||
Le template doit rester un socle commun, clonable et sécuritaire. Il ne doit pas devenir un serveur applicatif ni intégrer des dépendances propres à un rôle final.
|
||||
|
||||
|
|
@ -35,7 +35,7 @@ aucune donnée propre à un clone final
|
|||
|
||||
### Objectif
|
||||
|
||||
Le playbook `debian13_proxmox_preparer.yml` transforme une VM Debian 13 minimale en socle golden template Chezlepro.
|
||||
Le playbook `debian13_proxmox_preparer.yml` transforme une VM Debian 13 minimale en socle golden template.
|
||||
|
||||
Il installe les composants communs, configure l'accès Ansible, applique le durcissement template-safe et prépare la VM pour cloud-init.
|
||||
|
||||
|
|
@ -61,7 +61,7 @@ VM destinée à devenir un template, pas un serveur de production
|
|||
Vérifications utiles depuis le poste Ansible :
|
||||
|
||||
```bash
|
||||
ssh ansible@10.1.99.99
|
||||
ssh ansible@10.0.2.99
|
||||
ansible -i instance/inventories/lab/hosts.yml modeles_vm -m ping
|
||||
ansible -i instance/inventories/lab/hosts.yml modeles_vm -m setup
|
||||
```
|
||||
|
|
@ -194,7 +194,7 @@ nftables_socle
|
|||
| `chrony` | Installe et active la synchronisation du temps. | Un temps correct est nécessaire pour TLS, journaux, audit, Kerberos/LDAP futur, monitoring et corrélation d'incidents. | La source NTP définitive peut être ajustée plus tard par inventaire. |
|
||||
| `ssh_baseline` | Pose la base SSH : root interdit, clé publique obligatoire, mot de passe désactivé. | Force un accès administrateur par clé dès la construction du template. | Cloud-init doit avoir injecté le `ciuser` et sa clé avant Ansible. |
|
||||
| `systemd_ssh_auto` | Désactive le comportement `systemd.ssh_auto` si demandé. | Évite une exposition SSH automatique via mécanismes transitoires non désirés dans un template serveur. | Ne remplace pas la politique SSH principale. |
|
||||
| `motd` | Déploie un message d'accueil sobre. | Identifie le contexte Chezlepro et rappelle que la machine est gérée par Set-OPS. | Ne doit pas contenir d'information sensible. |
|
||||
| `motd` | Déploie un message d'accueil sobre. | Identifie le contexte de l_instance et rappelle que la machine est gérée par Set-OPS. | Ne doit pas contenir d'information sensible. |
|
||||
| `hardening_packages` | Installe les paquets de sécurité communs. | Fournit les briques nécessaires au durcissement sans configurer de service applicatif. | Les politiques strictes par rôle restent appliquées sur les clones. |
|
||||
| `sysctl_durcissement` | Applique des paramètres noyau de sécurité. | Réduit des comportements réseau et noyau risqués avec des réglages standards pour serveur Linux. | Les réglages spécifiques à une charge de travail peuvent être ajustés par rôle. |
|
||||
| `core_dumps` | Désactive les core dumps. | Limite le risque de fuite de secrets ou données sensibles dans des dumps mémoire. | Un serveur de debug peut réactiver un comportement adapté hors template. |
|
||||
|
|
|
|||
|
|
@ -71,17 +71,17 @@ Les groupes restent fins et composables. La cohabitation se fait en associant pl
|
|||
|
||||
## Plan d'adressage interne
|
||||
|
||||
Réseau interne unique : `10.1.0.0/16`. Segmentation par fonction, un `/24` et un VLAN par catégorie, **3ᵉ octet = VLAN** (L2 alignée sur L3).
|
||||
Réseau interne unique : `10.0.0.0/16`. Segmentation par fonction, un `/24` et un VLAN par catégorie, **3ᵉ octet = VLAN** (L2 alignée sur L3).
|
||||
|
||||
| Catégorie | VLAN | Sous-réseau | Passerelle |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 — Fondations / infra | 11 | `10.1.11.0/24` | `10.1.11.1` |
|
||||
| 2 — Identité | 12 | `10.1.12.0/24` | `10.1.12.1` |
|
||||
| 3 — Données | 13 | `10.1.13.0/24` | `10.1.13.1` |
|
||||
| 4 — Observabilité | 14 | `10.1.14.0/24` | `10.1.14.1` |
|
||||
| 5 — Applications | 15 | `10.1.15.0/24` | `10.1.15.1` |
|
||||
| 1 — Fondations / infra | 11 | `10.0.11.0/24` | `10.0.11.1` |
|
||||
| 2 — Identité | 12 | `10.0.12.0/24` | `10.0.12.1` |
|
||||
| 3 — Données | 13 | `10.0.13.0/24` | `10.0.13.1` |
|
||||
| 4 — Observabilité | 14 | `10.0.14.0/24` | `10.0.14.1` |
|
||||
| 5 — Applications | 15 | `10.0.15.0/24` | `10.0.15.1` |
|
||||
|
||||
Adresse d'hôte (4ᵉ octet) : **`service × 10 + NN`**. `.1` = passerelle ; `.2`–`.9` réservés. Exemple : `web-dorsal-01` (catégorie 5, service 4, NN 01) → `10.1.15.41`.
|
||||
Adresse d'hôte (4ᵉ octet) : **`service × 10 + NN`**. `.1` = passerelle ; `.2`–`.9` réservés. Exemple : `web-dorsal-01` (catégorie 5, service 4, NN 01) → `10.0.15.41`.
|
||||
|
||||
Tout se dérive de la fonction de l'hôte, et la source unique machine-lisible est **`instance/plan/nomenclature.yml`** :
|
||||
|
||||
|
|
@ -89,14 +89,14 @@ Tout se dérive de la fonction de l'hôte, et la source unique machine-lisible e
|
|||
hostname = <fonction>-<NN>
|
||||
VMID = 9 · catégorie · service · NN
|
||||
VLAN = catégorie.vlan
|
||||
IP = 10.1.<vlan>.(service × 10 + NN)
|
||||
IP = 10.0.<vlan>.(service × 10 + NN)
|
||||
```
|
||||
|
||||
`make inventaire-ui` lit ce registre et **propose** automatiquement VMID, VLAN, IP et passerelle quand on nomme un hôte. La sécurité entre zones se fera par règles inter-zones (nftables / edge), pas par l'adressage.
|
||||
|
||||
Contrainte : `NN` de 01 à 09 par fonction (l'octet hôte reste dans le bloc du service). Au-delà, ouvrir une nouvelle fonction/service dans `instance/plan/nomenclature.yml`.
|
||||
|
||||
La segmentation `10.1.0.0/16` remplace l'ancienne plage d'essais `192.168.12.x`.
|
||||
La segmentation `10.0.0.0/16` remplace l'ancienne plage d'essais `192.168.12.x`.
|
||||
|
||||
## Variables de provisioning d'hôte
|
||||
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ Tous sous `docs/`, machine-lisibles, validés, consommés par le GUI, le CLI et
|
|||
### Dérivations clés
|
||||
- **Nommage/adressage** : tout part de la `fonction` de l'hôte (`web-frontal-03`).
|
||||
`VMID = 9·catégorie·service·NN`, `VLAN = catégorie.vlan`,
|
||||
`IP = 10.1.<vlan>.(service×10 + NN)`. Voir `docs/nomenclature-vm.md`.
|
||||
`IP = 10.0.<vlan>.(service×10 + NN)`. Voir `docs/nomenclature-vm.md`.
|
||||
- **DSN** (lien application↔base) : `<type>://<proprietaire>:<secret>@<hôte>:<port>/<base>`.
|
||||
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)`.
|
||||
|
|
@ -157,13 +157,13 @@ C'est ainsi que le plan a été initialisé sans perte, avec diff vide vérifié
|
|||
|
||||
Le **moteur** (ce dépôt, `Set-OPS`) est générique et partageable ; il ne contient
|
||||
aucune donnée d'instance. Une **instance** (le plan + l'inventaire d'un loup) vit
|
||||
dans son **propre dépôt** (ex. `OPS-Chezlepro`).
|
||||
dans son **propre dépôt** (ex. `OPS-monatelier`).
|
||||
|
||||
Le moteur localise l'instance via **`SETOPS_INSTANCE`** (défaut : `instance`). Deux
|
||||
modèles :
|
||||
|
||||
- **Modèle A — dépôts frères** (en cours) : moteur et instance côte à côte ; un
|
||||
symlink `instance -> ../OPS-Chezlepro` (gitignoré) fait que le défaut résout
|
||||
symlink `instance -> ../OPS-monatelier` (gitignoré) fait que le défaut résout
|
||||
l'instance sans configuration. Idéal quand on développe le moteur *et* l'instance.
|
||||
- **Modèle B — moteur en sous-module** (futur, pour la meute) : l'instance épingle
|
||||
une version du moteur ; `SETOPS_INSTANCE` pointe la racine de l'instance.
|
||||
|
|
@ -172,7 +172,7 @@ Pour brancher une instance (modèle A) :
|
|||
|
||||
```bash
|
||||
cd Set-OPS
|
||||
ln -s ../OPS-Chezlepro instance # ou : export SETOPS_INSTANCE=/chemin/instance
|
||||
ln -s ../OPS-monatelier instance # ou : export SETOPS_INSTANCE=/chemin/instance
|
||||
make inventaire-verifier # lit l'instance via le symlink
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ docs/modeles_vm/debian13-proxmox.md
|
|||
|
||||
## 1. Objectif du modèle
|
||||
|
||||
Le modèle Debian 13 doit servir de base commune pour les futurs serveurs de Chezlepro Inc.
|
||||
Le modèle Debian 13 doit servir de base commune pour les futurs serveurs de l_instance
|
||||
|
||||
Objectifs :
|
||||
|
||||
|
|
@ -92,13 +92,13 @@ Discard : selon stockage, seulement si pertinent
|
|||
SSD emulation : oui si le stockage est réellement SSD/NVMe
|
||||
```
|
||||
|
||||
Même si le stockage réel est sur TrueNAS iSCSI, le disque présenté à la VM doit rester :
|
||||
Même si le stockage réel est sur un stockage réseau iSCSI, le disque présenté à la VM doit rester :
|
||||
|
||||
```text
|
||||
SCSI via VirtIO SCSI single
|
||||
```
|
||||
|
||||
Le choix SCSI ici concerne le bus virtuel vu par la VM, pas le protocole réel entre Proxmox et TrueNAS.
|
||||
Le choix SCSI ici concerne le bus virtuel vu par la VM, pas le protocole réel entre Proxmox et le stockage.
|
||||
|
||||
### Taille du disque
|
||||
|
||||
|
|
@ -202,7 +202,7 @@ LVM
|
|||
Le stockage réel contient déjà plusieurs couches :
|
||||
|
||||
```text
|
||||
TrueNAS ZFS
|
||||
stockage ZFS
|
||||
→ zvol iSCSI
|
||||
→ Proxmox
|
||||
→ disque virtuel
|
||||
|
|
@ -495,8 +495,8 @@ Exemple IP statique temporaire pour joindre la VM de modèle :
|
|||
```bash
|
||||
qm set 9000 --ciuser ansible
|
||||
qm set 9000 --sshkeys ~/.ssh/id_ed25519.pub
|
||||
qm set 9000 --ipconfig0 ip=10.1.99.99/24,gw=10.1.99.1
|
||||
qm set 9000 --nameserver 10.1.99.1
|
||||
qm set 9000 --ipconfig0 ip=10.0.99.99/24,gw=10.0.99.1
|
||||
qm set 9000 --nameserver 10.0.99.1
|
||||
```
|
||||
|
||||
Pour les clones, ces valeurs seront remplacées par l'identité réelle du serveur.
|
||||
|
|
@ -561,7 +561,7 @@ reboot
|
|||
|
||||
## 19. SSH durci attendu
|
||||
|
||||
Le modèle Chezlepro suppose que Cloud-Init injecte le `ciuser` et sa clé publique avant la prise en charge par Ansible.
|
||||
Le modèle suppose que Cloud-Init injecte le `ciuser` et sa clé publique avant la prise en charge par Ansible.
|
||||
|
||||
L'exigence immédiate est que l'accès par clé fonctionne pour `ansible`.
|
||||
|
||||
|
|
@ -768,7 +768,7 @@ Les paramètres par VM (VMID, IP, VLAN, passerelle) ne sont plus saisis à la ma
|
|||
Après le premier démarrage, tester l'accès :
|
||||
|
||||
```bash
|
||||
ssh ansible@10.1.15.31
|
||||
ssh ansible@10.0.15.31
|
||||
```
|
||||
|
||||
Ensuite appliquer la conformité Ansible :
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Cycle de vie des VM Chezlepro
|
||||
# Cycle de vie des VM
|
||||
|
||||
Ce document décrit le cycle normal d'une VM Debian Chezlepro, depuis l'installation minimale jusqu'à la conformité continue par Ansible.
|
||||
Ce document décrit le cycle normal d'une VM Debian, depuis l'installation minimale jusqu'à la conformité continue par Ansible.
|
||||
|
||||
## Vue d'ensemble
|
||||
|
||||
|
|
@ -35,7 +35,7 @@ aucun rôle applicatif
|
|||
aucun secret
|
||||
```
|
||||
|
||||
Cette VM n'est pas encore un golden template Chezlepro.
|
||||
Cette VM n'est pas encore un golden template.
|
||||
|
||||
## 2. Goldenisation
|
||||
|
||||
|
|
@ -45,7 +45,7 @@ La goldenisation est faite par :
|
|||
make preparer-modele
|
||||
```
|
||||
|
||||
Ce playbook ajoute le socle Chezlepro commun au template :
|
||||
Ce playbook ajoute le socle commun au template :
|
||||
|
||||
```text
|
||||
paquets communs
|
||||
|
|
|
|||
|
|
@ -12,5 +12,5 @@
|
|||
domaine_interne: "acme.internal"
|
||||
|
||||
# Le reste de l'identite vit dans le PLAN de l'instance :
|
||||
# - instance/plan/nomenclature.yml : supernet (ex. 10.1.0.0/16) + liste de fonctions
|
||||
# - instance/plan/nomenclature.yml : supernet (ex. 10.0.0.0/16) + liste de fonctions
|
||||
# - instance/plan/serveurs.yml / applications.yml / domaines.yml : le plan rempli
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
- name: Préparer le template Debian 13 Proxmox Chezlepro
|
||||
- name: Préparer le template Debian 13 Proxmox
|
||||
hosts: modeles_vm
|
||||
become: true
|
||||
gather_facts: true
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
- name: Vérifier le template Debian 13 Proxmox Chezlepro
|
||||
- name: Vérifier le template Debian 13 Proxmox
|
||||
hosts: modeles_vm
|
||||
become: true
|
||||
gather_facts: true
|
||||
|
|
|
|||
|
|
@ -57,8 +57,8 @@ make creer-vm \
|
|||
HOTE=web-frontal-01 \
|
||||
VMID=95301 \
|
||||
VLAN=15 \
|
||||
ADRESSE_IP=10.1.15.31 \
|
||||
PASSERELLE=10.1.15.1 \
|
||||
ADRESSE_IP=10.0.15.31 \
|
||||
PASSERELLE=10.0.15.1 \
|
||||
GROUPES="serveur_debian serveur_durci"
|
||||
```
|
||||
|
||||
|
|
@ -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="serveur_debian serveur_durci"
|
||||
make creer-vm HOTE=web-frontal-01 VMID=95301 VLAN=15 ADRESSE_IP=10.0.15.31 PASSERELLE=10.0.15.1 TAILLE_DISQUE=64G GROUPES="serveur_debian serveur_durci"
|
||||
```
|
||||
|
||||
Proxmox ne permet pas de réduire un disque existant.
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
# applications
|
||||
|
||||
Rôles applications : services applicatifs Chezlepro.
|
||||
Rôles applications : services applicatifs internes.
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
- audispd-plugins
|
||||
state: present
|
||||
|
||||
- name: Déployer les règles auditd Chezlepro
|
||||
- name: Déployer les règles auditd Set-OPS
|
||||
ansible.builtin.template:
|
||||
src: 99-setops.rules.j2
|
||||
dest: /etc/audit/rules.d/99-setops.rules
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ visible dans Grafana (datasource Loki).
|
|||
## Variables
|
||||
| Variable | Défaut | Rôle |
|
||||
| --- | --- | --- |
|
||||
| `client_journal_loki_url` | `http://10.1.14.11:3100/loki/api/v1/push` | Endpoint Loki (obs-01) |
|
||||
| `client_journal_loki_url` | `http://10.0.14.11:3100/loki/api/v1/push` | Endpoint Loki (obs-01) |
|
||||
|
||||
## Notes / limites
|
||||
- La **syntaxe de configuration Alloy évolue** entre versions ; la config fournie
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ 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"
|
||||
client_journal_loki_url: "http://10.0.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"
|
||||
|
|
|
|||
|
|
@ -11,15 +11,15 @@ via l'annuaire central `serveur_openldap`, grâce à **SSSD** (NSS + PAM).
|
|||
- `libpam-sss` active automatiquement le module PAM `sss`.
|
||||
|
||||
## Effet
|
||||
Après ce rôle, les comptes de l'annuaire Chezlepro peuvent se connecter à l'hôte
|
||||
Après ce rôle, les comptes de l'annuaire interne peuvent se connecter à l'hôte
|
||||
(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 |
|
||||
| --- | --- | --- |
|
||||
| `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_uri` | `ldap://idm-01.exemple.internal` | URI de l'annuaire |
|
||||
| `client_ldap_base_dn` | `dc=exemple,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) |
|
||||
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ automatiquement.
|
|||
|
||||
## « Chaque hôte authentifiable »
|
||||
Après ce rôle, l'hôte possède une **identité machine** vérifiable : un certificat émis
|
||||
par l'AC Chezlepro, renouvelé sans intervention. Les services peuvent l'utiliser pour
|
||||
par l'AC interne, renouvelé sans intervention. Les services peuvent l'utiliser pour
|
||||
du TLS / mTLS interne.
|
||||
|
||||
## Secrets requis (Vault)
|
||||
|
|
@ -27,8 +27,8 @@ L'empreinte racine s'obtient sur l'AC (`step certificate fingerprint <root_ca.cr
|
|||
## Variables principales
|
||||
| Variable | Défaut | Rôle |
|
||||
| --- | --- | --- |
|
||||
| `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_ca_url` | `https://infra-pki-01.exemple.internal:8443` | URL de l'AC |
|
||||
| `client_pki_provisioner` | `admin@exemple.internal` | Provisioner émetteur |
|
||||
| `client_pki_nom_cert` | FQDN de l'hôte | Nom du certificat |
|
||||
|
||||
## Notes / sécurité
|
||||
|
|
|
|||
|
|
@ -16,9 +16,9 @@ Tout courrier émis localement (`mail`, cron, scripts) est relayé vers `serveur
|
|||
## Variables
|
||||
| Variable | Défaut | Rôle |
|
||||
| --- | --- | --- |
|
||||
| `client_smtp_relais` | `infra-mail-01.chezlepro.internal` | MTA relais |
|
||||
| `client_smtp_relais` | `infra-mail-01.exemple.internal` | MTA relais |
|
||||
| `client_smtp_port` | `25` | Port du relais |
|
||||
| `client_smtp_from` | `<hostname>@chezlepro.internal` | Expéditeur par défaut |
|
||||
| `client_smtp_from` | `<hostname>@exemple.internal` | Expéditeur par défaut |
|
||||
| `client_smtp_tls` | `false` | TLS (→ `true` avec certificats step_ca) |
|
||||
|
||||
## Notes / limites
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
- cloud-guest-utils
|
||||
state: present
|
||||
|
||||
- name: Déployer la configuration cloud-init Chezlepro
|
||||
- name: Déployer la configuration cloud-init Set-OPS
|
||||
ansible.builtin.template:
|
||||
src: 99_setops.cfg.j2
|
||||
dest: /etc/cloud/cloud.cfg.d/99_setops.cfg
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
group: root
|
||||
mode: "0755"
|
||||
|
||||
- name: Déployer la jail SSH Chezlepro
|
||||
- name: Déployer la jail SSH Set-OPS
|
||||
ansible.builtin.template:
|
||||
src: sshd-setops.local.j2
|
||||
dest: /etc/fail2ban/jail.d/sshd-setops.local
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
group: root
|
||||
mode: "0755"
|
||||
|
||||
- name: Déployer la configuration journald Chezlepro
|
||||
- name: Déployer la configuration journald Set-OPS
|
||||
ansible.builtin.template:
|
||||
src: 99-setops.conf.j2
|
||||
dest: /etc/systemd/journald.conf.d/99-setops.conf
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
- name: Déployer le MOTD Chezlepro
|
||||
- name: Déployer le MOTD Set-OPS
|
||||
ansible.builtin.template:
|
||||
src: motd.j2
|
||||
dest: /etc/motd
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
Système Chezlepro
|
||||
Système {{ domaine_interne | default('Set-OPS') }}
|
||||
Gestion : Set-OPS / Ansible
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
name: nftables
|
||||
state: present
|
||||
|
||||
- name: Déployer la configuration nftables Chezlepro
|
||||
- name: Déployer la configuration nftables Set-OPS
|
||||
ansible.builtin.template:
|
||||
src: nftables.conf.j2
|
||||
dest: /etc/nftables.conf
|
||||
|
|
|
|||
|
|
@ -21,8 +21,8 @@ vault_bd_forgejo: "..." # mot de passe BD (partage avec serveur_postgresql)
|
|||
| Variable | Défaut | Rôle |
|
||||
| --- | --- | --- |
|
||||
| `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 |
|
||||
| `serveur_forgejo_hostname` | `forge.exemple.internal` | Domaine (via nginx) |
|
||||
| `serveur_forgejo_db_host` | `10.0.13.11` | data-01 |
|
||||
|
||||
## Notes / limites
|
||||
- **Version** à confirmer sur forgejo.org/download ; l'URL suit le motif officiel des releases.
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ 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
|
||||
serveur_forgejo_db_host: "10.0.13.11" # data-01
|
||||
|
||||
# Relais courriel.
|
||||
serveur_forgejo_smtp: "infra-mail-01.{{ domaine_interne }}"
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
; Gere par Set-OPS (role serveur_forgejo). Ne pas editer a la main.
|
||||
APP_NAME = Forgejo Chezlepro
|
||||
APP_NAME = Forgejo
|
||||
RUN_USER = {{ serveur_forgejo_utilisateur }}
|
||||
RUN_MODE = prod
|
||||
WORK_PATH = {{ serveur_forgejo_data }}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ au-dessus de Prometheus (métriques) et Loki (journaux).
|
|||
- Inscriptions publiques désactivées.
|
||||
|
||||
## Publication
|
||||
- Derrière `serveur_nginx` (TLS à l'edge) ; `GF_SERVER_ROOT_URL=https://grafana.chezlepro.internal/`.
|
||||
- Derrière `serveur_nginx` (TLS à l'edge) ; `GF_SERVER_ROOT_URL=https://grafana.exemple.internal/`.
|
||||
- Le site nginx se déclare côté `serveur_nginx`.
|
||||
|
||||
## Secret requis (Vault)
|
||||
|
|
@ -21,7 +21,7 @@ serveur_grafana_admin_password: "{{ vault_grafana_admin }}"
|
|||
## Variables principales
|
||||
| Variable | Défaut | Rôle |
|
||||
| --- | --- | --- |
|
||||
| `serveur_grafana_hostname` | `grafana.chezlepro.internal` | Domaine |
|
||||
| `serveur_grafana_hostname` | `grafana.exemple.internal` | Domaine |
|
||||
| `serveur_grafana_prometheus_url` | `http://localhost:9090` | Datasource Prometheus |
|
||||
| `serveur_grafana_loki_url` | `http://localhost:3100` | Datasource Loki |
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ serveur_icinga_depot_source: >-
|
|||
|
||||
# Base Icinga DB : resolue depuis le registre par le groupe consommateur.
|
||||
serveur_icinga_groupe: "serveur_icinga"
|
||||
serveur_icinga_db_host: "10.1.13.11" # data-01 (serveur_postgresql)
|
||||
serveur_icinga_db_host: "10.0.13.11" # data-01 (serveur_postgresql)
|
||||
|
||||
# Redis dedie a Icinga DB (paquet icingadb-redis).
|
||||
serveur_icinga_redis_host: "localhost"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# serveur_keycloak
|
||||
|
||||
SSO / IAM **Keycloak** (distribution Quarkus) — hub d'authentification centralisée
|
||||
(OIDC/SAML) pour les services Chezlepro.
|
||||
(OIDC/SAML) pour les services internes.
|
||||
|
||||
## Rôle
|
||||
- Installe un JRE, télécharge et extrait la distribution Keycloak dans `/opt/keycloak`.
|
||||
|
|
@ -27,8 +27,8 @@ vault_bd_keycloak: "..." # mot de passe
|
|||
| Variable | Défaut | Rôle |
|
||||
| --- | --- | --- |
|
||||
| `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_hostname` | `keycloak.exemple.internal` | Hostname public (via nginx) |
|
||||
| `serveur_keycloak_db_host` | `10.0.13.11` | IP de data-01 (serveur_postgresql) |
|
||||
| `serveur_keycloak_admin_user` | `admin` | Admin bootstrap |
|
||||
|
||||
## Notes / limites
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ serveur_keycloak_hostname: "keycloak.{{ domaine_interne }}"
|
|||
# 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"
|
||||
serveur_keycloak_db_host: "10.0.13.11"
|
||||
|
||||
# Secrets (Ansible Vault) — obligatoires.
|
||||
serveur_keycloak_admin_user: "admin"
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ Installe et configure nginx comme **edge** interne : reverse proxy et terminaiso
|
|||
|
||||
## 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).
|
||||
- Durcissement de base via `conf.d/99-setops.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`).
|
||||
|
||||
|
|
@ -27,8 +27,8 @@ Installe et configure nginx comme **edge** interne : reverse proxy et terminaiso
|
|||
```yaml
|
||||
serveur_nginx_sites:
|
||||
- nom: forge
|
||||
domaine: forge.chezlepro.internal
|
||||
amont: "http://10.1.15.11:3000"
|
||||
domaine: forge.exemple.internal
|
||||
amont: "http://10.0.15.11:3000"
|
||||
# certificat / cle optionnels (sinon snakeoil)
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ serveur_nginx_desactiver_defaut: false # retirer le site Debian par defaut
|
|||
serveur_nginx_sites: []
|
||||
# - nom: forge
|
||||
# domaine: forge.{{ domaine_interne }}
|
||||
# amont: "http://10.1.15.11:3000"
|
||||
# amont: "http://10.0.15.11:3000"
|
||||
# certificat: "/etc/ssl/.../forge.pem" # optionnel, sinon snakeoil
|
||||
# cle: "/etc/ssl/.../forge.key"
|
||||
|
||||
|
|
|
|||
|
|
@ -10,8 +10,8 @@ et fédération applicative (Keycloak).
|
|||
- Crée les unités organisationnelles de base (`ou=people`, `ou=groups`).
|
||||
|
||||
## Identité
|
||||
- Domaine `chezlepro.internal` → base DN **`dc=chezlepro,dc=internal`** (dérivée).
|
||||
- Admin : `cn=admin,dc=chezlepro,dc=internal`.
|
||||
- Domaine `exemple.internal` → base DN **`dc=exemple,dc=internal`** (dérivée).
|
||||
- Admin : `cn=admin,dc=exemple,dc=internal`.
|
||||
|
||||
## Secret requis (Vault)
|
||||
```yaml
|
||||
|
|
@ -23,8 +23,8 @@ refuse de s'exécuter (assertion explicite).
|
|||
## Variables principales
|
||||
| Variable | Défaut | Rôle |
|
||||
| --- | --- | --- |
|
||||
| `serveur_openldap_domaine` | `chezlepro.internal` | Domaine → base DN |
|
||||
| `serveur_openldap_organisation` | `Chezlepro Inc` | Organisation |
|
||||
| `serveur_openldap_domaine` | `exemple.internal` | Domaine → base DN |
|
||||
| `serveur_openldap_organisation` | `Exemple Inc` | Organisation |
|
||||
| `serveur_openldap_ou` | `[people, groups]` | OU de base créées |
|
||||
|
||||
## Notes / limites
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ serveur_openldap_service: "slapd"
|
|||
|
||||
# Identite de l'annuaire.
|
||||
serveur_openldap_domaine: "{{ domaine_interne }}"
|
||||
serveur_openldap_organisation: "Chezlepro Inc"
|
||||
serveur_openldap_organisation: "Exemple Inc"
|
||||
# Base DN derivee du domaine interne (ex. acme.local -> dc=acme,dc=local).
|
||||
serveur_openldap_base_dn: "dc={{ serveur_openldap_domaine.split('.') | join(',dc=') }}"
|
||||
serveur_openldap_admin_dn: "cn=admin,{{ serveur_openldap_base_dn }}"
|
||||
|
|
|
|||
|
|
@ -5,14 +5,14 @@ Installe et configure PostgreSQL (paquet Debian 13) comme base relationnelle par
|
|||
## Rôle
|
||||
- Installe `postgresql`, `postgresql-contrib` et `python3-psycopg2`.
|
||||
- Détecte le cluster installé par Debian (`/etc/postgresql/<version>/main`).
|
||||
- Configure via un fichier `conf.d/99-chezlepro.conf` : `listen_addresses`, `port`, `password_encryption`.
|
||||
- Configure via un fichier `conf.d/99-setops.conf` : `listen_addresses`, `port`, `password_encryption`.
|
||||
- Gère `pg_hba.conf` : socket local en `peer` (administration), boucle locale et **réseaux internes autorisés** en `scram-sha-256`.
|
||||
- Active et démarre le service.
|
||||
- Provisionne optionnellement comptes et bases applicatifs (vides par défaut).
|
||||
|
||||
## Réseau et sécurité
|
||||
- Écoute par défaut sur `127.0.0.1` et l'IP interne de l'hôte (`ansible_host`).
|
||||
- `serveur_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.0.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.
|
||||
|
||||
|
|
@ -22,7 +22,7 @@ Installe et configure PostgreSQL (paquet Debian 13) comme base relationnelle par
|
|||
| `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_reseaux_autorises` | `["10.0.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) |
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ serveur_postgresql_ecoute:
|
|||
- "127.0.0.1"
|
||||
- "{{ ansible_host | default(ansible_default_ipv4.address, true) }}"
|
||||
serveur_postgresql_reseaux_autorises:
|
||||
- "10.1.0.0/16"
|
||||
- "10.0.0.0/16"
|
||||
serveur_postgresql_methode_auth: "scram-sha-256"
|
||||
|
||||
# Reglages additionnels (vide => valeurs par defaut de Debian).
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
group: postgres
|
||||
mode: "0755"
|
||||
|
||||
- name: Deployer la configuration Chezlepro
|
||||
- name: Deployer la configuration Set-OPS
|
||||
ansible.builtin.template:
|
||||
src: 99-setops.conf.j2
|
||||
dest: "{{ serveur_postgresql_conf_dir }}/conf.d/99-setops.conf"
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ PostgreSQL.
|
|||
|
||||
## Rôle
|
||||
- Installe `redis-server`.
|
||||
- Déploie une **surcharge** `/etc/redis/chezlepro.conf` (incluse en fin de `redis.conf`,
|
||||
- Déploie une **surcharge** `/etc/redis/setops.conf` (incluse en fin de `redis.conf`,
|
||||
donc prioritaire) : écoute, `requirepass`, `maxmemory` + politique d'éviction.
|
||||
- N'écrase pas le `redis.conf` du paquet (approche non destructive par `include`).
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
update_cache: true
|
||||
cache_valid_time: 3600
|
||||
|
||||
- name: Deployer la surcharge de configuration Chezlepro
|
||||
- name: Deployer la surcharge de configuration Set-OPS
|
||||
ansible.builtin.template:
|
||||
src: setops.conf.j2
|
||||
dest: "{{ serveur_redis_config }}"
|
||||
|
|
|
|||
|
|
@ -11,15 +11,15 @@ Relais SMTP sortant interne. **Implémenté avec Postfix** (fournit l'interface
|
|||
|
||||
## Sécurité
|
||||
- `smtpd_relay_restrictions = permit_mynetworks, reject_unauth_destination` → pas de relais ouvert.
|
||||
- `mynetworks` par défaut : boucle locale + `10.1.0.0/16`.
|
||||
- `mynetworks` par défaut : boucle locale + `10.0.0.0/16`.
|
||||
- N'héberge pas de boîtes (`mydestination` ne contient pas le domaine) : remise relayée.
|
||||
- TLS opportuniste (`may`), certificat snakeoil par défaut.
|
||||
|
||||
## Variables principales
|
||||
| Variable | Défaut | Rôle |
|
||||
| --- | --- | --- |
|
||||
| `serveur_sendmail_domaine` | `chezlepro.internal` | `mydomain` / mailname |
|
||||
| `serveur_sendmail_reseaux_autorises` | boucle + `10.1.0.0/16` | `mynetworks` (qui peut relayer) |
|
||||
| `serveur_sendmail_domaine` | `exemple.internal` | `mydomain` / mailname |
|
||||
| `serveur_sendmail_reseaux_autorises` | boucle + `10.0.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 |
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ serveur_sendmail_nom_hote: "{{ ansible_fqdn | default(ansible_hostname) }}"
|
|||
serveur_sendmail_reseaux_autorises:
|
||||
- "127.0.0.0/8"
|
||||
- "[::1]/128"
|
||||
- "10.1.0.0/16"
|
||||
- "10.0.0.0/16"
|
||||
|
||||
# Smarthost amont optionnel. Vide => remise directe (MX).
|
||||
serveur_sendmail_smarthost: "" # ex. "[smtp.exemple.com]:587"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# serveur_step_ca
|
||||
|
||||
Autorité de certification interne **Smallstep step-ca** avec provisioner **ACME**,
|
||||
pour émettre les certificats internes de Chezlepro (`client_pki` est le client ACME).
|
||||
pour émettre les certificats internes (`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`.
|
||||
|
|
@ -24,10 +24,10 @@ les variables en clair référençant ces secrets dans `.../serveur_step_ca/main
|
|||
## Variables principales
|
||||
| Variable | Défaut | Rôle |
|
||||
| --- | --- | --- |
|
||||
| `serveur_step_ca_nom` | `Chezlepro Internal CA` | Nom de l'AC |
|
||||
| `serveur_step_ca_nom` | `Set-OPS 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_provisioner` | `admin@exemple.internal` | Provisioner JWK admin |
|
||||
| `serveur_step_ca_acme` | `true` | Ajoute un provisioner ACME |
|
||||
|
||||
## Notes
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ 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_nom: "Set-OPS 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@{{ domaine_interne }}"
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
group: root
|
||||
mode: "0755"
|
||||
|
||||
- name: Déployer la configuration SSH Chezlepro
|
||||
- name: Déployer la configuration SSH Set-OPS
|
||||
ansible.builtin.template:
|
||||
src: 10-setops.conf.j2
|
||||
dest: /etc/ssh/sshd_config.d/10-setops.conf
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# web
|
||||
|
||||
Couche applicative web Chezlepro, distincte de l'edge `serveur_nginx`.
|
||||
Couche applicative web, distincte de l'edge `serveur_nginx`.
|
||||
|
||||
- frontaux : présentation web (UI, rendu, assets), groupe `serveur_web_frontal` ;
|
||||
- dorsaux : application web (API, traitement), groupe `serveur_web_dorsal`.
|
||||
|
|
|
|||
|
|
@ -1041,7 +1041,7 @@ HTML = r"""<!doctype html>
|
|||
<label class="champ"><span>Hôte (VM)</span><select onchange="definirApplication(${i}, 'hote', this.value)">${optHote(a.hote)}</select></label>
|
||||
<label class="champ"><span>Port</span><input type="number" value="${echapper(a.port)}" placeholder="3000" oninput="definirApplication(${i}, 'port', this.value)"></label>
|
||||
<label class="champ"><span>Requiert (applis)</span><input value="${echapper(a.requiert)}" placeholder="pg-principal, …" oninput="definirApplication(${i}, 'requiert', this.value)"></label>
|
||||
<label class="champ"><span>Expose (FQDN)</span><input value="${echapper(a.expose)}" placeholder="forge.alliance-boreale.ca" oninput="definirApplication(${i}, 'expose', this.value)"></label>
|
||||
<label class="champ"><span>Expose (FQDN)</span><input value="${echapper(a.expose)}" placeholder="forge.exemple.ca" oninput="definirApplication(${i}, 'expose', this.value)"></label>
|
||||
<button type="button" class="danger" title="Retirer" onclick="retirerApplication(${i})">✕</button>
|
||||
<div class="dsn">${resume}</div>
|
||||
</div>`;
|
||||
|
|
@ -1108,8 +1108,8 @@ HTML = r"""<!doctype html>
|
|||
<label class="champ"><span>Serveur (fonction-NN)</span><input value="${echapper(s.nom)}" placeholder="web-frontal-03" oninput="definirServeur(${i}, 'nom', this.value)"></label>
|
||||
<label class="champ"><span>Fonction</span><select onchange="definirServeur(${i}, 'fonction', this.value)">${optFonction(s.fonction)}</select></label>
|
||||
<label class="champ"><span>État</span><select onchange="definirServeur(${i}, 'etat', this.value)">${optEtat(s.etat)}</select></label>
|
||||
<label class="champ"><span>Nœud</span><input value="${echapper(s.noeud)}" placeholder="asgard" oninput="definirServeur(${i}, 'noeud', this.value)"></label>
|
||||
<label class="champ"><span>Stockage</span><input value="${echapper(s.stockage)}" placeholder="TrueNAS" oninput="definirServeur(${i}, 'stockage', this.value)"></label>
|
||||
<label class="champ"><span>Nœud</span><input value="${echapper(s.noeud)}" placeholder="noeud-1" oninput="definirServeur(${i}, 'noeud', this.value)"></label>
|
||||
<label class="champ"><span>Stockage</span><input value="${echapper(s.stockage)}" placeholder="stockage-1" oninput="definirServeur(${i}, 'stockage', this.value)"></label>
|
||||
<label class="champ"><span>Disque</span><input value="${echapper(s.disque)}" placeholder="16G" oninput="definirServeur(${i}, 'disque', this.value)"></label>
|
||||
<label class="champ"><span>Mémoire</span><input type="number" value="${echapper(s.memoire)}" placeholder="2048" oninput="definirServeur(${i}, 'memoire', this.value)"></label>
|
||||
<label class="champ"><span>Cœurs</span><input type="number" value="${echapper(s.coeurs)}" placeholder="2" oninput="definirServeur(${i}, 'coeurs', this.value)"></label>
|
||||
|
|
|
|||
|
|
@ -20,26 +20,26 @@ def _inventaire_factice() -> dict:
|
|||
"children": {
|
||||
"hotes_planifies": {
|
||||
"hosts": {
|
||||
"data-01": {
|
||||
"ansible_host": "10.1.13.11",
|
||||
"app-01": {
|
||||
"ansible_host": "10.0.2.11",
|
||||
"ansible_user": "ansible",
|
||||
"proxmox_cidr": 24,
|
||||
"proxmox_coeurs": 4,
|
||||
"proxmox_disque_taille": "160G",
|
||||
"proxmox_memoire": 2048,
|
||||
"proxmox_noeud": "asgard",
|
||||
"proxmox_passerelle": "10.1.13.1",
|
||||
"proxmox_stockage": "TrueNAS",
|
||||
"proxmox_noeud": "noeud-a",
|
||||
"proxmox_passerelle": "10.0.2.1",
|
||||
"proxmox_stockage": "stockage-a",
|
||||
"proxmox_vlan": 13,
|
||||
"proxmox_vmid": 93101,
|
||||
},
|
||||
# collab-01 : sans proxmox_noeud (champ optionnel).
|
||||
"collab-01": {
|
||||
"ansible_host": "10.1.15.21",
|
||||
# app-02 : sans proxmox_noeud (champ optionnel).
|
||||
"app-02": {
|
||||
"ansible_host": "10.0.2.21",
|
||||
"proxmox_cidr": 24,
|
||||
"proxmox_disque_taille": "16G",
|
||||
"proxmox_passerelle": "10.1.15.1",
|
||||
"proxmox_stockage": "TrueNAS",
|
||||
"proxmox_passerelle": "10.0.2.1",
|
||||
"proxmox_stockage": "stockage-a",
|
||||
"proxmox_vlan": 15,
|
||||
"proxmox_vmid": 95201,
|
||||
},
|
||||
|
|
@ -47,34 +47,34 @@ def _inventaire_factice() -> dict:
|
|||
"incomplet-01": {
|
||||
"proxmox_vmid": 99901,
|
||||
"proxmox_cidr": 24,
|
||||
"proxmox_passerelle": "10.1.99.1",
|
||||
"proxmox_passerelle": "10.0.2.1",
|
||||
"proxmox_vlan": 99,
|
||||
},
|
||||
}
|
||||
},
|
||||
"serveur_postgresql": {"hosts": {"data-01": {}}},
|
||||
"serveur_postgresql": {"hosts": {"app-01": {}}},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
def test_hote_complet_avec_noeud() -> None:
|
||||
lignes = parametres_proxmox_hote(_inventaire_factice(), "data-01")
|
||||
lignes = parametres_proxmox_hote(_inventaire_factice(), "app-01")
|
||||
attendu = {
|
||||
"SETOPS_VMID='93101'",
|
||||
"SETOPS_IP='10.1.13.11'",
|
||||
"SETOPS_IP='10.0.2.11'",
|
||||
"SETOPS_CIDR='24'",
|
||||
"SETOPS_PASSERELLE='10.1.13.1'",
|
||||
"SETOPS_PASSERELLE='10.0.2.1'",
|
||||
"SETOPS_VLAN='13'",
|
||||
"SETOPS_STOCKAGE='TrueNAS'",
|
||||
"SETOPS_STOCKAGE='stockage-a'",
|
||||
"SETOPS_DISQUE='160G'",
|
||||
"SETOPS_NOEUD='asgard'",
|
||||
"SETOPS_NOEUD='noeud-a'",
|
||||
}
|
||||
assert set(lignes) == attendu, lignes
|
||||
|
||||
|
||||
def test_hote_sans_noeud_emet_noeud_vide() -> None:
|
||||
lignes = parametres_proxmox_hote(_inventaire_factice(), "collab-01")
|
||||
lignes = parametres_proxmox_hote(_inventaire_factice(), "app-02")
|
||||
assert "SETOPS_NOEUD=''" in lignes, lignes
|
||||
assert "SETOPS_VMID='95201'" in lignes, lignes
|
||||
|
||||
|
|
|
|||
Reference in a new issue