DSC – Desired State Configuration

Vous cherchez un moyen d’automatiser vos installations d’applications ou projets ? Vous en avez marre de répéter 50 fois les mêmes actions, et vous commencez à avoir des crampes aux doigts à force de configurer vos services applicatifs à la main ? DSC (Desired State Configuration) est fait pour vous ! Et cerise sur le gâteau, c’est du PowerShell !

Selon la Bible technet, DSC est « une plateforme de gestion en PowerShell ». « Il permet le déploiement et la gestion des données de configuration pour les services et l’environnement sur lequel ces services doivent s’exécuter. ».

DSC dispose de deux modes de fonctionnement : Push et Pull. Le premier consiste à « pousser » ponctuellement une configuration sur un ou plusieurs serveurs. Le Pull repose sur un service web qui va être consommé par des machines afin de s’assurer qu’elles sont dans l’état de configuration attendu, et appliquer cette configuration le cas échéant.

Description & fonctionnalités

DSC est une nouvelle plateforme de gestion de Windows PowerShell qui permet de déployer et gérer les données de configuration des services logiciels, et de gérer l’environnement dans lequel ces services s’exécutent.

Elle réunit trois composants principaux :

  • Les configurations sont des scripts PowerShell déclaratifs qui définissent et configurent des instances de ressources.
    • Les configurations DSC sont également idempotent, c’est-à-dire que le Gestionnaire de configuration local (ou « LCM ») s’assure en permanence que les machines restent configurées dans l’état déclaré dans la configuration.
  • Les ressources sont les blocs de construction impératifs de DSC qui sont créés pour modéliser les divers composants d’un sous-système et implémenter le flux de contrôle de leurs différents états.
  • Le LCM est le moteur utilisé par DSC pour faciliter les interactions entre les ressources et les configurations. Le LCM interroge régulièrement le système, via le flux de contrôle implémenté par les ressources, pour s’assurer que le système est dans l’état déclaré dans une configuration. Si le système n’est pas dans l’état souhaité, le LCM utilise une logique supplémentaire à l’intérieur des ressources pour « faire en sorte » qu’il soit conforme à l’état déclaré dans la configuration.

 

Configuration DSC

Un script de configuration comprend les éléments suivants :

  • Le bloc Configuration. Il s’agit du bloc de script le plus externe. Pour le définir, utilisez le mot clé Configuration, puis attribuez-lui un nom. Ici, le nom de la configuration est « MyDscConfiguration ».
  • Un ou plusieurs blocs Node. Ils définissent les nœuds (ordinateurs ou machines virtuelles) que vous configurez.
  • Un ou plusieurs blocs de ressources. C’est là que la configuration définit les propriétés pour les ressources qu’elle configure. Ici, nous avons deux blocs de ressources qui appellent tous les deux la ressource « WindowsFeature ».

Exemple de configuration

Configuration MyDscConfiguration {
	
    [string[]]$ComputerName= “localhost”

    Node $ComputerName{
        WindowsFeature MyFeatureInstance {
            Ensure = "Present"
            Name = "RSAT"
        }
        WindowsFeature My2ndFeatureInstance {
            Ensure = "Present"
            Name = "Bitlocker"
        }
    }} 

MyDscConfiguration

 

Compilation de la configuration

Avant de pouvoir promulguer une configuration, vous devez la compiler dans un document MOF (Meta-Object-Facility).

Quand vous appelez la configuration, elle :

  • Crée un dossier dans le répertoire actif portant le même nom que la configuration.
  • Crée un fichier nommé nom_nœud.mof dans le nouveau répertoire, où nom_nœud correspond au nom du nœud cible de la configuration. S’il existe plusieurs nœuds, un fichier MOF est créé pour chaque nœud.

 

Utilisation de DependsOn

DSC applique les ressources dans l’ordre dans lequel elles figurent dans la configuration. DependsOn spécifie les ressources qui dépendent d’autres ressources, et le gestionnaire de configuration local permet de s’assurer qu’elles sont appliquées dans le bon ordre.

