PowerShell
PowerShell DSC (Desired State Configuration) : Infrastructure as Code pour Windows Server

PowerShell DSC (Desired State Configuration) : Infrastructure as Code pour Windows Server

Qu'est-ce que PowerShell DSC ?

Desired State Configuration (DSC) est une fonctionnalité de PowerShell permettant de décrire l'état cible d'un système sous forme de code déclaratif. Le Local Configuration Manager (LCM) de chaque nœud applique et maintient cet état de façon continue. C'est le pilier de l'Infrastructure as Code sur l'écosystème Microsoft.

1. Première configuration DSC : serveur web IIS

Configuration WebServerConfig {

    param ([string[]] $NodeName = "localhost")

    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Import-DscResource -ModuleName xWebAdministration  # Install-Module xWebAdministration

    Node $NodeName {

        # Installer IIS
        WindowsFeature IIS {
            Ensure = "Present"
            Name   = "Web-Server"
        }

        WindowsFeature IISManagementTools {
            Ensure    = "Present"
            Name      = "Web-Mgmt-Tools"
            DependsOn = "[WindowsFeature]IIS"
        }

        # Configurer le site web
        xWebsite DefaultSite {
            Ensure       = "Present"
            Name         = "Default Web Site"
            State        = "Started"
            PhysicalPath = "C:inetpubwwwroot"
            BindingInfo  = @(
                MSFT_xWebBindingInformation {
                    Protocol = "HTTP"
                    Port     = 80
                }
                MSFT_xWebBindingInformation {
                    Protocol              = "HTTPS"
                    Port                  = 443
                    CertificateThumbprint = "XXXXX..."
                    CertificateStoreName  = "MY"
                }
            )
            DependsOn = "[WindowsFeature]IIS"
        }

        # S'assurer que le service est en cours d'exécution
        Service W3SVC {
            Name      = "W3SVC"
            State     = "Running"
            StartType = "Automatic"
            DependsOn = "[WindowsFeature]IIS"
        }

        # Fichier de configuration applicative
        File AppConfig {
            DestinationPath = "C:inetpubwwwrootweb.config"
            SourcePath      = "\SRV-DEPLOYDSC-Sourcesweb.config"
            Checksum        = "SHA-256"
            Force           = $true
            DependsOn       = "[WindowsFeature]IIS"
        }
    }
}

# Générer le fichier MOF de configuration
WebServerConfig -NodeName "SRV-WEB01", "SRV-WEB02" -OutputPath "C:DSCWebServer"

2. Appliquer la configuration (mode Push)

# Tester la configuration sans l'appliquer
Test-DscConfiguration -Path "C:DSCWebServer" -ComputerName SRV-WEB01

# Appliquer (Push)
Start-DscConfiguration -Path "C:DSCWebServer" `
                        -ComputerName SRV-WEB01, SRV-WEB02 `
                        -Wait -Verbose -Force

# Vérifier l'état de conformité
Get-DscConfigurationStatus -CimSession SRV-WEB01 | Select-Object Status, StartDate, DurationInSeconds

3. Configurer le LCM pour la surveillance continue

[DSCLocalConfigurationManager()]
Configuration LCMConfig {

    Node "SRV-WEB01" {
        Settings {
            RefreshMode            = "Push"            # ou "Pull" pour le mode pull server
            ConfigurationMode      = "ApplyAndAutoCorrect"  # Recorrige les dérives automatiquement
            ConfigurationModeFrequencyMins = 30        # Vérification toutes les 30 min
            RebootNodeIfNeeded     = $false
            ActionAfterReboot      = "ContinueConfiguration"
        }
    }
}

LCMConfig -OutputPath "C:DSCLCM"
Set-DscLocalConfigurationManager -Path "C:DSCLCM" -ComputerName SRV-WEB01 -Force -Verbose

4. Mode Pull avec Azure Automation DSC

Azure Automation State Configuration implémente un serveur Pull managé, idéal pour gérer des centaines de nœuds :

# Enregistrer un serveur dans Azure Automation DSC
$params = @{
    AutomationAccountName = "aa-techbyhm-prod"
    ResourceGroupName     = "rg-automation"
    ComputerName          = @("SRV-WEB01", "SRV-WEB02", "SRV-APP01")
    OutputFolder          = "C:DSCMetaConfig"
    NodeConfigurationName = "WebServerConfig.SRV-WEB01"
    RefreshFrequencyMins  = 30
    ConfigurationModeFrequencyMins = 15
    RebootNodeIfNeeded    = $false
    ActionAfterReboot     = "ContinueConfiguration"
    AllowModuleOverwrite  = $true
    ConfigurationMode     = "ApplyAndAutoCorrect"
}

Register-AzAutomationDscNode @params

5. Rapport de conformité en temps réel

# Récupérer l'état de conformité de tous les nœuds dans Azure Automation
$nodes = Get-AzAutomationDscNode `
    -AutomationAccountName "aa-techbyhm-prod" `
    -ResourceGroupName "rg-automation"

$nodes | Select-Object Name, Status, LastSeen, NodeConfigurationName |
    Sort-Object Status | Format-Table -AutoSize

# Nodes non conformes
$nonCompliant = $nodes | Where-Object Status -ne "Compliant"
if ($nonCompliant) {
    Write-Warning "Nœuds non conformes :"
    $nonCompliant | Select-Object Name, Status, LastSeen | Format-Table
}

6. Ressources DSC communautaires essentielles

Module Ressources
xWebAdministration Sites IIS, App Pools, liaisons SSL
xActiveDirectory Domaine AD, OUs, utilisateurs, groupes
NetworkingDsc Cartes réseau, pare-feu, routage
SqlServerDsc Installation et configuration SQL Server
SecurityPolicyDsc Politiques de sécurité locales (SecEdit)
CertificateDsc Gestion des certificats et PKI

Conclusion

PowerShell DSC transforme la configuration de vos serveurs en code versionnable, auditable et idempotent. Combiné à Azure Automation State Configuration, il devient un outil de conformité continue puissant, garantissant que chaque serveur reste conforme à son état désiré, même après des modifications manuelles accidentelles.

MAKHZOUM Hussein
Auteur
MAKHZOUM Hussein
Consultant Cloud & Infrastructure Engineer
Voir le profil

Articles similaires