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