PowerShell DSC : Installer un serveur Pull
Sommaire
I. Présentation
PowerShell DSC peut fonctionner de deux manières différentes : en mode push, qui est le mode par défaut et où l’on pousse les configurations sur les nœuds distants, et le mode pull qui est un mode encore plus intéressant puisque ce sont les nœuds qui viennent chercher les configurations à intervalle régulier sur un serveur, que l’on qualifiera de serveur pull.
Pour venir tirer les configurations sur le serveur pull, les nœuds distants peuvent utiliser trois méthodes différentes : SMB, HTTP, HTTPS.
Dans ce tutoriel, nous allons installer un serveur Pull en mettant en place le mode « http » qui est basé sur IIS, et qui est un premier pas dans la mise en place d’un serveur pull avant de le sécuriser en HTTPS, mais ceci fera plutôt l’objet d’un autre tutoriel. Enfin, nous allons configurer les nœuds cibles (serveurs) pour qu’ils sachent que le mode pull est utilisé et paramétrer le LCM comme on le souhaite.
Le LCM, pour Local Configuration Manager, c’est le gestionnaire local à chaque serveur qui contient la configuration DSC du serveur.
II. Serveur Pull, nœuds cibles et GUID
Le serveur pull que je vais utiliser est une machine virtuelle qui tourne sous Windows Server 2016 Technical Preview 4 (vous pouvez utiliser une autre version, comme Windows Server 2012 R2).
Pour les nœuds cibles, il s’agit exclusivement de machines virtuelles sous Windows Server 2012 R2, ainsi qu’un hyperviseur Hyper-V, sous Windows Server 2012 R2 également.
Lorsque l’on fonctionne en mode par défaut, à savoir en mode push, chaque fichier MOF prend pour nom celui du nœud cible. Par exemple, si le serveur cible se nomme « ADDS01 » alors le fichier MOF se nommera « ADDS01.mof ».
Lorsque l’on fonctionne en mode pull, un GUID est attribué à chaque nœud cible et un fichier MOF destiné à un nœud cible se nommera par son GUID suivi de l’extension MOF. Le GUID n’est pas attribué automatiquement, il doit être paramétré dans le LCM du nœud. Ce que je propose dans ce tutoriel c’est qu’on récupère le GUID de chaque serveur dans l’Active Directory, et qu’on l’utilise comme GUID pour le LCM. Ainsi, vous aurez une certaine logique dans le GUID attribué à chaque serveur, et il sera plus facile de retrouver à quel serveur appartient chaque GUID.
III. Mise en place du serveur Pull
On va commencer par mettre en place le serveur Pull avant de configurer les nœuds clients. Un service lié à DSC doit être installé, ce qui constitue la première étape de l’installation. Voici la commande à exécuter pour installer cette fonctionnalité :
Install-WindowsFeature -Name DSC-Service -IncludeManagementTools
Le fait d’inclure l’installation des outils de gestion permet d’installer la console IIS.
Pour continuer l’installation, on va s’appuyer sur le module « xPSDesiredStateConfiguration » qui fournit tout un lot de ressources DSC dont « xDSCWebService » qui permet de configurer les services web au sein d’IIS pour Powershell DSC.
Pour le télécharger : xPSDesiredStateConfiguration
Une fois le ZIP obtenu, on va le copier dans le répertoire des modules Powershell, situé dans « C:\Program Files\WindowsPowerShell\Modules\ ». Vous pourrez vérifier le chemin vers le répertoire des modules en appelant la variable « $env:PSModulePath »
Pour s’assurer de la présence du module, on exécute la commande « Get-DscResource » et vous devez voir de nouvelles ressources apparaître, faisant référence à « xPSDesiredStateConfiguration ».
Ce module est très complet, à tel point qu’il contient des fichiers exemples, on va s’appuyer sur le fichier « Sample_xDscWebService.ps1 » que vous trouverez dans le sous-répertoire « Examples » du module.
Si vous regardez le contenu de ce script, vous verrez qu’il configure le nœud local, qu’il s’assure que la fonctionnalité DSC-Service est bien installé (ce qui signifie que l’on aurait pu ne pas l’installer au début), et qu’il configure ensuite deux sites dans IIS : PSDSCPullServer et PSDSCComplianceServer, ils écoutent respectivement sur les ports 8080 et 9080.
Pour exécuter ce script, utilisez la commande suivante (n’oubliez pas le point) :
. $env:ProgramFiles\WindowsPowerShell\Modules\xPSDesiredStateConfiguration\Examples\Sample_xDscWebService.ps1
Et on génère le fichier MOF en appelant par son nom la configuration, puis on précise un paramètre supplémentaire pour dire que l’on autorise le trafic non chiffré, autrement dit qu’on veut fonctionner en http. Ce paramètre est défini dans le fichier exemple, et c’est fort utile.
Sample_xDscWebService -certificateThumbPrint AllowUnencryptedTraffic
Pour finir, on exécute la configuration DSC :
Start-DscConfiguration .\Sample_xDscWebService\ -Verbose -Wait -Force
Dans la console Powershell dès que l’exécution est terminée, envoyez la commande « Get-DscConfiguration » et vous verrez divers paramètres apparaître en lien avec le mode pull.
On peut même en profiter pour vérifier que le serveur IIS est bien en ligne, en accédant aux sites créés pour DSC.
Le serveur pull est fin prêt, on va s’attaquer à la configuration des nœuds clients.
IV. Configurer les nœuds cibles en mode Pull
Tout d’abord, sachez que si vos serveurs cibles ne sont pas au minimum sous Windows Server 2012, il va falloir installer le Windows Management Framework 4.0 (minimum) et configurer le WinRM pour la gestion à distance, ces deux composants étant essentiels au bon fonctionnement de Powershell DSC.
Ce que je vous propose pour commencer, c’est de récupérer dans l’Active Directory le nom et le GUID de chacun de vos serveurs, ces informations seront utiles par la suite. Pour procéder, soit vous le faite directement depuis un contrôleur de domaine, soit vous le faites directement depuis votre serveur pull mais ceci nécessite l’installation du module Active Directory pour Powershell.
Pour récupérer le nom et le GUID de chaque objet ordinateur qui a comme système d’exploitation « Windows Server », utilisez cette commande :
Get-ADComputer -Filter { OperatingSystem -Like "Windows Server*" } | ft Name,ObjectGUID
Nous allons toutefois préférer la commande ci-dessous pour exporter directement dans un fichier CSV ces informations :
Get-ADComputer -Filter { OperatingSystem -Like "Windows Server*" } | Select-Object Name,ObjectGUID | Export-CSV -Path C:\ad-guid.csv -Delimiter ";" -NoTypeInformation
Un joli fichier CSV sera obtenu :
Ensuite, il va falloir créer un script pour :
- Définir une configuration DSC pour le LCM (URL du serveur, mode pull, délai de rafraichissement définit à 60 minutes, GUID, etc.)
- Générer un fichier MOF pour chaque serveur en utilisant le bon GUID (depuis le CSV)
Sans plus attendre, voici le code du script que je vous propose et qui contient deux paramètres obligatoires : $GUID et $Node.
# On définit la configuration souhaitée pour le LCM
Configuration ConfigurePullLCM
{
param([parameter(Mandatory=$true)][string]$GUID,
[parameter(Mandatory=$true)][string[]]$Node
)
Node $Node{
LocalConfigurationManager
{
ConfigurationID = $GUID;
RefreshMode = "PULL";
RebootNodeIfNeeded = $true;
RefreshFrequencyMins = 60;
ConfigurationModeFrequencyMins = 60;
ConfigurationMode = "ApplyAndAutoCorrect";
DownloadManagerName = "WebDownloadManager";
DownloadManagerCustomData = @{ServerUrl = "http://manager01.it-connect.local:8080/PSDSCPullServer.svc"; AllowUnsecureConnection = "TRUE"}
}
}
}
# On stocke en variable le contenu du fichier CSV
$CSV = Import-Csv "C:\DSC\CSV\ad-guid.csv" -Delimiter ";"
# Pour chaque serveur, on prend le GUID et le nom puis on génère un fichier MOF
foreach($entry in $CSV){
ConfigurePullLCM -GUID $entry.ObjectGUID -Node $entry.Name
}
# On exécute la configuration du LCM sur chaque noeud
Set-DscLocalConfigurationManager -Path "C:\DSC\ConfigurePullLCM" -Verbose -Credential (Get-Credential)
Ce script va donc dans un premier temps générer les fichiers MOF pour chaque serveur. On remarquera que les fichiers se nomment en réalité « serveur.meta.mof », ceci est dû au fait que le script concerne la configuration du LCM.
On pourrait avoir dans la même configuration, une configuration du LCM et une configuration autre via une ressource, il y aurait donc deux fichiers MOF : un avec la configuration du LCM et un autre avec la configuration liée à la ressource utilisée.
Lorsque la configuration du LCM se déploie sur chaque nœud, le mode verbose donne des informations sur le déroulement, voici un extrait :
Set-DscLocalConfigurationManager -Path "C:\DSC\ConfigurePullLCM" -Verbose -Credential (Get-Credential)
applet de commande Get-Credential à la position 1 du pipeline de la commande
Fournissez des valeurs pour les paramètres suivants :
COMMENTAIRES : Opération « Start-DscConfiguration: SendMetaConfigurationApply » en cours sur la cib
le « MSFT_DSCLocalConfigurationManager ».
COMMENTAIRES : Effectuez l’opération « Invoquer une méthode CIM » avec les paramètres suivants : « 'methodName' = SendMetaConfigurationApply,'className' = MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration ».
COMMENTAIRES : Effectuez l’opération « Invoquer une méthode CIM » avec les paramètres suivants : « 'methodName' = SendMetaConfigurationApply,'className' = MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration ».
COMMENTAIRES : Effectuez l’opération « Invoquer une méthode CIM » avec les paramètres suivants : « 'methodName' = SendMetaConfigurationApply,'className' = MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration ».
COMMENTAIRES : Effectuez l’opération « Invoquer une méthode CIM » avec les paramètres suivants : « 'methodName' = SendMetaConfigurationApply,'className' = MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration ».
COMMENTAIRES : Effectuez l’opération « Invoquer une méthode CIM » avec les paramètres suivants : « 'methodName' = SendMetaConfigurationApply,'className' = MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration ».
COMMENTAIRES : Effectuez l’opération « Invoquer une méthode CIM » avec les paramètres suivants : « 'methodName' = SendMetaConfigurationApply,'className' = MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration ».
COMMENTAIRES : Un appel de méthode du Gestionnaire de configuration local est arrivé de l'ordinateur MANAGER01 avec le SID utilisateur S-1-5-21-1580586848-2890924796-1949041167-500.
COMMENTAIRES : [MANAGER01] : Gestionnaire de configuration local : [ Début Définir ]
COMMENTAIRES : Un appel de méthode du Gestionnaire de configuration local est arrivé de l'ordinateur MANAGER01 avec le SID utilisateur S-1-5-21-1580586848-2890924796-1949041167-500.
COMMENTAIRES : [MANAGER01]: LCM: [ Début Ressource] [MSFT_DSCMetaConfiguration]
COMMENTAIRES : [MANAGER01]: LCM: [ Début Définir ] [MSFT_DSCMetaConfiguration]
COMMENTAIRES : [FLOHYPERVISOR] : Gestionnaire de configuration local : [ Début Définir ]
COMMENTAIRES : [MANAGER01]: LCM: [ Fin Définir ] [MSFT_DSCMetaConfiguration] en 0.0310 secondes.
COMMENTAIRES : Un appel de méthode du Gestionnaire de configuration local est arrivé de l'ordinateur MANAGER01 avec le SID utilisateur S-1-5-21-1580586848-2890924796-1949041167-500.
COMMENTAIRES : Un appel de méthode du Gestionnaire de configuration local est arrivé de l'ordinateur MANAGER01 avec le SID utilisateur S-1-5-21-1580586848-2890924796-1949041167-500.
COMMENTAIRES : [WDS01] : Gestionnaire de configuration local : [ Début Définir ]
COMMENTAIRES : [MANAGER01]: LCM: [ Fin Ressource] [MSFT_DSCMetaConfiguration]
COMMENTAIRES : [FLOHYPERVISOR]: LCM: [ Début Ressource] [MSFT_DSCMetaConfiguration]
COMMENTAIRES : [FLOHYPERVISOR]: LCM: [ Début Définir ] [MSFT_DSCMetaConfiguration]
COMMENTAIRES : [ADDS01] : Gestionnaire de configuration local : [ Début Définir ]
COMMENTAIRES : [WDS01]: LCM: [ Début Ressource] [MSFT_DSCMetaConfiguration]
COMMENTAIRES : [WDS01]: LCM: [ Début Définir ] [MSFT_DSCMetaConfiguration]
COMMENTAIRES : [FLOHYPERVISOR]: LCM: [ Fin Définir ] [MSFT_DSCMetaConfiguration] en 0.0310 secondes.
COMMENTAIRES : [FLOHYPERVISOR]: LCM: [ Fin Ressource] [MSFT_DSCMetaConfiguration]
COMMENTAIRES : [ADDS01]: LCM: [ Début Ressource] [MSFT_DSCMetaConfiguration]
COMMENTAIRES : [WDS01]: LCM: [ Fin Définir ] [MSFT_DSCMetaConfiguration] en 0.0170 secondes.
COMMENTAIRES : [WDS01]: LCM: [ Fin Ressource] [MSFT_DSCMetaConfiguration]
COMMENTAIRES : [ADDS01]: LCM: [ Début Définir ] [MSFT_DSCMetaConfiguration]
COMMENTAIRES : [MANAGER01] : Gestionnaire de configuration local : [ Fin Définir ]
COMMENTAIRES : [MANAGER01] : Gestionnaire de configuration local : [ Fin Définir ] en 0.1240 secondes.
COMMENTAIRES : [ADDS01]: LCM: [ Fin Définir ] [MSFT_DSCMetaConfiguration] en 0.0750 secondes
COMMENTAIRES : [ADDS01]: LCM: [ Fin Ressource] [MSFT_DSCMetaConfiguration]
COMMENTAIRES : [WDS01] : Gestionnaire de configuration local : [ Fin Définir ]
COMMENTAIRES : [WDS01] : Gestionnaire de configuration local : [ Fin Définir ] en 0.1270 secondes.
COMMENTAIRES : L’opération « Invoquer une méthode CIM » est terminée.
COMMENTAIRES : [FLOHYPERVISOR] : Gestionnaire de configuration local : [ Fin Définir ]
COMMENTAIRES : [FLOHYPERVISOR] : Gestionnaire de configuration local : [ Fin Définir ] en 0.2190 secondes.
COMMENTAIRES : [ADDS01] : Gestionnaire de configuration local : [ Fin Définir ]
COMMENTAIRES : [ADDS01] : Gestionnaire de configuration local : [ Fin Définir ] en 0.1720 secondes.
COMMENTAIRES : L’opération « Invoquer une méthode CIM » est terminée.
COMMENTAIRES : L’opération « Invoquer une méthode CIM » est terminée.
COMMENTAIRES : L’opération « Invoquer une méthode CIM » est terminée.
Dès que l’exécution est terminée, on peut vérifier sur un nœud que la configuration est bien appliquée. Il suffit d’exécuter en local sur le nœud la commande :
Get-DscLocalConfigurationManager
On verra notamment le « ConfigurationID » qui est bien identique à celui du fichier CSV et donc de l’objet dans l’AD correspondant à ce serveur. Essentiel également, le « RefreshMode » qui est bien positionné sur « Pull » et le délai de rafraîchissement de 60 minutes qui est bien appliqué (RefreshFrequencyMins).
Ce chapitre est terminé, notre serveur pull est fonctionnel, désormais d’autres étapes nous attendent au sein d’autres chapitres, notamment la création des configurations pour les nœuds et les mettre à disposition sur le serveur pull.