Configuration DependsOnExample {
	
	[string[]]$ComputerName=$env:COMPUTERNAME

	Node $ComputerName{
        Group GroupExample {
            Ensure = "Present"
            GroupName = "TestGroup"
        }

        User UserExample {
            Ensure = "Present"
            UserName = "TestUser"
            FullName = "TestUser"
            DependsOn = "[Group]GroupExample"
        }
    }
}

DependsOnExample

Nouvelles ressources dans la configuration

Un message d’avertissement survient lors du test des sources ci-dessus :

 

Actuellement, DSC est fourni avec 12 ressources contenues dans le module PSDesiredStateConfiguration. Les autres ressources des modules externes doivent être placées dans $env:PSModulePath pour être reconnues par le gestionnaire de configuration local. Une nouvelle applet de commande, Get-DscResource, peut être utilisée pour déterminer quelles ressources sont installées sur le système et lesquelles peuvent être utilisées par le gestionnaire de configuration local.

 

Ressources DSC

La force de PowerShell DSC réside dans les modules qui le composent. On dispose déjà de certaines ressources DSC par défaut (e.g. File pour faire une simple copie de fichier, ou encore WindowsFeature pour rajouter des rôles / fonctionnalités à un serveur).

En plus de cela, vous avez la possibilité de créer des ressources DSC personnalisées ainsi qu’une vaste communauté portée par l’équipe PowerShell Microsoft : https://github.com/PowerShell

Une ressource peut modéliser un élément générique comme un fichier ou spécifique comme un paramètre de serveur IIS. Les groupes de ce type de ressources sont combinés dans un module DSC qui organise tous les fichiers nécessaires dans une structure portable incluant les métadonnées permettant d’identifier la façon dont sont utilisées les ressources.

 

Ressources DSC intégrées

 

Ressources Description
Archive Gestion des fichiers .zip
Environnement Gestion des variables d’environnement système
File Gestion des fichiers et des dossiers
Group Mécanisme de gestion des groupes locaux
Log Gestion des logs
Package Gestion du mécanisme d’installation / désinstallation de pacakges (ex : msi)
Registry Gestion des clés et des valeurs de la base de registre
Script Gestion d’exécution de script et des codes retours
Service Mécanisme de gestion des services windows
User Gestion des comptes utilisateurs locaux
WindowsFeature Gestion des rôles et fonctionnalités de serveur
WindowsProcess Gestion des I/O

 

 

Créer des ressources DSC personnalisées

Une ressource DSC est un module Windows PowerShell. Le module contient à la fois le schéma (la définition des propriétés configurables) et l’implémentation (le code qui effectue le travail spécifié par une configuration) de la ressource. Un schéma de ressources DSC peut être défini dans un fichier MOF et l’implémentation est effectuée par un module de script. À partir de la version 5 des classes PowerShell, le schéma et l’implémentation peuvent être définis dans une classe.

 

Exemple

Les ressources DSC se trouvent par défaut à l’endroit suivant :
C:\Windows\System32\WindowsPowerShell\v1.0\Modules\PSDesiredStateConfiguration\DSCResources

 

Cas de MSFT_UserResource

Dans le répertoire dédié à cette ressource on retrouve les deux fichiers mentionnés ci-dessus, à savoir le module et son schéma associé.


Si on ouvre le fichier MSFT_UserResource installé par défaut dans la machine, cette ressource permet de créer un User. On y trouve en effet les trois fonctions (Get-TargetResource, Set-TargetResource et le Set-TargetResource).


La fonction Get-TargetResource effectue une vérification sur le user, assigne et retourne les valeurs des paramètres d’entrée utilisés dans les autres fonctions (Test et Set).

Les fonctions Test et Set utilisent à leur tour ces paramètres, dans les appels via le Local Configuration Manager, lors de l’exécution.  On retrouve par ailleurs dans les fonctions Test et Set les différents appels vers les cmdlet PowerShell pour tester l’existence et créer l’utilisateur.

 

Le deuxième fichier, compris dans le même répertoire, représente le schéma associé à la ressource.  Ce fichier contient principalement la spécification des paramètres de la ressource DSC ainsi que les contraintes (exemple : le paramètre Ensure ne prend que les valeurs « Present » ou « Absent »).

Gestionnaire de configuration locale

