{"id":90,"date":"2026-07-02T15:52:15","date_gmt":"2026-07-02T13:52:15","guid":{"rendered":"https:\/\/adamcanva.net\/?p=90"},"modified":"2026-07-02T15:52:15","modified_gmt":"2026-07-02T13:52:15","slug":"de-zero-a-linfra-multi-site-retour-dexperience-sur-mon-projet-tssr-aura","status":"publish","type":"post","link":"https:\/\/adamcanva.net\/index.php\/2026\/07\/02\/de-zero-a-linfra-multi-site-retour-dexperience-sur-mon-projet-tssr-aura\/","title":{"rendered":"De Z\u00e9ro \u00e0 l&rsquo;Infra Multi-Site : Retour d&rsquo;exp\u00e9rience sur mon projet TSSR (Aura)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">L&rsquo;objectif de mon dernier projet en date \u00e9tait d&rsquo;une envergure particuli\u00e8rement stimulante : concevoir, automatiser et s\u00e9curiser de bout en bout l&rsquo;infrastructure de l&rsquo;entreprise fictive \u00ab Aura \u00bb. Cette soci\u00e9t\u00e9 compte 80 collaborateurs r\u00e9partis sur un si\u00e8ge principal \u00e0 Paris et une nouvelle agence \u00e0 Villepinte.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;int\u00e9gralit\u00e9 de cette architecture a \u00e9t\u00e9 maquett\u00e9e au sein de mon propre Homelab, en exploitant un cluster de virtualisation Proxmox. Voici le d\u00e9tail technique des solutions d\u00e9ploy\u00e9es.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. R\u00e9seau et S\u00e9curit\u00e9 : Routage Proxmox, OPNsense et Tunnels VPN<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le fondement de l&rsquo;infrastructure repose sur un plan d&rsquo;adressage global en <code>10.0.0.0\/8<\/code>, offrant une grande flexibilit\u00e9. <br>Ce r\u00e9seau a \u00e9t\u00e9 d\u00e9coup\u00e9 par code postal g\u00e9ographique : <code>10.<strong>75<\/strong>.0.0\/16<\/code> pour le site de Paris et <code>10.<strong>93<\/strong>.0.0\/16<\/code> pour l&rsquo;agence de Villepinte.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Segmentation des VLANs<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La s\u00e9paration logique des d\u00e9partements a \u00e9t\u00e9 orchestr\u00e9e via des VLANs identiques sur les deux sites.<\/p>\n\n\n\n<figure class=\"wp-block-flexible-table-block-table is-content-justification-left\"><table class=\"has-fixed-layout\" style=\"border-collapse:collapse\"><thead><tr><th style=\"width:9%;text-align:center\"><strong>ID VLAN<\/strong><br><\/th><th style=\"width:22%\"><strong>Nom du VLAN<\/strong><br><\/th><th><strong>Sous-r\u00e9seau Paris<\/strong><br><\/th><th><strong>Sous-r\u00e9seau Villepinte<\/strong><br><\/th><th><strong>Usage<\/strong><\/th><\/tr><\/thead><tbody><tr><td style=\"width:9%;text-align:center\">10<\/td><td style=\"width:22%\">VLAN_SERVERS<\/td><td>10.75.10.0\/24<\/td><td>10.93.10.0\/24<\/td><td>Serveurs<\/td><\/tr><tr><td style=\"width:9%;text-align:center\">20 <\/td><td style=\"width:22%\">VLAN_IT<\/td><td>10.75.20.0\/24<\/td><td>10.93.20.0\/24<\/td><td>Service IT<\/td><\/tr><tr><td style=\"width:9%;text-align:center\">25<\/td><td style=\"width:22%\">VLAN_DIRECTION_RH<\/td><td>10.75.25.0\/24<\/td><td>10.93.25.0\/24<\/td><td>Direction et RH<\/td><\/tr><tr><td style=\"width:9%;text-align:center\">30<\/td><td style=\"width:22%\">VLAN_USERS<\/td><td>10.75.30.0\/24<\/td><td>10.93.30.0\/24<\/td><td>Utilisateurs standards<\/td><\/tr><tr><td style=\"width:9%;text-align:center\">35<\/td><td style=\"width:22%\">VLAN_COMPTA<\/td><td>10.75.35.0\/24<\/td><td>10.93.35.0\/24<\/td><td>Comptabilit\u00e9<\/td><\/tr><tr><td style=\"width:9%;text-align:center\">40<\/td><td style=\"width:22%\">VLAN_PRINTERS<\/td><td>10.75.40.0\/24<\/td><td>10.93.40.0\/24<\/td><td>Imprimantes<\/td><\/tr><tr><td style=\"width:9%;text-align:center\">50<\/td><td style=\"width:22%\">VLAN_WIFI_PRIVE<\/td><td>10.75.50.0\/24<\/td><td>10.93.50.0\/24<\/td><td>R\u00e9seau Wi-Fi interne<\/td><\/tr><tr><td style=\"width:9%;text-align:center\">60<\/td><td style=\"width:22%\">VLAN_WIFI_PUBLIC<\/td><td>10.75.60.0\/24<\/td><td>10.93.60.0\/24<\/td><td>R\u00e9seau Wi-Fi visiteurs<\/td><\/tr><tr><td style=\"width:9%;text-align:center\">70<\/td><td style=\"width:22%\">VLAN_VPN<\/td><td>10.75.70.0\/24<\/td><td>10.93.70.0\/24<\/td><td>Acc\u00e8s T\u00e9l\u00e9travail<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"748\" src=\"https:\/\/adamcanva.net\/wp-content\/uploads\/2026\/06\/ressource1-scaled.png\" alt=\"\" class=\"wp-image-136\" srcset=\"https:\/\/adamcanva.net\/wp-content\/uploads\/2026\/06\/ressource1-scaled.png 2560w, https:\/\/adamcanva.net\/wp-content\/uploads\/2026\/06\/ressource1-300x88.png 300w, https:\/\/adamcanva.net\/wp-content\/uploads\/2026\/06\/ressource1-1024x299.png 1024w, https:\/\/adamcanva.net\/wp-content\/uploads\/2026\/06\/ressource1-768x224.png 768w, https:\/\/adamcanva.net\/wp-content\/uploads\/2026\/06\/ressource1-1536x449.png 1536w, https:\/\/adamcanva.net\/wp-content\/uploads\/2026\/06\/ressource1-2048x599.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><figcaption class=\"wp-element-caption\">Repr\u00e9sentation graphique de l&rsquo;infrastructure informatique Aura<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Bridge Proxmox et Isolation OPNsense<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Pour simuler les commutateurs physiques, j&rsquo;ai exploit\u00e9 le routage interne de Proxmox<sup><\/sup>. L&rsquo;interface <code>vmbr1<\/code> agit comme le lien WAN<sup><\/sup>. Les interfaces <code>vmbr2<\/code> et <code>vmbr3<\/code> g\u00e8rent respectivement les r\u00e9seaux locaux de Paris et de Villepinte, et la fonction <code>vlan aware<\/code> y a \u00e9t\u00e9 activ\u00e9e pour supporter le routage inter-VLAN<sup><\/sup>. Le pare-feu et le routage sont assur\u00e9s par deux machines virtuelles OPNsense, une pour chaque site g\u00e9ographique<sup><\/sup><sup><\/sup><sup><\/sup><sup><\/sup>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans OPNsense, j&rsquo;ai optimis\u00e9 la gestion du pare-feu en cr\u00e9ant des alias et des r\u00e8gles flottantes (Floating Rules) pour autoriser massivement les ports essentiels comme le 53 (DNS), le 80 (HTTP) et le 443 (HTTPS) \u00e0 travers tous les VLANs internes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour s\u00e9curiser le Wi-Fi public (VLAN 60), j&rsquo;ai cr\u00e9\u00e9 un alias sp\u00e9cifique contenant les adresses priv\u00e9es standards (RFC1918)<sup><\/sup>. Une r\u00e8gle de pare-feu bloque toute communication vers cet alias, ce qui garantit qu&rsquo;un visiteur dispose d&rsquo;Internet sans jamais pouvoir joindre une ressource interne de l&rsquo;entreprise, m\u00eame si de nouveaux VLANs voient le jour par la suite<sup><\/sup>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tunnels VPN<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Interconnexion des sites :<\/strong> Les r\u00e9seaux de Paris et Villepinte communiquent de mani\u00e8re transparente gr\u00e2ce \u00e0 un tunnel VPN IPsec Site-\u00e0-Site. L&rsquo;authentification repose sur une Pre-Shared Key (Cl\u00e9 pr\u00e9-partag\u00e9e) configur\u00e9e sur les deux routeurs OPNsense.<\/li>\n\n\n\n<li><strong>Acc\u00e8s T\u00e9l\u00e9travail :<\/strong> J&rsquo;ai \u00e9cart\u00e9 OpenVPN et IPsec c\u00f4t\u00e9 client pour privil\u00e9gier le protocole WireGuard, r\u00e9put\u00e9 pour sa l\u00e9g\u00e8ret\u00e9. Une r\u00e8gle NAT a \u00e9t\u00e9 impl\u00e9ment\u00e9e sur OPNsense pour rediriger le trafic entrant directement vers l&rsquo;interface virtuelle <code>wg0<\/code> de WireGuard.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2. Services Syst\u00e8mes : L&rsquo;\u00e9cosyst\u00e8me Windows Server 2025<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bien que des solutions open source comme OpenLDAP ou Samba4 existent, la gestion d&rsquo;un parc de postes de travail Windows justifie pleinement le d\u00e9ploiement d&rsquo;un annuaire Active Directory complet, int\u00e9grant nativement la gestion des sessions, le DNS et les fameuses GPO (Strat\u00e9gies de groupe)<sup><\/sup>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tol\u00e9rance aux pannes AD et Troubleshooting RPC<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">J&rsquo;ai d\u00e9ploy\u00e9 deux contr\u00f4leurs de domaine (DC) sous Windows Server 2025 : le principal \u00e0 Paris (<code>10.75.10.240<\/code>) et le secondaire \u00e0 Villepinte (<code>10.93.10.240<\/code>)<sup><\/sup><sup><\/sup><sup><\/sup><sup><\/sup>. Gr\u00e2ce \u00e0 la configuration des Sites &amp; Services Active Directory, les utilisateurs s&rsquo;authentifient automatiquement sur le serveur le plus proche de leur position g\u00e9ographique g\u00e9ographique, ce qui \u00e9limine les probl\u00e8mes de latence et apporte une forte redondance<sup><\/sup>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lors de la promotion du DC de Villepinte, un d\u00e9fi technique de taille est apparu. La r\u00e9plication inter-sites \u00e9chouait avec une erreur bloquante : <code>RPC server is unavailable<\/code><sup><\/sup>. Le diagnostic a permis de comprendre que l&rsquo;alias de mon pare-feu OPNsense ne couvrait pas la totalit\u00e9 des ports requis pour Active Directory<sup><\/sup>. J&rsquo;ai d\u00fb modifier la configuration pour autoriser explicitement les flux LDAP (389), Kerberos (88), DNS (53) et surtout la plage dynamique RPC (49152-65535)<sup><\/sup>. Une fois l&rsquo;alias compl\u00e9t\u00e9, un test via la commande <code>dcdiag \/test:replications<\/code> a valid\u00e9 le succ\u00e8s de la synchronisation entre les deux sites<sup><\/sup>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Stockage Centralis\u00e9 : DFS et AGDLP<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La structure des partages de fichiers a \u00e9t\u00e9 s\u00e9curis\u00e9e en appliquant rigoureusement la m\u00e9thodologie des droits NTFS nomm\u00e9e AGDLP. Pour unifier l&rsquo;exp\u00e9rience utilisateur, j&rsquo;ai configur\u00e9 un Espace de noms DFS (DFS-N) fournissant un point d&rsquo;entr\u00e9e unique et transparent : <code>\\\\aura.lan\\Partages<\/code>. Les dossiers partag\u00e9s essentiels sont r\u00e9pliqu\u00e9s en continu entre Paris et Villepinte via le composant de R\u00e9plication DFS (DFS-R).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Outils et Support : GLPI via Docker et LDAPS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Afin d&rsquo;abandonner la gestion artisanale du support par e-mails pour 80 personnes, j&rsquo;ai d\u00e9ploy\u00e9 l&rsquo;application de ticketing GLPI<sup><\/sup>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour garantir la portabilit\u00e9 et la facilit\u00e9 de maintenance, GLPI tourne via Docker Compose sur une machine virtuelle Debian 13<sup><\/sup><sup><\/sup>. Le fichier <code>docker-compose.yml<\/code> orchestre l&rsquo;image officielle de GLPI et une base de donn\u00e9es MariaDB<sup><\/sup><sup><\/sup><sup><\/sup><sup><\/sup>. Le conteneur GLPI expose le port 8080 sur la machine h\u00f4te<sup><\/sup>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour chiffrer les flux web, un serveur web Nginx est install\u00e9 directement sur l&rsquo;h\u00f4te Debian et agit en tant que Reverse Proxy<sup><\/sup><sup><\/sup><sup><\/sup><sup><\/sup>. Il \u00e9coute sur le port 443 (HTTPS) et redirige les requ\u00eates de mani\u00e8re transparente vers le port 8080 du conteneur<sup><\/sup>. Enfin, pour que les collaborateurs puissent se connecter avec leur session Windows habituelle, j&rsquo;ai g\u00e9n\u00e9r\u00e9 un certificat SSL auto-sign\u00e9 avec OpenSSL, ce qui a permis d&rsquo;activer et de s\u00e9curiser l&rsquo;interconnexion LDAPS entre GLPI et l&rsquo;Active Directory<sup><\/sup>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. L&rsquo;Automatisation avec PowerShell, FOG Project et Ansible<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;industrialisation des processus a permis d&rsquo;optimiser drastiquement le travail du service IT.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">L&rsquo;Int\u00e9gration Active Directory (PowerShell)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cr\u00e9er manuellement 80 comptes utilisateurs dans l&rsquo;annuaire repr\u00e9sentait une perte de temps doubl\u00e9e d&rsquo;un risque majeur d&rsquo;erreurs de frappe. J&rsquo;ai donc d\u00e9velopp\u00e9 le script PowerShell complet <code>import_users_csv.ps1<\/code>. Ce script accomplit les t\u00e2ches suivantes lors de l&rsquo;importation d&rsquo;un fichier CSV fourni par les Ressources Humaines :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Il v\u00e9rifie la date de fin de contrat et ignore automatiquement les profils arriv\u00e9s \u00e0 expiration.<\/li>\n\n\n\n<li>Il g\u00e9n\u00e8re de mani\u00e8re dynamique un identifiant de connexion unique (<code>SAMAccountName<\/code>).<\/li>\n\n\n\n<li>Il cible l&rsquo;Unit\u00e9 d&rsquo;Organisation (OU) exacte et int\u00e8gre l&rsquo;utilisateur au Groupe de S\u00e9curit\u00e9 correspondant (par exemple, <code>GS_IT_PARIS<\/code>) selon son site et son d\u00e9partement.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code># filename: import_users_csv.ps1\n# --- Configuration ---\n$CSVPath = \"C:\\utilisateurs_aura.csv\"\n$Domain  = \"@aura.lan\"\t\n$BaseDN  = \"OU=AURA,DC=aura,DC=lan\"\n$Aujourdhui = Get-Date\n\n# Importation des donn\u00e9es\n$Users = Import-Csv -Path $CSVPath -Delimiter \";\" -Encoding UTF8\n\nforeach ($User in $Users) {\n    # 1. Filtrage par date de fin de contrat (Exclut les contrats expir\u00e9s)\n    $ExpiryDate = $null\n    if ($User.Fin_Contrat) {\n        $ExpiryDate = &#91;DateTime]::ParseExact($User.Fin_Contrat, \"dd\/MM\/yyyy\", $null)\n        if ($ExpiryDate -lt $Aujourdhui) { \n            Write-Host \"Ignor\u00e9 : Contrat termin\u00e9 pour $($User.Nom)\" -ForegroundColor Gray\n            continue \n        }\n    }\n\n    # 2. G\u00e9n\u00e9ration de l'identifiant unique (SAMAccountName)\n    $BaseSAM = ($User.Prenom.Substring(0,1) + $User.Nom).ToLower().Replace(\" \", \"\")\n    $SAM = $BaseSAM\n    $i = 1\n    while (Get-ADUser -Filter \"SamAccountName -eq '$SAM'\" -ErrorAction SilentlyContinue) {\n        $SAM = \"$BaseSAM$i\"\n        $i++\n    }\n\n    # 3. Pr\u00e9paration du chemin OU et du Groupe de S\u00e9curit\u00e9\n    $LieuUpper = $User.Lieu.ToUpper()\n    $GroupName = \"GS_$($User.Service)_$LieuUpper\"\n    $TargetOU  = \"OU=$($User.Service),OU=Utilisateurs,OU=$($User.Lieu),$BaseDN\"\n\n    # 4. Pr\u00e9paration des param\u00e8tres de l'utilisateur\n    $UserParams = @{\n        Name                  = \"$($User.Prenom) $($User.Nom)\"\n        GivenName             = $User.Prenom\n        Surname               = $User.Nom\n        SamAccountName        = $SAM\n        UserPrincipalName     = \"$SAM$Domain\"\n        Path                  = $TargetOU\n        AccountExpirationDate = $ExpiryDate\n        Enabled               = $true\n        ChangePasswordAtLogon = $true\n        AccountPassword       = (ConvertTo-SecureString \"Aura2025!\" -AsPlainText -Force)\n        OfficePhone           = $User.Telephone\n        StreetAddress         = $User.Adresse\n        City                  = $User.Ville\n        PostalCode            = $User.CP\n        Department            = $User.Service\n        Office                = $User.Bureau\n    }\n\n    try {\n        # Cr\u00e9ation du compte dans l'Active Directory\n        New-ADUser @UserParams\n        Write-Host \"SUCC\u00c8S : Compte cr\u00e9\u00e9 pour $($User.Nom) $($User.Prenom) > $SAM\" -ForegroundColor Green\n\n        # 5. Ajout automatique au Groupe de S\u00e9curit\u00e9 correspondant\n        if (Get-ADGroup -Filter \"Name -eq '$GroupName'\") {\n            Add-ADGroupMember -Identity $GroupName -Members $SAM\n            Write-Host \"  -> Utilisateur ajout\u00e9 au groupe : $GroupName\" -ForegroundColor Cyan\n        } else {\n            Write-Host \"  -> ALERTE : Groupe &#91;$GroupName] introuvable.\" -ForegroundColor Yellow\n        }\n    } catch {\n        Write-Host \"ERREUR : Impossible de cr\u00e9er $($User.Nom) $($User.Prenom) ($($_.Exception.Message))\" -ForegroundColor Red\n    }\n} <\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Le D\u00e9ploiement Zero-Touch (FOG + Ansible)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Le d\u00e9ploiement manuel de Windows 11 et des logiciels requis monopolisait plusieures heures par poste. L&rsquo;association de FOG Project et d&rsquo;Ansible a permis de r\u00e9duire cette intervention \u00e0 15 minutes, et ce, de mani\u00e8re totalement autonome.<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Boot R\u00e9seau (PXE) :<\/strong> Le service DHCP <code>dnsmasq<\/code> d&rsquo;OPNsense oriente la machine vers le serveur FOG via le r\u00e9seau. Une subtilit\u00e9 technique importante sur Proxmox : pour permettre le d\u00e9marrage PXE en environnement UEFI, j&rsquo;ai d\u00fb ajouter un p\u00e9riph\u00e9rique mat\u00e9riel sp\u00e9cifique <code>VirtIO RNG<\/code> aux param\u00e8tres de la machine virtuelle.<\/li>\n\n\n\n<li><strong>D\u00e9ploiement de l&rsquo;Image :<\/strong> FOG d\u00e9ploie un master Windows 11 pr\u00e9alablement g\u00e9n\u00e9ralis\u00e9 par l&rsquo;utilitaire <code>sysprep<\/code>. En amont de la capture, le service WinRM a \u00e9t\u00e9 activ\u00e9 en PowerShell pour autoriser les futures requ\u00eates entrantes d&rsquo;Ansible.<\/li>\n\n\n\n<li><strong>Le Cerveau Bash :<\/strong> \u00c0 la fin du d\u00e9ploiement de l&rsquo;image, le script <code>post_deploy.sh<\/code> s&rsquo;ex\u00e9cute automatiquement. Il analyse l&rsquo;adresse IP re\u00e7ue par le poste : le troisi\u00e8me octet d\u00e9termine le d\u00e9partement de l&#8217;employ\u00e9 (par exemple, \u00ab\u00a020\u00a0\u00bb correspond \u00e0 l&rsquo;IT), et la plage IP d\u00e9termine le site g\u00e9ographique. Il r\u00e9dige ensuite \u00e0 la vol\u00e9e le fichier d&rsquo;inventaire dynamique <code>inventory.ini<\/code> pour Ansible.<\/li>\n\n\n\n<li><strong>Configuration Ansible :<\/strong> Le playbook final s&rsquo;ex\u00e9cute sans intervention humaine. Il force la machine \u00e0 changer de nom (par exemple, <code>PC-IT-PAR-20<\/code>), l&rsquo;int\u00e8gre au domaine Active Directory dans la bonne OU, puis d\u00e9ploie l&rsquo;ensemble des paquets logiciels m\u00e9tiers en mode silencieux via le gestionnaire Chocolatey.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code># filename:post_deploy.yml\n- name: Configuration post-deploiement Windows 11\n  hosts: nouveau_poste\n  gather_facts: no\n\n  vars_files:\n    - vars\/commun.yml\n    - \"vars\/{{ service }}.yml\"\n\n  tasks:\n    - name: Tester la connexion WinRM\n      ansible.windows.win_ping:\n\n    - name: Quitter le domaine si n\u00e9cessaire\n      microsoft.ad.membership:\n        state: workgroup\n        workgroup_name: WORKGROUP\n        domain_admin_user: \"aura\\\\Administrateur\"\n        domain_admin_password: \"P@SSW0RD!\"\n      register: leave_result\n      ignore_errors: yes\n\n    - name: Redemarrer apres quitter domaine\n      ansible.windows.win_reboot:\n      when: leave_result.reboot_required is defined and leave_result.reboot_required\n\n    - name: Renommer le poste\n      ansible.windows.win_hostname:\n        name: \"{{ hostname }}\"\n      register: rename_result\n\n    - name: Redemarrer apres renommage\n      ansible.windows.win_reboot:\n      when: rename_result.reboot_required\n\n    - name: Joindre le domaine dans la bonne OU\n      microsoft.ad.membership:\n        dns_domain_name: aura.lan\n        domain_admin_user: \"aura\\\\Administrateur\"\n        domain_admin_password: \"P@SSW0RD!\"\n        domain_ou_path: \"{{ ou }}\"\n        state: domain\n      register: domain_result\n\n    - name: Redemarrer apres jonction domaine\n      ansible.windows.win_reboot:\n      when: domain_result.reboot_required\n\n    - name: Installer logiciels communs\n      chocolatey.chocolatey.win_chocolatey:\n        name: \"{{ logiciels_communs }}\"\n        state: present\n\n    - name: Installer logiciels specifiques au service\n      chocolatey.chocolatey.win_chocolatey:\n        name: \"{{ logiciels_service }}\"\n        state: present\n      when: logiciels_service is defined\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># filename:post_deploy.sh\n#!\/bin\/bash\n\nIP_POSTE=\"$1\"\nNOM_POSTE=\"$2\"\n\n# D\u00e9tecter le site selon la plage IP\nif &#91;&#91; \"$IP_POSTE\" == 10.75.* ]]; then\n    SITE=\"Paris\"\n    OU_BASE=\"OU=Ordinateurs,OU=Paris,OU=AURA,DC=aura,DC=lan\"\nelif &#91;&#91; \"$IP_POSTE\" == 10.93.* ]]; then\n    SITE=\"Villepinte\"\n    OU_BASE=\"OU=Ordinateurs,OU=Villepinte,OU=AURA,DC=aura,DC=lan\"\nelse\n    echo \"&#91;$(date)] Site inconnu pour $IP_POSTE = abandon\" >> \/var\/log\/fog_ansible.log\n    exit 1\nfi\n\n# D\u00e9tecter le service selon la vlan\nTROISIEME_OCTET=$(echo $IP_POSTE | cut -d. -f3)\nNUMERO=$(echo $IP_POSTE | cut -d. -f4)\n\ncase $TROISIEME_OCTET in\n    20)\n        SERVICE=\"IT\"\n        HOSTNAME=\"PC-IT-${SITE:0:3}-$NUMERO\"\n        ;;\n    30)\n        SERVICE=\"USERS\"\n        HOSTNAME=\"PC-USERS-${SITE:0:3}-$NUMERO\"\n        ;;\n    35)\n        SERVICE=\"COMPTA\"\n        HOSTNAME=\"PC-COMPTA-${SITE:0:3}-$NUMERO\"\n        ;;\n    25)\n        SERVICE=\"RH\"\n        HOSTNAME=\"PC-RH-${SITE:0:3}-$NUMERO\"\n        ;;\n    *)\n        echo \"&#91;$(date)] VLAN inconnu : $IP_POSTE \u2014 abandon\" >> \/var\/log\/fog_ansible.log\n        exit 1\n        ;;\nesac\n\necho \"&#91;$(date)] D\u00e9ploiement $HOSTNAME ($SERVICE - $SITE) d\u00e9tect\u00e9\" >> \/var\/log\/fog_ansible.log\n\n# G\u00e9n\u00e9rer l'inventaire dynamique\ncat > \/opt\/fog\/ansible\/inventory.ini &lt;&lt; EOF\n&#91;nouveau_poste]\n$IP_POSTE\n\n&#91;nouveau_poste:vars]\nansible_user=Admin\nansible_password=NouveauMotDePasse!\nansible_connection=winrm\nansible_winrm_transport=basic\nansible_winrm_server_cert_validation=ignore\nansible_winrm_port=5985\nansible_winrm_scheme=http\n\nEOF<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>#filename: ansible_software.yml lang: bash\nadam@SRV-FOG-PARIS:~$ cat \/opt\/fog\/ansible\/vars\/commun.yml\nlogiciels_communs:\n  - googlechrome\n  - 7zip\n  - vlc\n  - libreoffice\n\n\nadam@SRV-FOG-PARIS:~$ cat \/opt\/fog\/ansible\/vars\/IT.yml\nlogiciels_service:\n  - putty\n  - wireshark\n  - vscode<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">5. R\u00e9silience Extr\u00eame : Haute Disponibilit\u00e9 et Backups (Proxmox &amp; PBS)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;infrastructure d&rsquo;Aura se devait de r\u00e9sister \u00e0 la perte critique d&rsquo;un site complet<sup><\/sup>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Le Cluster Proxmox et le QDevice<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;architecture de calcul repose sur un cluster Proxmox de 6 n\u0153uds h\u00e9berg\u00e9s de mani\u00e8re \u00e9quitable sur les deux sites. La r\u00e8gle de l&rsquo;hyperviseur exige qu&rsquo;un quorum de N\/2 + 1 n\u0153uds soit actif pour fonctionner, ce qui correspond ici \u00e0 4 n\u0153uds. Par cons\u00e9quent, si le site de Paris subit une coupure d&rsquo;\u00e9lectricit\u00e9 majeure, il ne reste que 3 n\u0153uds actifs \u00e0 Villepinte, et le cluster bascule en read-only.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour parer \u00e0 cette \u00e9ventualit\u00e9, j&rsquo;ai d\u00e9ploy\u00e9 un composant de vote suppl\u00e9mentaire, le QDevice (Quorum Device), h\u00e9berg\u00e9 sur un Raspberry Pi ind\u00e9pendant via la commande <code>pvecm qdevice setup<\/code>. Ce dernier, h\u00e9berg\u00e9 dans un troisi\u00e8me domaine (un cloud public, un VPS tiers ou un troisi\u00e8me site physique) disposant de liaisons r\u00e9seau ind\u00e9pendantes vers Paris et Villepinte. <br>Lors de mes tests simulant la coupure de 3 n\u0153uds cons\u00e9cutifs, le cluster a maintenu sa pleine fonctionnalit\u00e9 gr\u00e2ce \u00e0 ce vote additionnel. Des r\u00e8gles de priorit\u00e9 de Haute Disponibilit\u00e9 (HA) sont configur\u00e9es : en cas de panne mat\u00e9rielle d&rsquo;un h\u00f4te, le m\u00e9canisme de \u00ab\u00a0Failback\u00a0\u00bb red\u00e9marre automatiquement (Failover) les machines virtuelles vers un h\u00f4te sain.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Afin de garantir la haute disponibilit\u00e9, le stockage des machines virtuelles est d\u00e9corr\u00e9l\u00e9 des hyperviseurs. Les donn\u00e9es sont mutualis\u00e9es sur des baies TrueNAS physiques (ZFS RAIDZ1) et partag\u00e9es au cluster via le protocole NFS.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">La R\u00e8gle du 3-2-1 avec Proxmox Backup Server (PBS)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Pour esquiver les co\u00fbts massifs de licence par processeur de certaines solutions propri\u00e9taires, la strat\u00e9gie de sauvegarde s&rsquo;articule autour de deux instances de Proxmox Backup Server (PBS), une pour Paris et une pour Villepinte<sup><\/sup><sup><\/sup><sup><\/sup><sup><\/sup>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La s\u00e9curit\u00e9 des donn\u00e9es est assur\u00e9e par un contr\u00f4le strict des acc\u00e8s. Les cibles de sauvegarde NFS sur TrueNAS sont restreintes pour n&rsquo;accepter que les adresses IP sp\u00e9cifiques des serveurs PBS<sup><\/sup>. Pour garantir la p\u00e9rennit\u00e9 du syst\u00e8me, ces montages r\u00e9seau ont \u00e9t\u00e9 inscrits en dur dans le fichier syst\u00e8me <code>\/etc\/fstab<\/code> des serveurs Linux<sup><\/sup>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Enfin, des t\u00e2ches de synchronisation automatis\u00e9es (<em>Sync Jobs<\/em>) ont \u00e9t\u00e9 configur\u00e9es entre les instances Proxmox Backup Server (PBS). Le serveur PBS de Villepinte r\u00e9plique de fa\u00e7on programm\u00e9e les donn\u00e9es critiques du site de Paris, et r\u00e9ciproquement. Cette architecture valide strictement la r\u00e8gle d\u2019or du 3-2-1 en mati\u00e8re de sauvegarde :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>3 copies des donn\u00e9es :<\/strong> La copie de production active, la sauvegarde locale et la copie r\u00e9pliqu\u00e9e hors-site.<\/li>\n\n\n\n<li><strong>2 supports de stockage distincts :<\/strong> La production s&rsquo;ex\u00e9cute sur le stockage centralis\u00e9 TrueNAS, tandis que les sauvegardes exploitent les disques locaux d\u00e9di\u00e9s et ind\u00e9pendants des serveurs PBS.<\/li>\n\n\n\n<li><strong>1 copie hors-site :<\/strong> Assur\u00e9e par la r\u00e9plication crois\u00e9e et l&rsquo;externalisation g\u00e9ographique des donn\u00e9es entre les sites physiques de Paris et de Villepinte.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Le mot de la fin<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si je devais retenir une chose de ce projet \u00ab\u00a0Aura\u00a0\u00bb, c&rsquo;est qu&rsquo;aujourd&rsquo;hui, l&rsquo;administration syst\u00e8me ne se r\u00e9sume plus \u00e0 cliquer dans des interfaces. Entre le d\u00e9ploiement Zero-Touch via FOG\/Ansible et la mise en place d&rsquo;une r\u00e9silience pouss\u00e9e sous Proxmox, j&rsquo;ai pu exp\u00e9rimenter l&rsquo;IT moderne : automatis\u00e9e, scalable et hautement disponible. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Obtenir mon titre TSSR n&rsquo;est que la premi\u00e8re \u00e9tape. Je suis maintenant \u00e0 la recherche de mon prochain d\u00e9fi professionnel pour mettre ma passion de l&rsquo;optimisation au service d&rsquo;une vraie DSI. Pr\u00eat \u00e0 \u00e9changer ? Ma messagerie est ouverte ! \ud83e\udd1d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&rsquo;objectif de mon dernier projet en date \u00e9tait d&rsquo;une envergure particuli\u00e8rement stimulante : concevoir, automatiser et s\u00e9curiser de bout en bout l&rsquo;infrastructure de l&rsquo;entreprise fictive \u00ab Aura \u00bb. Cette soci\u00e9t\u00e9 compte 80 collaborateurs r\u00e9partis sur un si\u00e8ge principal \u00e0 Paris et une nouvelle agence \u00e0 Villepinte. L&rsquo;int\u00e9gralit\u00e9 de cette architecture a \u00e9t\u00e9 maquett\u00e9e au sein [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[1],"tags":[9,11,3,12],"class_list":["post-90","post","type-post","status-publish","format-standard","hentry","category-non-classe","tag-linux","tag-opnsense","tag-proxmox","tag-vlans"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/adamcanva.net\/index.php\/wp-json\/wp\/v2\/posts\/90","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adamcanva.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adamcanva.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adamcanva.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adamcanva.net\/index.php\/wp-json\/wp\/v2\/comments?post=90"}],"version-history":[{"count":44,"href":"https:\/\/adamcanva.net\/index.php\/wp-json\/wp\/v2\/posts\/90\/revisions"}],"predecessor-version":[{"id":151,"href":"https:\/\/adamcanva.net\/index.php\/wp-json\/wp\/v2\/posts\/90\/revisions\/151"}],"wp:attachment":[{"href":"https:\/\/adamcanva.net\/index.php\/wp-json\/wp\/v2\/media?parent=90"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adamcanva.net\/index.php\/wp-json\/wp\/v2\/categories?post=90"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adamcanva.net\/index.php\/wp-json\/wp\/v2\/tags?post=90"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}