Automatisation et Infrastructure as Code¶
Concepts fondamentaux¶
Qu'est-ce que l'Infrastructure as Code ?¶
L'Infrastructure as Code (IaC) est la pratique de gerer et provisionner l'infrastructure informatique via des fichiers de configuration versionnes plutot que par des processus manuels. Chaque serveur, reseau et service est decrit dans du code source, versionne dans Git, revise par des pairs et deploye de maniere reproductible.
Imperatif vs declaratif¶
| Approche | Principe | Exemple | Outil |
|---|---|---|---|
| Imperative | Decrit comment arriver au resultat, etape par etape | "Installe nginx, copie le fichier de config, demarre le service" | Scripts shell, Ansible (partiellement) |
| Declarative | Decrit l'etat desire final, l'outil determine les actions | "Il doit y avoir une VM avec 4 vCPU et 8 Go de RAM" | Terraform, Kubernetes manifests |
Mutable vs immutable¶
| Approche | Principe | Avantage | Inconvenient |
|---|---|---|---|
| Mutable | L'infrastructure existante est modifiee sur place | Rapide pour les petits changements | Derive de configuration, "snowflake servers" |
| Immutable | Toute modification detruit et recree la ressource | Reproductibilite parfaite | Plus lent, necessite une strategie de donnees |
Notre approche hybride
Nous utilisons une approche hybride : Terraform gere l'infrastructure de maniere immutable (les VMs sont recrees si necessaire), tandis qu'Ansible configure les systemes de maniere mutable mais idempotente. Packer produit des images de base immutables.
Idempotence¶
Un processus est idempotent s'il produit le meme resultat, qu'il soit execute une ou plusieurs fois. C'est une propriete essentielle en IaC : relancer un playbook Ansible ou un terraform apply sur une infrastructure deja conforme ne doit rien changer.
Gestion d'etat¶
Les outils IaC declaratifs maintiennent un fichier d'etat (state) qui represente l'infrastructure reelle. Cet etat permet de calculer les differences entre l'etat desire (code) et l'etat actuel, puis d'appliquer uniquement les changements necessaires.
Strategie "Everything as Code"¶
L'objectif est d'atteindre 95% d'automatisation des operations recurrentes :
flowchart TB
subgraph IaC["Infrastructure as Code"]
TF["Terraform<br/>Provisioning VMs"]
PK["Packer<br/>Golden images"]
end
subgraph CaC["Configuration as Code"]
AN["Ansible<br/>Configuration systeme"]
DK["Docker Compose<br/>Stacks applicatives"]
end
subgraph PaC["Pipeline as Code"]
GL["GitLab CI<br/>Pipelines CI/CD"]
end
subgraph SaC["Security as Code"]
VL["Vault<br/>Secrets et certificats"]
WZ["Wazuh<br/>Regles de detection"]
end
PK -->|Image de base| TF
TF -->|VMs provisionees| AN
AN -->|Systemes configures| DK
GL -->|Deploie| DK
VL -->|Secrets| AN
VL -->|Certificats| GL
WZ -->|Monitoring| AN
style IaC fill:#1565C0,color:#fff
style CaC fill:#E65100,color:#fff
style PaC fill:#2E7D32,color:#fff
style SaC fill:#B71C1C,color:#fff
Terraform¶
Principes¶
Terraform (HashiCorp) est un outil IaC declaratif qui permet de provisionner et gerer l'infrastructure sur differentes plateformes (cloud, on-premise, SaaS) via le langage HCL (HashiCorp Configuration Language).
Concepts cles¶
| Concept | Description |
|---|---|
| Provider | Plugin qui communique avec l'API d'une plateforme (vsphere, vault, dns) |
| Resource | Element d'infrastructure a gerer (VM, disque, reseau) |
| Module | Bloc reutilisable de ressources (notre module vm-rocky9) |
| State | Fichier (terraform.tfstate) qui mappe le code a l'infrastructure reelle |
| Plan | Preview des changements avant application |
| Apply | Application effective des changements |
Workflow Terraform¶
flowchart LR
CODE["Code HCL<br/>(etat desire)"] --> PLAN["terraform plan<br/>(calcul du diff)"]
PLAN --> REVIEW["Revue humaine<br/>(verification)"]
REVIEW --> APPLY["terraform apply<br/>(execution)"]
APPLY --> STATE["State file<br/>(etat reel)"]
STATE -->|Drift detection| CODE
style PLAN fill:#FF9800,color:#fff
style APPLY fill:#2E7D32,color:#fff
Terraform pour vSphere¶
Notre module vm-rocky9 lit des fichiers YAML qui servent de source unique de verite (SSOT) pour la definition des VMs :
Module vm-rocky9¶
Le module abstrait la complexite de creation d'une VM vSphere en un appel simple :
| Parametre YAML | Description | Exemple |
|---|---|---|
name |
Nom de la VM | soc-master-01 |
cpu |
Nombre de vCPU | 4 |
memory |
RAM en Mo | 8192 |
disk_size |
Disque en Go | 100 |
ip |
Adresse IP | 10.15.80.11 |
gateway |
Passerelle | 10.15.80.1 |
vlan |
VLAN de rattachement | 800 |
dns |
Serveurs DNS | 10.15.100.74 |
Structure par zones¶
Les fichiers Terraform sont organises par zone reseau, chacune correspondant a un ou plusieurs VLANs :
| Zone | VLANs | Fichier YAML | Nombre de VMs |
|---|---|---|---|
| infra | 100, 106 | infra.yaml |
Services fondamentaux |
| soc | 800 | soc.yaml |
Cluster SOC complet |
| dmz | 200 | dmz.yaml |
Services exposes |
| monitoring | 108 | monitoring.yaml |
Zabbix, Grafana, Prometheus |
| services | 110, 112 | services.yaml |
Applications metier |
| dev | 114 | dev.yaml |
Environnement de developpement |
Le fichier environments/prod/main.tf orchestre le deploiement de toutes les zones.
Ansible¶
Principes¶
Ansible (Red Hat) est un outil d'automatisation agentless qui configure les systemes via SSH. Il utilise des playbooks YAML declaratifs et des roles modulaires.
Concepts cles¶
| Concept | Description |
|---|---|
| Inventaire | Liste des hotes cibles, organises en groupes |
| Playbook | Fichier YAML orchestrant l'execution de roles et taches |
| Role | Unite reutilisable de configuration (tasks, handlers, templates, defaults) |
| Task | Action unitaire (installer un paquet, copier un fichier, demarrer un service) |
| Handler | Action declenchee par un changement (restart service apres modif config) |
| Facts | Variables collectees automatiquement sur chaque hote (OS, IP, RAM) |
| Templates Jinja2 | Fichiers de configuration parametres dynamiquement |
37 roles Ansible¶
Les roles sont organises par fonction :
Roles fondamentaux (deployes sur toutes les VMs)¶
| Role | Description |
|---|---|
common |
Configuration de base (hostname, NTP, DNS, proxy, repos Nexus) |
hardening-anssi |
Durcissement ANSSI-BP028 complet |
lvm-setup |
Configuration LVM et partitionnement securise |
wazuh-agent |
Installation et configuration de l'agent Wazuh |
zabbix-agent |
Installation et configuration de l'agent Zabbix |
freeipa-client |
Enrolement au domaine FreeIPA |
Roles identite et acces¶
| Role | Description |
|---|---|
freeipa-server |
Serveur FreeIPA (annuaire LDAP + Kerberos) |
vault |
HashiCorp Vault (PKI, secrets, SSH CA) |
Roles monitoring¶
| Role | Description |
|---|---|
zabbix-server |
Serveur Zabbix (supervision infrastructure) |
grafana |
Dashboards de visualisation |
prometheus |
Collecte de metriques |
node-exporter |
Export des metriques systeme |
Roles SOC -- collecte et detection¶
| Role | Description |
|---|---|
rsyslog-server |
Collecte centralisee des logs |
haproxy |
Load balancer pour la HA |
keepalived |
VIP et basculement VRRP |
logstash |
Parsing et enrichissement des logs |
elasticsearch |
Cluster de stockage et indexation |
kibana |
Interface de visualisation |
wazuh-manager |
Manager Wazuh (regles, decoders, alertes) |
elastalert2 |
Moteur d'alertes sur Elasticsearch |
Roles SOC -- orchestration et outils¶
| Role | Description |
|---|---|
shuffle |
Plateforme SOAR |
thehive |
Gestion d'incidents |
cortex |
Moteur d'analyse et enrichissement |
misp |
Partage d'IoC |
opencti |
Plateforme CTI |
opencanary |
Honeypots de deception |
ollama |
LLM local pour assistance analyse |
n8n |
Automatisation de workflows |
ntfy |
Notifications push |
Roles infrastructure¶
| Role | Description |
|---|---|
squid |
Proxy web HA |
bind |
DNS interne |
chrony |
Serveur NTP |
nexus |
Gestionnaire de repositories |
gitlab |
Forge logicielle |
docker |
Runtime Docker CE |
sonarqube |
Analyse de code statique |
gitlab-runner |
Runners CI/CD |
Deploiement en 6 phases (site.yml)¶
Le playbook maitre site.yml orchestre le deploiement complet en 6 phases sequentielles :
flowchart TB
P1["Phase 1 -- Fondations<br/>common, lvm-setup, docker"]
P2["Phase 2 -- Durcissement<br/>hardening-anssi"]
P3["Phase 3 -- Identite et acces<br/>freeipa-server/client, vault"]
P4["Phase 4 -- Infrastructure<br/>squid, bind, chrony, nexus, gitlab"]
P5["Phase 5 -- Monitoring + SOC<br/>zabbix, prometheus, grafana<br/>elasticsearch, wazuh, kibana"]
P6["Phase 6 -- Orchestration<br/>shuffle, thehive, cortex, misp<br/>opencti, opencanary, ollama"]
P1 --> P2 --> P3 --> P4 --> P5 --> P6
style P1 fill:#1565C0,color:#fff
style P2 fill:#B71C1C,color:#fff
style P3 fill:#E65100,color:#fff
style P4 fill:#2E7D32,color:#fff
style P5 fill:#7B1FA2,color:#fff
style P6 fill:#F57F17,color:#000
Ordre des phases
L'ordre est critique. Le durcissement (Phase 2) doit intervenir apres la configuration de base (Phase 1) pour ne pas bloquer les installations. L'identite (Phase 3) doit preceder les services pour que l'authentification centralisee soit disponible.
Packer¶
Concept de Golden Image¶
Packer (HashiCorp) cree des images de base (golden images) qui servent de point de depart pour toutes les VMs. L'image contient le systeme minimal, pre-configure et durci, ce qui reduit le temps de deploiement et garantit l'homogeneite.
| Etape | Description |
|---|---|
| Kickstart | Installation automatisee de Rocky 9 avec partitionnement, paquets de base, compte initial |
| Provisioning | Configuration minimale (cloud-init ready, VMware tools, agent SSH) |
| Template | Conversion en template vSphere reutilisable |
| Information | Valeur |
|---|---|
| Derniere image | rocky9-template-2026-03-23 |
| OS | Rocky Linux 9.x minimal |
| Format | Template VMware vSphere |
| Contenu | Partitionnement LVM, VMware tools, cloud-init, SSH keys, repos Nexus |
Workflow complet de deploiement¶
flowchart LR
subgraph PACKER["Packer"]
P["Golden image<br/>rocky9-template"]
end
subgraph TERRAFORM["Terraform"]
T["Provisioning<br/>VMs vSphere"]
end
subgraph ANSIBLE["Ansible"]
A["Configuration<br/>37 roles, 6 phases"]
end
subgraph DOCKER["Docker"]
D["Stacks applicatives<br/>9 compose files"]
end
P -->|Template de base| T
T -->|VMs provisionees| A
A -->|Systemes configures| D
style PACKER fill:#1565C0,color:#fff
style TERRAFORM fill:#7B1FA2,color:#fff
style ANSIBLE fill:#E65100,color:#fff
style DOCKER fill:#2E7D32,color:#fff
Structure du depot¶
| Repertoire | Contenu | Volume |
|---|---|---|
infra/terraform/ |
Modules, zones, environments | 43 fichiers, 6 zones |
infra/ansible/ |
Inventaire, playbooks, roles | 37 roles, 3 playbooks |
infra/docker/ |
Stacks Docker Compose | 9 stacks |
infra/packer/ |
Templates Packer et kickstart | 2 templates |
Single Source of Truth
Les fichiers YAML de Terraform sont la source unique de verite pour l'inventaire des VMs. L'inventaire Ansible est genere dynamiquement a partir de ces memes fichiers, eliminant tout risque de desynchronisation entre le provisioning et la configuration.