first commit

This commit is contained in:
LathanDevers
2026-08-13 10:18:07 +02:00
commit 4bb85f7606
9 changed files with 168 additions and 0 deletions
View File
+7
View File
@@ -0,0 +1,7 @@
- hosts: all
become: true
roles:
- role: common_hardening # Désactivation root SSH, UFW, Fail2ban
- role: wireguard_mesh # Tunnels chiffrés Zero-Trust
- role: docker_engine # Moteur de conteneurisation
- role: traefik_ingress # Reverse proxy dynamique
+44
View File
@@ -0,0 +1,44 @@
OpenTofu est le fork 100 % open-source de Terraform (licence MPL 2.0, sous la *Linux Foundation*) servant de moteur de provisionnement d'infrastructure par code (IaC) pour la stack Aegis. Il conserve la même syntaxe (HCL), les mêmes commandes et la même compatibilité avec les *providers* du marché que Terraform, sans aucune contrainte de licence commerciale.
**Rôle dans la Stack Aegis**
* **Provisionnement IaaS** : Déclare et instancie de manière automatisée les machines virtuelles, conteneurs et ressources réseau sur Proxmox VE ou auprès du datacenter belge.
* **Gestion d'État (State Management)** : Stocke le fichier d'état (`.tfstate`) de manière centralisée, chiffrée et isolée dans un bucket S3 souverain pour chaque PME cliente.
* **Garantie Open Source** : Assure que le socle d'Aegis reste totalement libre de droits, auditable et aligné avec la promesse de souveraineté.
**Exemple de Configuration (`opentofu/main.tf`)**
```hcl
terraform {
required_providers {
proxmox = {
source = "telmate/proxmox"
version = "2.9.14"
}
}
backend "s3" {
bucket = "aegis-tfstate-souverain"
key = "clients/client-01.tfstate"
}
}
resource "proxmox_vm_qemu" "client_node" {
name = var.client_name
target_node = "pve-belgium-01"
clone = "debian-12-template"
cores = 2
memory = 4096
network {
model = "virtio"
bridge = "vmbr1"
}
}
```
**Commandes Clés du Pipeline**
* **`tofu init`** : Initialise le backend distant S3 et télécharge les *providers* nécessaires.
* **`tofu plan`** : Calcule le différentiel et affiche la séquence exacte des modifications d'infrastructure.
* **`tofu apply`** : Exécute le provisionnement de l'instance virtuelle avant le passage des playbooks Ansible.
+35
View File
@@ -0,0 +1,35 @@
resource "proxmox_vm_qemu" "client_node" {
name = var.client_name
target_node = "pve-belgium-01"
clone = "debian-12-template"
agent = 1
os_type = "cloud-init"
cores = var.vm_cores
memory = var.vm_memory
scsihw = "virtio-scsi-pci"
bootdisk = "scsi0"
disks {
scsi {
scsi0 {
disk {
size = "50G"
storage = "local-lvm"
}
}
}
}
network {
model = "virtio"
bridge = "vmbr1"
tag = var.vlan_tag # Isolation stricte du trafic du client
}
# Configuration Cloud-Init (Injection de l'utilisateur Ansible et de la clé SSH)
ipconfig0 = "ip=dhcp"
ciuser = "ansible_admin"
sshkeys = <<EOF
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC... ta_cle_ssh_publique
EOF
}
+4
View File
@@ -0,0 +1,4 @@
output "client_vm_ip" {
value = proxmox_vm_qemu.client_node.default_ipv4_address
description = "Adresse IP allouée au nœud du client"
}
+27
View File
@@ -0,0 +1,27 @@
terraform {
required_version = ">= 1.6.0"
required_providers {
proxmox = {
source = "telmate/proxmox"
version = "2.9.14"
}
}
# Le Backend S3 Souverain pour stocker l'état de l'infrastructure
backend "s3" {
bucket = "aegis-tfstate-souverain"
key = "clients/client-base.tfstate"
region = "eu-west-1" # À adapter selon l'hébergeur S3
endpoint = "s3.win.be" # Exemple d'endpoint S3 belge
skip_credentials_validation = true
skip_region_validation = true
}
}
provider "proxmox" {
pm_api_url = "https://pve-belgium-01.aegis.local:8006/api2/json"
pm_api_token_id = var.proxmox_token_id
pm_api_token_secret = var.proxmox_token_secret
pm_tls_insecure = true # Passer à 'false' en prod avec un vrai certificat Let's Encrypt
}
+33
View File
@@ -0,0 +1,33 @@
variable "proxmox_token_id" {
type = string
description = "Token API Proxmox"
sensitive = true
}
variable "proxmox_token_secret" {
type = string
description = "Secret du Token API Proxmox"
sensitive = true
}
variable "client_name" {
type = string
description = "Nom du client (ex: pme-logistique-01)"
}
variable "vm_cores" {
type = number
default = 2
description = "Nombre de cœurs CPU"
}
variable "vm_memory" {
type = number
default = 4096
description = "RAM allouée en MB"
}
variable "vlan_tag" {
type = number
description = "ID du VLAN dédié pour isoler ce client"
}
View File
+18
View File
@@ -0,0 +1,18 @@
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: ":443"
certificatesResolvers:
letsencrypt:
acme:
email: security@aegis.be
storage: acme.json
httpChallenge:
entryPoint: web