Le Gestionnaire de configuration local (ou « LCM ») est le moteur de la fonctionnalité DSC (Desired State Configuration) de Windows PowerShell. Le LCM s’exécute sur chaque nœud cible pour analyser et appliquer les configurations transmises au nœud. Il a également en charge plusieurs autres opérations liées à DSC, notamment les suivantes.

  • Déterminer le mode d’actualisation (push ou pull).
  • Spécifier la fréquence à laquelle un nœud extrait et applique les configurations.
  • Associer le nœud à des serveurs collecteurs.
  • Spécifier des configurations partielles.

 

Un type spécial de configuration vous permet de configurer le LCM pour définir chacun de ces comportements. Les sections qui suivent décrivent comment configurer le LCM.

Appelez et exécutez la configuration pour créer le fichier MOF de configuration, comme pour une configuration standard. À la différence d’une configuration standard, vous n’appliquez pas de configuration du gestionnaire de configuration local en appelant l’applet de commande Start-DscConfiguration. Appelez plutôt l’applet de commande Set-DscLocalConfigurationManager en spécifiant le chemin du fichier MOF de configuration comme paramètre. Après avoir appliqué la configuration, vous pouvez afficher les propriétés du gestionnaire de configuration local en appelant l’applet de commande Get-DscLocalConfigurationManager.

 

Une configuration du LCM peut contenir des blocs pour un ensemble limité de ressources uniquement. Dans l’exemple précédent, Settings est la seule ressource appelée. Voici les autres ressources disponibles :

  • ConfigurationRepositoryWeb : spécifie un serveur collecteur HTTP pour les configurations.
  • ConfigurationRepositoryShare : spécifie un serveur collecteur SMB pour les configurations.
  • ResourceRepositoryWeb : spécifie un serveur collecteur HTTP pour les modules.
  • ResourceRepositoryShare : spécifie un serveur collecteur SMB pour les modules.
  • ReportServerWeb : spécifie un serveur collecteur HTTP auquel les rapports sont envoyés.
  • PartialConfiguration : spécifie des configurations partielles.

 

[Bonus DEV] Extensibilité des ressources DSC

Microsoft publie quelque modules regroupant certaines ressources DSC via la technet gallery, en voici un exemple : http://gallery.technet.microsoft.com/scriptcenter/xDatabase-PowerShell-0db6cdaf
Le module xDatabase (x pour expérimental) regroupe deux ressources DSC, à savoir xDatabase et xDBPackage.  Pour utiliser ses ressources, il faut donc les télécharger et les décompresser vers le répertoire: C:\Windows\System32\WindowsPowerShell\v1.0\Modules

Dès lors, les ressources sont utilisables via un script DSC.

A noter qu’en fonction du mode de fonctionnement DSC choisi, la copie des fichiers de ressources DSC peut être obligatoire ou pas.  En effet, en mode Push les fichiers de ressources DSC doivent être copiés sur chacun des nœuds.  En revanche, en mode Pull, les fichiers doivent être copiés uniquement sur le serveur principal, en effet les nœuds effectuent un Pull des ressources nécessaires au moment de l’exécution, via l’appel au web service, aucune copie locale n’est donc requise dans cas.

 

Mode création :

Nous allons donc créer deux fichiers, un représentant le module, le second sera le schéma associé.  Ces deux fichiers sont dans un répertoire qu’on appellera AppPoolNETVersion et qui sera copié vers le chemin suivant :

C:\Windows\System32\WindowsPowerShell\v1.0\Modules\PSDesiredStateConfiguration\DSCResources

 

AppPoolNetVersion.schema.mof :


AppPoolNETVersion.psm1

 

Globalement, on vérifie dans le Test-TargetResource si la version courante correspond à la valeur attendue, sinon LCM appelle le Set-TargetResource qui assigne le VersionNumber à la propriété managedRuntimeVersion de l’application pool $AppPoolName
Voici le script DSC :


IIS Avant :

On exécute le script :

IIS Après :

La propriété a été modifiée, #Epic!

 

Il existe même une partie Linux

https://msdn.microsoft.com/fr-fr/powershell/dsc/lnxgettingstarted

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *