Agence web » Actualités du digital » C'est plus simple que vous ne le pensez

C'est plus simple que vous ne le pensez

Avez-vous déjà pensé à essayer le DSC mais avez-vous pensé que la courbe d'apprentissage était trop abrupte? Ou peut-être que vous ne vous êtes jamais vu l'utiliser dans la production, alors vous n'avez pas pris la peine?

L'utilisation de DSC ne doit pas être difficile ou complexe, et vous n'avez pas besoin d'une infrastructure gigantesque pour que cela en vaille la peine. Cet article va parler de DSC et comment faire les premiers pas, et il comprend des exemples de comment vous pouvez commencer en l'appliquant à petite échelle dans la production.

Qu'est-ce que DSC?

La configuration de l'état souhaité (DSC) est un système de gestion de configuration intégré à Windows et vous permettant de configurer votre système en tant que code. Il utilise une configuration écrite dans PowerShell qui est ensuite convertie en un format d'objet géré (MOF).

Le fichier MOF est ensuite lu et appliqué par le service Local Configuration Manager sur le nœud cible (ordinateur).

La configuration créée et exécutée utilise des ressources DSC différentes des modules DSC. Les modules DSC sont comme un module PowerShell standard, et les ressources sont ses fonctions. Par exemple, vous pouvez les installer en utilisant Install-Module, et ils sont stockés sous PSModulePath.

Pourquoi puis-je utiliser DSC?

La partie la plus difficile à propos de DSC pour beaucoup est de trouver des cas d'utilisation. Les gens ont tendance à parler et à écrire sur DSC uniquement lorsqu'il s'agit d'orchestrer et de faire tourner de grands environnements, ou de tester et d'AQ pour différentes applications, ce qui est un sujet lointain pour de nombreux administrateurs.

Nous pouvons utiliser DSC pour nos routines quotidiennes et bien plus encore, sans avoir à restructurer l'ensemble de notre organisation. J'ai compilé une liste de quelques domaines que vous pouvez automatiser entièrement ou partiellement avec DSC:

Exemple: lecture et écriture d'une configuration DSC

Quelques lignes de DSC peuvent être égales à des centaines de lignes avec PowerShell brut, c'est pourquoi il peut être si incroyablement puissant.

Une configuration DSC se compose principalement de 2 parties: la configuration DSC et les données de configuration.

Les données de configuration (expliquées plus loin) peuvent être incluses en externe, généralement à partir d'un fichier PSD, ou incluses dans le fichier de configuration. L'approche recommandée et la plus maintenable consiste à l'inclure à partir d'un fichier séparé.

Voici un exemple de création d'un MOF DSC qui télécharge et installe un MSI générique lorsqu'il est appliqué:

Configuration MyDSCConfiguration {
    # Import DSC modules with resources to use in the configuration
    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Import-DscResource -ModuleName xPSDesiredStateConfiguration -ModuleVersion "8.10.0.0"

    ##############################################
    # Creates configuration for the server fileserver-1
    ##############################################
    Node "fileserver-1" {
       
        # Create C:ProgramDataSoftwarePackages to download files to on all nodes 
        File SoftwarePackagesDirectory { 
            # Identifier "SoftwarePackagesDirectory" using the DSC resource "File" from DSC module "PSDesiredStateConfiguration"

            DestinationPath = "C:ProgramDataSoftwarePackages"
            Type = "Directory" # Is a directory
            Ensure = "Present" # Ensure that it exists

        }

                # Download MSI
        xRemoteFile DownloadBackupAgent {
            # The xRemoteFile resource from xPSDesiredStateConfiguration DSC module used to download an MSI through HTTP
    
            DependsOn = "(File)SoftwarePackagesDirectory" # Tells DSC to not run this if the previous step hasn't completed successfully
            Uri = "http://web.contoso.com/packages/backupagent.msi" # Where to download the remote file from
            DestinationPath = "C:ProgramDataSoftwarePackagesBackupAgent.msi" # Where to save the downloaded file
    
        }
                
                # Install MSI
        xMsiPackage InstallBackupAgent {
            # The xMsiPackage resource from xPSDesiredStateConfiguration DSC module used to install the MSI we just downloaded
            
            DependsOn = "(xRemoteFile)DownloadBackupAgent" # Depends on previous step being completed before starting
            ProductId = "d29c3fa9-e03e-40e0-a6ed-556c6f05476a" # The MSI package ProductID
            Path = "C:ProgramDataSoftwarePackagesBackupAgent.msi" # Path to the MSI file we just downloaded
            Ensure = "Present" # Ensure that it's present (install the MSI), 'Ensure = "Absent"' would uninstall the MSI

        }

    }
}

Après avoir exécuté ce code, il crée une fonction de configuration dans la session PowerShell actuelle qui peut être utilisée. Il crée un sous-dossier avec le même nom que la configuration où il enregistre les fichiers MOF générés:

PS51> MyDSCConfiguration

    Directory: C:TutorialsDSCMyDSCConfiguration


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2019-10-28     16:38           3952 fileserver-1.mof

Vous pouvez appliquer toutes les configurations DSC du dossier MyDSCConfiguration à leur hôte en exécutant:

PS51> Start-DscConfiguration -Path .MyDSCConfiguration -Wait

Utilisation de DSC avec ConfigurationData

Les données de configuration contiennent des données de configuration pour la configuration DSC. Les informations incluent un nom de nœud (nom d'ordinateur) et peuvent contenir d'autres données telles que des informations sur la façon d'installer un package MSI ou des valeurs de clé de registre, etc. Cela nous donne une approche dynamique et plus polyvalente de DSC, afin qu'il puisse être réutilisé et facilement modifié.

Supposons que vous disposiez de ces trois serveurs qui nécessitent chacun une combinaison unique de packages:

  • serveur de fichiers-1
  • base de données-1
    • Besoins: BackupAgent, BackupAgent-DatabaseAddon
  • appserver-1
    • Besoins: BackupAgent, MonitoringAgent

La meilleure approche consiste à créer un fichier avec les données de configuration dont vous avez besoin à la place, non seulement en spécifiant les nœuds (serveurs), mais également en y ajoutant une liste de packages:

# Save as ConfigurationData.psd1

@{
        #############################
        # Specify server nodes
    #############################
    AllNodes = @(
        @{
            NodeName = "*"
        }

        # File server node
        @{
            NodeName = "fileserver-1"
            Role = "Fileserver"

            # Selects what packages to install
            Packages = @(
                'BackupAgent'
            )
        },

        # Database server node
        @{
            NodeName = "database-1"
            Role = "Database"

            # Selects what packages to install
            Packages = @(
                'BackupAgent',
                'BackupAgent-DataBaseAddon'
            )
        },

        # Appserver node
        @{
            NodeName = "appserver-1"
            Role = "Appserver"

            # Selects what packages to install
            Packages = @(
                'BackupAgent',
                'MonitoringAgent'
            )
        }
    )

        #############################
    # Define each package
        #############################
    Packages = @(
        @{
            Name = "BackupAgent"
            ProductId = "3c4e21b5-8de2-408e-84e0-a42b0507b8b1"
            FileName = "BackupAgent.msi"
            Ensure = "Present"    
        },
        @{
            Name = "BackupAgent-DataBaseAddon"
            ProductId = "97f860f6-0a58-4bf3-aef8-abc0f796e9df"
            FileName = "BackupAgent-DataBaseAddon.msi"
            Ensure = "Present"
        },
        @{
            Name = "MonitoringAgent"
            ProductId = "77b29b12-c222-4d85-b812-bbd4136ad0ff"
            FileName = "MonitoringAgent.msi"
            Ensure = "Present"    
        }
    )
}

Vous pouvez maintenant utiliser ce fichier de données de configuration pour générer dynamiquement des configurations DSC pour vos serveurs:

Configuration MyDSCConfiguration {
    # Import DSC modules with resources to use in the configuration
    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Import-DscResource -ModuleName xPSDesiredStateConfiguration -ModuleVersion "8.10.0.0"

    # Get Packages from the ConfigurationData
    $Packages = $ConfigurationData.Packages

    ##############################################
    # Applies to all nodes
    ##############################################
    Node $AllNodes.NodeName {
        
        # Create C:ProgramDataSoftwarePackages to download files to on all nodes
        File SoftwarePackagesDirectory { 
            DestinationPath = "C:ProgramDataSoftwarePackages"
            Type = "Directory" # Is a directory
            Ensure = "Present" # Ensure that it exists
        }

        # Start dynamically generating DSC configuration by running through all the package names in Node.Packages
        Foreach($PackageName in $Node.Packages){

            $Package = $Packages.Where{$_.Name -eq $PackageName}

            xRemoteFile "PackageDownload-$($Package.Name)" {
                DependsOn = "(File)SoftwarePackagesDirectory"
                DestinationPath = "C:SoftwarePackages$($Package.FileName)"
                Uri = "http://web.contso.com/packages/$($Package.FileName)"
            }

            xMsiPackage "Install$($Package.Name)" {
                DependsOn = "(xRemoteFile)PackageDownload-$($Package.Name)"
                ProductId = $Package.ProductId
                Path = "C:ProgramDataSoftwarePackages$($Package.FileName)"
                Ensure = $Package.Ensure
            }
        }
    }
}

Si vous l'exécutez, la fonction DSC génère un fichier MOF pour chacun de vos serveurs qui peut être utilisé pour installer les packages que vous avez définis dans le ConfigurationData.psd1 fichier:

PS51> MyDSCConfiguration -ConfigurationData .ConfigurationData.psd1


    Directory: C:TutorialsDSCMyDSCConfiguration


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2019-10-28     17:25           3962 fileserver-1.mof
-a----       2019-10-28     17:25           6012 database-1.mof
-a----       2019-10-28     17:25           5894 appserver-1.mof

# Applies the configuration to the servers
PS51> Start-DscConfiguration -Path .MyDSCConfiguration -Wait

Si vous souhaitez ajouter de nouveaux packages, modifiez votre ConfigurationData.psd1 fichier et exécutez le code précédent une fois de plus.

Conclusion

Cela peut être une courbe d'apprentissage assez courte et abrupte pour commencer avec DSC. Mais le plus difficile pour beaucoup est de trouver des cas d'utilisation où ils peuvent l'utiliser.

L'utilisation de la méthode précédente qui utilise HTTP (ou HTTPS) pour récupérer des packages vous offre un moyen polyvalent de distribuer des logiciels sur vos serveurs. Et comme il s'agit de HTTPS, il est également plus facile à exposer et vous pouvez l'utiliser pour gérer les logiciels dans DMZ et d'autres réseaux moins fiables.

De plus, l'utilisation des données de configuration au lieu de tout coder en dur dans vos configurations DSC vous offre une approche beaucoup plus facile à maintenir. Vous pouvez même générer ces données de configuration à partir de sources externes telles que CSV, SQL, Sharepoint et tout ce qui peut être lu avec PowerShell.

J'espère que vous avez eu quelques idées pour votre environnement afin de commencer à vous faciliter la tâche au quotidien avec DSC.

★★★★★