first commit
This commit is contained in:
@@ -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
|
||||||
@@ -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.
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
@@ -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
|
||||||
Reference in New Issue
Block a user