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é
|
### 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.
|
- **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.)*
|
- **`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é
|
### 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`.
|
- **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.
|
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
|
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.
|
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' ' Creer une VM (VMID/IP/VLAN/passerelle lus dans le plan):'
|
||||||
@printf '%s\n' ' make creer-vm HOTE=web-frontal-01'
|
@printf '%s\n' ' make creer-vm HOTE=web-frontal-01'
|
||||||
@printf '%s\n' ' Cloner seulement, sans passer par le plan:'
|
@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' ' Configurer Proxmox et le Vault API:'
|
||||||
@printf '%s\n' ' make config'
|
@printf '%s\n' ' make config'
|
||||||
@printf '%s\n' ''
|
@printf '%s\n' ''
|
||||||
|
|
@ -148,7 +148,7 @@ aide:
|
||||||
@printf '%s\n' ''
|
@printf '%s\n' ''
|
||||||
@printf '%s\n' 'Variables frequentes'
|
@printf '%s\n' 'Variables frequentes'
|
||||||
@printf '%s\n' ' HOTE=web-frontal-01 GROUPE=serveur_debian GROUPES="serveur_debian serveur_durci"'
|
@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'
|
@printf '%s\n' ' FICHIER_INVENTAIRE=$(SETOPS_INSTANCE)/inventories/production/hosts.yml FICHIER_DEPENDANCES=docs/dependances-groupes.yml CONFIRMER=true'
|
||||||
|
|
||||||
.PHONY: lint
|
.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**.
|
**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).**
|
> 👉 **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)
|
## 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 :
|
Piliers de l'écosystème :
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# Architecture Set-OPS
|
# 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`)
|
pilote par un **plan** : l'inventaire Ansible (`instance/inventories/production/hosts.yml`)
|
||||||
est **généré** depuis le plan, pas édité à la main.
|
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
|
## Cycle de vie VM
|
||||||
|
|
||||||
Le cycle de vie des VM Chezlepro est documenté dans :
|
Le cycle de vie des VM est documenté dans :
|
||||||
|
|
||||||
```text
|
```text
|
||||||
docs/vm-lifecycle.md
|
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.
|
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.
|
Le service DNS interne est la premiere capacite de plateforme.
|
||||||
|
|
||||||
|
|
@ -16,7 +16,7 @@ client_dns -> integration cliente DNS
|
||||||
La zone initiale est :
|
La zone initiale est :
|
||||||
|
|
||||||
```text
|
```text
|
||||||
chezlepro.internal
|
exemple.internal
|
||||||
```
|
```
|
||||||
|
|
||||||
Elle est definie dans :
|
Elle est definie dans :
|
||||||
|
|
@ -39,8 +39,8 @@ ansible_host defini
|
||||||
Exemple :
|
Exemple :
|
||||||
|
|
||||||
```text
|
```text
|
||||||
web-frontal-01 ansible_host=10.1.15.31
|
web-frontal-01 ansible_host=10.0.2.31
|
||||||
-> web-frontal-01.chezlepro.internal A 10.1.15.31
|
-> web-frontal-01.exemple.internal A 10.0.2.31
|
||||||
```
|
```
|
||||||
|
|
||||||
Les enregistrements additionnels explicites sont dans `serveur_powerdns_records`.
|
Les enregistrements additionnels explicites sont dans `serveur_powerdns_records`.
|
||||||
|
|
@ -83,8 +83,8 @@ Les premiers checks utiles :
|
||||||
|
|
||||||
- service `pdns` actif ;
|
- service `pdns` actif ;
|
||||||
- port UDP/TCP 53 disponible ;
|
- port UDP/TCP 53 disponible ;
|
||||||
- SOA de `chezlepro.internal` resoluble ;
|
- SOA de `exemple.internal` resoluble ;
|
||||||
- enregistrement `ns1.chezlepro.internal` resoluble ;
|
- enregistrement `ns1.exemple.internal` resoluble ;
|
||||||
- enregistrements des hotes actifs presents ;
|
- enregistrements des hotes actifs presents ;
|
||||||
- serial de zone attendu ;
|
- serial de zone attendu ;
|
||||||
- latence de resolution.
|
- latence de resolution.
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
## Objet
|
## 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.
|
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
|
### 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.
|
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 :
|
Vérifications utiles depuis le poste Ansible :
|
||||||
|
|
||||||
```bash
|
```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 ping
|
||||||
ansible -i instance/inventories/lab/hosts.yml modeles_vm -m setup
|
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. |
|
| `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. |
|
| `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. |
|
| `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. |
|
| `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. |
|
| `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. |
|
| `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
|
## 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 |
|
| Catégorie | VLAN | Sous-réseau | Passerelle |
|
||||||
| --- | --- | --- | --- |
|
| --- | --- | --- | --- |
|
||||||
| 1 — Fondations / infra | 11 | `10.1.11.0/24` | `10.1.11.1` |
|
| 1 — Fondations / infra | 11 | `10.0.11.0/24` | `10.0.11.1` |
|
||||||
| 2 — Identité | 12 | `10.1.12.0/24` | `10.1.12.1` |
|
| 2 — Identité | 12 | `10.0.12.0/24` | `10.0.12.1` |
|
||||||
| 3 — Données | 13 | `10.1.13.0/24` | `10.1.13.1` |
|
| 3 — Données | 13 | `10.0.13.0/24` | `10.0.13.1` |
|
||||||
| 4 — Observabilité | 14 | `10.1.14.0/24` | `10.1.14.1` |
|
| 4 — Observabilité | 14 | `10.0.14.0/24` | `10.0.14.1` |
|
||||||
| 5 — Applications | 15 | `10.1.15.0/24` | `10.1.15.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`** :
|
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>
|
hostname = <fonction>-<NN>
|
||||||
VMID = 9 · catégorie · service · NN
|
VMID = 9 · catégorie · service · NN
|
||||||
VLAN = catégorie.vlan
|
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.
|
`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`.
|
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
|
## 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
|
### Dérivations clés
|
||||||
- **Nommage/adressage** : tout part de la `fonction` de l'hôte (`web-frontal-03`).
|
- **Nommage/adressage** : tout part de la `fonction` de l'hôte (`web-frontal-03`).
|
||||||
`VMID = 9·catégorie·service·NN`, `VLAN = catégorie.vlan`,
|
`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>`.
|
- **DSN** (lien application↔base) : `<type>://<proprietaire>:<secret>@<hôte>:<port>/<base>`.
|
||||||
Une application reçoit les bases où `(portee=application ET consommateur=elle)`
|
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)`.
|
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
|
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
|
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
|
Le moteur localise l'instance via **`SETOPS_INSTANCE`** (défaut : `instance`). Deux
|
||||||
modèles :
|
modèles :
|
||||||
|
|
||||||
- **Modèle A — dépôts frères** (en cours) : moteur et instance côte à côte ; un
|
- **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.
|
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
|
- **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.
|
une version du moteur ; `SETOPS_INSTANCE` pointe la racine de l'instance.
|
||||||
|
|
@ -172,7 +172,7 @@ Pour brancher une instance (modèle A) :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd Set-OPS
|
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
|
make inventaire-verifier # lit l'instance via le symlink
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ docs/modeles_vm/debian13-proxmox.md
|
||||||
|
|
||||||
## 1. Objectif du modèle
|
## 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 :
|
Objectifs :
|
||||||
|
|
||||||
|
|
@ -92,13 +92,13 @@ Discard : selon stockage, seulement si pertinent
|
||||||
SSD emulation : oui si le stockage est réellement SSD/NVMe
|
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
|
```text
|
||||||
SCSI via VirtIO SCSI single
|
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
|
### Taille du disque
|
||||||
|
|
||||||
|
|
@ -202,7 +202,7 @@ LVM
|
||||||
Le stockage réel contient déjà plusieurs couches :
|
Le stockage réel contient déjà plusieurs couches :
|
||||||
|
|
||||||
```text
|
```text
|
||||||
TrueNAS ZFS
|
stockage ZFS
|
||||||
→ zvol iSCSI
|
→ zvol iSCSI
|
||||||
→ Proxmox
|
→ Proxmox
|
||||||
→ disque virtuel
|
→ disque virtuel
|
||||||
|
|
@ -495,8 +495,8 @@ Exemple IP statique temporaire pour joindre la VM de modèle :
|
||||||
```bash
|
```bash
|
||||||
qm set 9000 --ciuser ansible
|
qm set 9000 --ciuser ansible
|
||||||
qm set 9000 --sshkeys ~/.ssh/id_ed25519.pub
|
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 --ipconfig0 ip=10.0.99.99/24,gw=10.0.99.1
|
||||||
qm set 9000 --nameserver 10.1.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.
|
Pour les clones, ces valeurs seront remplacées par l'identité réelle du serveur.
|
||||||
|
|
@ -561,7 +561,7 @@ reboot
|
||||||
|
|
||||||
## 19. SSH durci attendu
|
## 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`.
|
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 :
|
Après le premier démarrage, tester l'accès :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ssh ansible@10.1.15.31
|
ssh ansible@10.0.15.31
|
||||||
```
|
```
|
||||||
|
|
||||||
Ensuite appliquer la conformité Ansible :
|
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
|
## Vue d'ensemble
|
||||||
|
|
||||||
|
|
@ -35,7 +35,7 @@ aucun rôle applicatif
|
||||||
aucun secret
|
aucun secret
|
||||||
```
|
```
|
||||||
|
|
||||||
Cette VM n'est pas encore un golden template Chezlepro.
|
Cette VM n'est pas encore un golden template.
|
||||||
|
|
||||||
## 2. Goldenisation
|
## 2. Goldenisation
|
||||||
|
|
||||||
|
|
@ -45,7 +45,7 @@ La goldenisation est faite par :
|
||||||
make preparer-modele
|
make preparer-modele
|
||||||
```
|
```
|
||||||
|
|
||||||
Ce playbook ajoute le socle Chezlepro commun au template :
|
Ce playbook ajoute le socle commun au template :
|
||||||
|
|
||||||
```text
|
```text
|
||||||
paquets communs
|
paquets communs
|
||||||
|
|
|
||||||
|
|
@ -12,5 +12,5 @@
|
||||||
domaine_interne: "acme.internal"
|
domaine_interne: "acme.internal"
|
||||||
|
|
||||||
# Le reste de l'identite vit dans le PLAN de l'instance :
|
# 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
|
# - 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
|
hosts: modeles_vm
|
||||||
become: true
|
become: true
|
||||||
gather_facts: 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
|
hosts: modeles_vm
|
||||||
become: true
|
become: true
|
||||||
gather_facts: true
|
gather_facts: true
|
||||||
|
|
|
||||||
|
|
@ -57,8 +57,8 @@ make creer-vm \
|
||||||
HOTE=web-frontal-01 \
|
HOTE=web-frontal-01 \
|
||||||
VMID=95301 \
|
VMID=95301 \
|
||||||
VLAN=15 \
|
VLAN=15 \
|
||||||
ADRESSE_IP=10.1.15.31 \
|
ADRESSE_IP=10.0.15.31 \
|
||||||
PASSERELLE=10.1.15.1 \
|
PASSERELLE=10.0.15.1 \
|
||||||
GROUPES="serveur_debian serveur_durci"
|
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 :
|
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
|
```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.
|
Proxmox ne permet pas de réduire un disque existant.
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
# applications
|
# applications
|
||||||
|
|
||||||
Rôles applications : services applicatifs Chezlepro.
|
Rôles applications : services applicatifs internes.
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
- audispd-plugins
|
- audispd-plugins
|
||||||
state: present
|
state: present
|
||||||
|
|
||||||
- name: Déployer les règles auditd Chezlepro
|
- name: Déployer les règles auditd Set-OPS
|
||||||
ansible.builtin.template:
|
ansible.builtin.template:
|
||||||
src: 99-setops.rules.j2
|
src: 99-setops.rules.j2
|
||||||
dest: /etc/audit/rules.d/99-setops.rules
|
dest: /etc/audit/rules.d/99-setops.rules
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ visible dans Grafana (datasource Loki).
|
||||||
## Variables
|
## Variables
|
||||||
| Variable | Défaut | Rôle |
|
| 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
|
## Notes / limites
|
||||||
- La **syntaxe de configuration Alloy évolue** entre versions ; la config fournie
|
- 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"
|
client_journal_config: "/etc/alloy/config.alloy"
|
||||||
|
|
||||||
# Point de collecte Loki (obs-01, serveur_loki, VLAN 14).
|
# 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).
|
# 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_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`.
|
- `libpam-sss` active automatiquement le module PAM `sss`.
|
||||||
|
|
||||||
## Effet
|
## 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`
|
(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.
|
(identité machine), l'écosystème a une authentification **machines + utilisateurs** centralisée.
|
||||||
|
|
||||||
## Variables principales
|
## Variables principales
|
||||||
| Variable | Défaut | Rôle |
|
| Variable | Défaut | Rôle |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `client_ldap_uri` | `ldap://idm-01.chezlepro.internal` | URI de l'annuaire |
|
| `client_ldap_uri` | `ldap://idm-01.exemple.internal` | URI de l'annuaire |
|
||||||
| `client_ldap_base_dn` | `dc=chezlepro,dc=internal` | Base de recherche |
|
| `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_bind_dn` | `""` (anonyme) | Compte de lecture (optionnel, mdp via Vault) |
|
||||||
| `client_ldap_tls_reqcert` | `never` | Validation TLS (→ `demand` avec LDAPS) |
|
| `client_ldap_tls_reqcert` | `never` | Validation TLS (→ `demand` avec LDAPS) |
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ automatiquement.
|
||||||
|
|
||||||
## « Chaque hôte authentifiable »
|
## « Chaque hôte authentifiable »
|
||||||
Après ce rôle, l'hôte possède une **identité machine** vérifiable : un certificat émis
|
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.
|
du TLS / mTLS interne.
|
||||||
|
|
||||||
## Secrets requis (Vault)
|
## Secrets requis (Vault)
|
||||||
|
|
@ -27,8 +27,8 @@ L'empreinte racine s'obtient sur l'AC (`step certificate fingerprint <root_ca.cr
|
||||||
## Variables principales
|
## Variables principales
|
||||||
| Variable | Défaut | Rôle |
|
| Variable | Défaut | Rôle |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `client_pki_ca_url` | `https://infra-pki-01.chezlepro.internal:8443` | URL de l'AC |
|
| `client_pki_ca_url` | `https://infra-pki-01.exemple.internal:8443` | URL de l'AC |
|
||||||
| `client_pki_provisioner` | `admin@chezlepro.internal` | Provisioner émetteur |
|
| `client_pki_provisioner` | `admin@exemple.internal` | Provisioner émetteur |
|
||||||
| `client_pki_nom_cert` | FQDN de l'hôte | Nom du certificat |
|
| `client_pki_nom_cert` | FQDN de l'hôte | Nom du certificat |
|
||||||
|
|
||||||
## Notes / sécurité
|
## Notes / sécurité
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,9 @@ Tout courrier émis localement (`mail`, cron, scripts) est relayé vers `serveur
|
||||||
## Variables
|
## Variables
|
||||||
| Variable | Défaut | Rôle |
|
| 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_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) |
|
| `client_smtp_tls` | `false` | TLS (→ `true` avec certificats step_ca) |
|
||||||
|
|
||||||
## Notes / limites
|
## Notes / limites
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
- cloud-guest-utils
|
- cloud-guest-utils
|
||||||
state: present
|
state: present
|
||||||
|
|
||||||
- name: Déployer la configuration cloud-init Chezlepro
|
- name: Déployer la configuration cloud-init Set-OPS
|
||||||
ansible.builtin.template:
|
ansible.builtin.template:
|
||||||
src: 99_setops.cfg.j2
|
src: 99_setops.cfg.j2
|
||||||
dest: /etc/cloud/cloud.cfg.d/99_setops.cfg
|
dest: /etc/cloud/cloud.cfg.d/99_setops.cfg
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
group: root
|
group: root
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
|
|
||||||
- name: Déployer la jail SSH Chezlepro
|
- name: Déployer la jail SSH Set-OPS
|
||||||
ansible.builtin.template:
|
ansible.builtin.template:
|
||||||
src: sshd-setops.local.j2
|
src: sshd-setops.local.j2
|
||||||
dest: /etc/fail2ban/jail.d/sshd-setops.local
|
dest: /etc/fail2ban/jail.d/sshd-setops.local
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
group: root
|
group: root
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
|
|
||||||
- name: Déployer la configuration journald Chezlepro
|
- name: Déployer la configuration journald Set-OPS
|
||||||
ansible.builtin.template:
|
ansible.builtin.template:
|
||||||
src: 99-setops.conf.j2
|
src: 99-setops.conf.j2
|
||||||
dest: /etc/systemd/journald.conf.d/99-setops.conf
|
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:
|
ansible.builtin.template:
|
||||||
src: motd.j2
|
src: motd.j2
|
||||||
dest: /etc/motd
|
dest: /etc/motd
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,2 @@
|
||||||
Système Chezlepro
|
Système {{ domaine_interne | default('Set-OPS') }}
|
||||||
Gestion : Set-OPS / Ansible
|
Gestion : Set-OPS / Ansible
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name: nftables
|
name: nftables
|
||||||
state: present
|
state: present
|
||||||
|
|
||||||
- name: Déployer la configuration nftables Chezlepro
|
- name: Déployer la configuration nftables Set-OPS
|
||||||
ansible.builtin.template:
|
ansible.builtin.template:
|
||||||
src: nftables.conf.j2
|
src: nftables.conf.j2
|
||||||
dest: /etc/nftables.conf
|
dest: /etc/nftables.conf
|
||||||
|
|
|
||||||
|
|
@ -21,8 +21,8 @@ vault_bd_forgejo: "..." # mot de passe BD (partage avec serveur_postgresql)
|
||||||
| Variable | Défaut | Rôle |
|
| Variable | Défaut | Rôle |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `serveur_forgejo_version` | `10.0.0` | Version (à vérifier/bumper) |
|
| `serveur_forgejo_version` | `10.0.0` | Version (à vérifier/bumper) |
|
||||||
| `serveur_forgejo_hostname` | `forge.chezlepro.internal` | Domaine (via nginx) |
|
| `serveur_forgejo_hostname` | `forge.exemple.internal` | Domaine (via nginx) |
|
||||||
| `serveur_forgejo_db_host` | `10.1.13.11` | data-01 |
|
| `serveur_forgejo_db_host` | `10.0.13.11` | data-01 |
|
||||||
|
|
||||||
## Notes / limites
|
## Notes / limites
|
||||||
- **Version** à confirmer sur forgejo.org/download ; l'URL suit le motif officiel des releases.
|
- **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.
|
# Base de donnees : resolue depuis le registre par le groupe consommateur.
|
||||||
serveur_forgejo_groupe: "serveur_forgejo"
|
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.
|
# Relais courriel.
|
||||||
serveur_forgejo_smtp: "infra-mail-01.{{ domaine_interne }}"
|
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.
|
; 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_USER = {{ serveur_forgejo_utilisateur }}
|
||||||
RUN_MODE = prod
|
RUN_MODE = prod
|
||||||
WORK_PATH = {{ serveur_forgejo_data }}
|
WORK_PATH = {{ serveur_forgejo_data }}
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ au-dessus de Prometheus (métriques) et Loki (journaux).
|
||||||
- Inscriptions publiques désactivées.
|
- Inscriptions publiques désactivées.
|
||||||
|
|
||||||
## Publication
|
## 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`.
|
- Le site nginx se déclare côté `serveur_nginx`.
|
||||||
|
|
||||||
## Secret requis (Vault)
|
## Secret requis (Vault)
|
||||||
|
|
@ -21,7 +21,7 @@ serveur_grafana_admin_password: "{{ vault_grafana_admin }}"
|
||||||
## Variables principales
|
## Variables principales
|
||||||
| Variable | Défaut | Rôle |
|
| 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_prometheus_url` | `http://localhost:9090` | Datasource Prometheus |
|
||||||
| `serveur_grafana_loki_url` | `http://localhost:3100` | Datasource Loki |
|
| `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.
|
# Base Icinga DB : resolue depuis le registre par le groupe consommateur.
|
||||||
serveur_icinga_groupe: "serveur_icinga"
|
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).
|
# Redis dedie a Icinga DB (paquet icingadb-redis).
|
||||||
serveur_icinga_redis_host: "localhost"
|
serveur_icinga_redis_host: "localhost"
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
# serveur_keycloak
|
# serveur_keycloak
|
||||||
|
|
||||||
SSO / IAM **Keycloak** (distribution Quarkus) — hub d'authentification centralisée
|
SSO / IAM **Keycloak** (distribution Quarkus) — hub d'authentification centralisée
|
||||||
(OIDC/SAML) pour les services Chezlepro.
|
(OIDC/SAML) pour les services internes.
|
||||||
|
|
||||||
## Rôle
|
## Rôle
|
||||||
- Installe un JRE, télécharge et extrait la distribution Keycloak dans `/opt/keycloak`.
|
- 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 |
|
| Variable | Défaut | Rôle |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `serveur_keycloak_version` | `26.0.7` | Version (à vérifier/bumper sur keycloak.org/downloads) |
|
| `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_hostname` | `keycloak.exemple.internal` | Hostname public (via nginx) |
|
||||||
| `serveur_keycloak_db_host` | `10.1.13.11` | IP de data-01 (serveur_postgresql) |
|
| `serveur_keycloak_db_host` | `10.0.13.11` | IP de data-01 (serveur_postgresql) |
|
||||||
| `serveur_keycloak_admin_user` | `admin` | Admin bootstrap |
|
| `serveur_keycloak_admin_user` | `admin` | Admin bootstrap |
|
||||||
|
|
||||||
## Notes / limites
|
## Notes / limites
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ serveur_keycloak_hostname: "keycloak.{{ domaine_interne }}"
|
||||||
# Base de donnees : resolue depuis le registre par le groupe consommateur.
|
# Base de donnees : resolue depuis le registre par le groupe consommateur.
|
||||||
serveur_keycloak_groupe: "serveur_keycloak"
|
serveur_keycloak_groupe: "serveur_keycloak"
|
||||||
# IP interne du serveur PostgreSQL (data-01, cf. nomenclature).
|
# 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.
|
# Secrets (Ansible Vault) — obligatoires.
|
||||||
serveur_keycloak_admin_user: "admin"
|
serveur_keycloak_admin_user: "admin"
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ Installe et configure nginx comme **edge** interne : reverse proxy et terminaiso
|
||||||
|
|
||||||
## Rôle
|
## Rôle
|
||||||
- Installe `nginx` et `ssl-cert` (certificat auto-signé).
|
- 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).
|
- 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`).
|
- **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
|
```yaml
|
||||||
serveur_nginx_sites:
|
serveur_nginx_sites:
|
||||||
- nom: forge
|
- nom: forge
|
||||||
domaine: forge.chezlepro.internal
|
domaine: forge.exemple.internal
|
||||||
amont: "http://10.1.15.11:3000"
|
amont: "http://10.0.15.11:3000"
|
||||||
# certificat / cle optionnels (sinon snakeoil)
|
# certificat / cle optionnels (sinon snakeoil)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ serveur_nginx_desactiver_defaut: false # retirer le site Debian par defaut
|
||||||
serveur_nginx_sites: []
|
serveur_nginx_sites: []
|
||||||
# - nom: forge
|
# - nom: forge
|
||||||
# domaine: forge.{{ domaine_interne }}
|
# 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
|
# certificat: "/etc/ssl/.../forge.pem" # optionnel, sinon snakeoil
|
||||||
# cle: "/etc/ssl/.../forge.key"
|
# 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`).
|
- Crée les unités organisationnelles de base (`ou=people`, `ou=groups`).
|
||||||
|
|
||||||
## Identité
|
## Identité
|
||||||
- Domaine `chezlepro.internal` → base DN **`dc=chezlepro,dc=internal`** (dérivée).
|
- Domaine `exemple.internal` → base DN **`dc=exemple,dc=internal`** (dérivée).
|
||||||
- Admin : `cn=admin,dc=chezlepro,dc=internal`.
|
- Admin : `cn=admin,dc=exemple,dc=internal`.
|
||||||
|
|
||||||
## Secret requis (Vault)
|
## Secret requis (Vault)
|
||||||
```yaml
|
```yaml
|
||||||
|
|
@ -23,8 +23,8 @@ refuse de s'exécuter (assertion explicite).
|
||||||
## Variables principales
|
## Variables principales
|
||||||
| Variable | Défaut | Rôle |
|
| Variable | Défaut | Rôle |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `serveur_openldap_domaine` | `chezlepro.internal` | Domaine → base DN |
|
| `serveur_openldap_domaine` | `exemple.internal` | Domaine → base DN |
|
||||||
| `serveur_openldap_organisation` | `Chezlepro Inc` | Organisation |
|
| `serveur_openldap_organisation` | `Exemple Inc` | Organisation |
|
||||||
| `serveur_openldap_ou` | `[people, groups]` | OU de base créées |
|
| `serveur_openldap_ou` | `[people, groups]` | OU de base créées |
|
||||||
|
|
||||||
## Notes / limites
|
## Notes / limites
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ serveur_openldap_service: "slapd"
|
||||||
|
|
||||||
# Identite de l'annuaire.
|
# Identite de l'annuaire.
|
||||||
serveur_openldap_domaine: "{{ domaine_interne }}"
|
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).
|
# 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_base_dn: "dc={{ serveur_openldap_domaine.split('.') | join(',dc=') }}"
|
||||||
serveur_openldap_admin_dn: "cn=admin,{{ serveur_openldap_base_dn }}"
|
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
|
## Rôle
|
||||||
- Installe `postgresql`, `postgresql-contrib` et `python3-psycopg2`.
|
- Installe `postgresql`, `postgresql-contrib` et `python3-psycopg2`.
|
||||||
- Détecte le cluster installé par Debian (`/etc/postgresql/<version>/main`).
|
- 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`.
|
- 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.
|
- Active et démarre le service.
|
||||||
- Provisionne optionnellement comptes et bases applicatifs (vides par défaut).
|
- Provisionne optionnellement comptes et bases applicatifs (vides par défaut).
|
||||||
|
|
||||||
## Réseau et sécurité
|
## Réseau et sécurité
|
||||||
- Écoute par défaut sur `127.0.0.1` et l'IP interne de l'hôte (`ansible_host`).
|
- É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`).
|
- 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.
|
- `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_version` | `""` (auto) | Version majeure du cluster |
|
||||||
| `serveur_postgresql_port` | `5432` | Port d'écoute |
|
| `serveur_postgresql_port` | `5432` | Port d'écoute |
|
||||||
| `serveur_postgresql_ecoute` | `127.0.0.1` + IP interne | `listen_addresses` |
|
| `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_methode_auth` | `scram-sha-256` | Méthode d'authentification |
|
||||||
| `serveur_postgresql_parametres` | `{}` | Réglages additionnels |
|
| `serveur_postgresql_parametres` | `{}` | Réglages additionnels |
|
||||||
| `serveur_postgresql_comptes` | `[]` | Comptes applicatifs (mot de passe via Vault) |
|
| `serveur_postgresql_comptes` | `[]` | Comptes applicatifs (mot de passe via Vault) |
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ serveur_postgresql_ecoute:
|
||||||
- "127.0.0.1"
|
- "127.0.0.1"
|
||||||
- "{{ ansible_host | default(ansible_default_ipv4.address, true) }}"
|
- "{{ ansible_host | default(ansible_default_ipv4.address, true) }}"
|
||||||
serveur_postgresql_reseaux_autorises:
|
serveur_postgresql_reseaux_autorises:
|
||||||
- "10.1.0.0/16"
|
- "10.0.0.0/16"
|
||||||
serveur_postgresql_methode_auth: "scram-sha-256"
|
serveur_postgresql_methode_auth: "scram-sha-256"
|
||||||
|
|
||||||
# Reglages additionnels (vide => valeurs par defaut de Debian).
|
# Reglages additionnels (vide => valeurs par defaut de Debian).
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@
|
||||||
group: postgres
|
group: postgres
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
|
|
||||||
- name: Deployer la configuration Chezlepro
|
- name: Deployer la configuration Set-OPS
|
||||||
ansible.builtin.template:
|
ansible.builtin.template:
|
||||||
src: 99-setops.conf.j2
|
src: 99-setops.conf.j2
|
||||||
dest: "{{ serveur_postgresql_conf_dir }}/conf.d/99-setops.conf"
|
dest: "{{ serveur_postgresql_conf_dir }}/conf.d/99-setops.conf"
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ PostgreSQL.
|
||||||
|
|
||||||
## Rôle
|
## Rôle
|
||||||
- Installe `redis-server`.
|
- 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.
|
donc prioritaire) : écoute, `requirepass`, `maxmemory` + politique d'éviction.
|
||||||
- N'écrase pas le `redis.conf` du paquet (approche non destructive par `include`).
|
- N'écrase pas le `redis.conf` du paquet (approche non destructive par `include`).
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
update_cache: true
|
update_cache: true
|
||||||
cache_valid_time: 3600
|
cache_valid_time: 3600
|
||||||
|
|
||||||
- name: Deployer la surcharge de configuration Chezlepro
|
- name: Deployer la surcharge de configuration Set-OPS
|
||||||
ansible.builtin.template:
|
ansible.builtin.template:
|
||||||
src: setops.conf.j2
|
src: setops.conf.j2
|
||||||
dest: "{{ serveur_redis_config }}"
|
dest: "{{ serveur_redis_config }}"
|
||||||
|
|
|
||||||
|
|
@ -11,15 +11,15 @@ Relais SMTP sortant interne. **Implémenté avec Postfix** (fournit l'interface
|
||||||
|
|
||||||
## Sécurité
|
## Sécurité
|
||||||
- `smtpd_relay_restrictions = permit_mynetworks, reject_unauth_destination` → pas de relais ouvert.
|
- `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.
|
- N'héberge pas de boîtes (`mydestination` ne contient pas le domaine) : remise relayée.
|
||||||
- TLS opportuniste (`may`), certificat snakeoil par défaut.
|
- TLS opportuniste (`may`), certificat snakeoil par défaut.
|
||||||
|
|
||||||
## Variables principales
|
## Variables principales
|
||||||
| Variable | Défaut | Rôle |
|
| Variable | Défaut | Rôle |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `serveur_sendmail_domaine` | `chezlepro.internal` | `mydomain` / mailname |
|
| `serveur_sendmail_domaine` | `exemple.internal` | `mydomain` / mailname |
|
||||||
| `serveur_sendmail_reseaux_autorises` | boucle + `10.1.0.0/16` | `mynetworks` (qui peut relayer) |
|
| `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_smarthost` | `""` | Relais amont (vide = remise directe MX) |
|
||||||
| `serveur_sendmail_inet_interfaces` | `all` | Interfaces d'écoute |
|
| `serveur_sendmail_inet_interfaces` | `all` | Interfaces d'écoute |
|
||||||
| `serveur_sendmail_tls_cert` / `_cle` | snakeoil | Certificat TLS |
|
| `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:
|
serveur_sendmail_reseaux_autorises:
|
||||||
- "127.0.0.0/8"
|
- "127.0.0.0/8"
|
||||||
- "[::1]/128"
|
- "[::1]/128"
|
||||||
- "10.1.0.0/16"
|
- "10.0.0.0/16"
|
||||||
|
|
||||||
# Smarthost amont optionnel. Vide => remise directe (MX).
|
# Smarthost amont optionnel. Vide => remise directe (MX).
|
||||||
serveur_sendmail_smarthost: "" # ex. "[smtp.exemple.com]:587"
|
serveur_sendmail_smarthost: "" # ex. "[smtp.exemple.com]:587"
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
# serveur_step_ca
|
# serveur_step_ca
|
||||||
|
|
||||||
Autorité de certification interne **Smallstep step-ca** avec provisioner **ACME**,
|
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
|
## Rôle
|
||||||
- Ajoute le **dépôt apt officiel Smallstep** (clé + source deb822) et installe `step-ca` + `step-cli`.
|
- 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
|
## Variables principales
|
||||||
| Variable | Défaut | Rôle |
|
| 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_dns` | FQDN + IP | SAN/DNS du certificat de l'AC |
|
||||||
| `serveur_step_ca_adresse` | `:8443` | Adresse d'écoute |
|
| `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 |
|
| `serveur_step_ca_acme` | `true` | Ajoute un provisioner ACME |
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ serveur_step_ca_steppath: "/etc/step-ca"
|
||||||
serveur_step_ca_service: "step-ca"
|
serveur_step_ca_service: "step-ca"
|
||||||
|
|
||||||
# Identite de l'AC.
|
# 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_dns: "{{ ansible_fqdn | default(ansible_hostname) }},{{ ansible_host | default('127.0.0.1') }}"
|
||||||
serveur_step_ca_adresse: ":8443"
|
serveur_step_ca_adresse: ":8443"
|
||||||
serveur_step_ca_provisioner: "admin@{{ domaine_interne }}"
|
serveur_step_ca_provisioner: "admin@{{ domaine_interne }}"
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
group: root
|
group: root
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
|
|
||||||
- name: Déployer la configuration SSH Chezlepro
|
- name: Déployer la configuration SSH Set-OPS
|
||||||
ansible.builtin.template:
|
ansible.builtin.template:
|
||||||
src: 10-setops.conf.j2
|
src: 10-setops.conf.j2
|
||||||
dest: /etc/ssh/sshd_config.d/10-setops.conf
|
dest: /etc/ssh/sshd_config.d/10-setops.conf
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# web
|
# 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` ;
|
- frontaux : présentation web (UI, rendu, assets), groupe `serveur_web_frontal` ;
|
||||||
- dorsaux : application web (API, traitement), groupe `serveur_web_dorsal`.
|
- 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>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>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>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>
|
<button type="button" class="danger" title="Retirer" onclick="retirerApplication(${i})">✕</button>
|
||||||
<div class="dsn">${resume}</div>
|
<div class="dsn">${resume}</div>
|
||||||
</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>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>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>É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>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="TrueNAS" oninput="definirServeur(${i}, 'stockage', 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>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>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>
|
<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": {
|
"children": {
|
||||||
"hotes_planifies": {
|
"hotes_planifies": {
|
||||||
"hosts": {
|
"hosts": {
|
||||||
"data-01": {
|
"app-01": {
|
||||||
"ansible_host": "10.1.13.11",
|
"ansible_host": "10.0.2.11",
|
||||||
"ansible_user": "ansible",
|
"ansible_user": "ansible",
|
||||||
"proxmox_cidr": 24,
|
"proxmox_cidr": 24,
|
||||||
"proxmox_coeurs": 4,
|
"proxmox_coeurs": 4,
|
||||||
"proxmox_disque_taille": "160G",
|
"proxmox_disque_taille": "160G",
|
||||||
"proxmox_memoire": 2048,
|
"proxmox_memoire": 2048,
|
||||||
"proxmox_noeud": "asgard",
|
"proxmox_noeud": "noeud-a",
|
||||||
"proxmox_passerelle": "10.1.13.1",
|
"proxmox_passerelle": "10.0.2.1",
|
||||||
"proxmox_stockage": "TrueNAS",
|
"proxmox_stockage": "stockage-a",
|
||||||
"proxmox_vlan": 13,
|
"proxmox_vlan": 13,
|
||||||
"proxmox_vmid": 93101,
|
"proxmox_vmid": 93101,
|
||||||
},
|
},
|
||||||
# collab-01 : sans proxmox_noeud (champ optionnel).
|
# app-02 : sans proxmox_noeud (champ optionnel).
|
||||||
"collab-01": {
|
"app-02": {
|
||||||
"ansible_host": "10.1.15.21",
|
"ansible_host": "10.0.2.21",
|
||||||
"proxmox_cidr": 24,
|
"proxmox_cidr": 24,
|
||||||
"proxmox_disque_taille": "16G",
|
"proxmox_disque_taille": "16G",
|
||||||
"proxmox_passerelle": "10.1.15.1",
|
"proxmox_passerelle": "10.0.2.1",
|
||||||
"proxmox_stockage": "TrueNAS",
|
"proxmox_stockage": "stockage-a",
|
||||||
"proxmox_vlan": 15,
|
"proxmox_vlan": 15,
|
||||||
"proxmox_vmid": 95201,
|
"proxmox_vmid": 95201,
|
||||||
},
|
},
|
||||||
|
|
@ -47,34 +47,34 @@ def _inventaire_factice() -> dict:
|
||||||
"incomplet-01": {
|
"incomplet-01": {
|
||||||
"proxmox_vmid": 99901,
|
"proxmox_vmid": 99901,
|
||||||
"proxmox_cidr": 24,
|
"proxmox_cidr": 24,
|
||||||
"proxmox_passerelle": "10.1.99.1",
|
"proxmox_passerelle": "10.0.2.1",
|
||||||
"proxmox_vlan": 99,
|
"proxmox_vlan": 99,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"serveur_postgresql": {"hosts": {"data-01": {}}},
|
"serveur_postgresql": {"hosts": {"app-01": {}}},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def test_hote_complet_avec_noeud() -> None:
|
def test_hote_complet_avec_noeud() -> None:
|
||||||
lignes = parametres_proxmox_hote(_inventaire_factice(), "data-01")
|
lignes = parametres_proxmox_hote(_inventaire_factice(), "app-01")
|
||||||
attendu = {
|
attendu = {
|
||||||
"SETOPS_VMID='93101'",
|
"SETOPS_VMID='93101'",
|
||||||
"SETOPS_IP='10.1.13.11'",
|
"SETOPS_IP='10.0.2.11'",
|
||||||
"SETOPS_CIDR='24'",
|
"SETOPS_CIDR='24'",
|
||||||
"SETOPS_PASSERELLE='10.1.13.1'",
|
"SETOPS_PASSERELLE='10.0.2.1'",
|
||||||
"SETOPS_VLAN='13'",
|
"SETOPS_VLAN='13'",
|
||||||
"SETOPS_STOCKAGE='TrueNAS'",
|
"SETOPS_STOCKAGE='stockage-a'",
|
||||||
"SETOPS_DISQUE='160G'",
|
"SETOPS_DISQUE='160G'",
|
||||||
"SETOPS_NOEUD='asgard'",
|
"SETOPS_NOEUD='noeud-a'",
|
||||||
}
|
}
|
||||||
assert set(lignes) == attendu, lignes
|
assert set(lignes) == attendu, lignes
|
||||||
|
|
||||||
|
|
||||||
def test_hote_sans_noeud_emet_noeud_vide() -> None:
|
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_NOEUD=''" in lignes, lignes
|
||||||
assert "SETOPS_VMID='95201'" in lignes, lignes
|
assert "SETOPS_VMID='95201'" in lignes, lignes
|
||||||
|
|
||||||
|
|
|
||||||
Reference in a new issue