Powershell DSC: Installation d’un serveur Pull 1/2

Quelques mots sur Powershell DSC

Dans le monde de l’IT nous avons souvent le problème suivant: nous définissons des architectures et des processus d’exploitation de systèmes qui, avec le temps, commencent à varier d’un système à un autre. Les standards initiaux n’étaient valables qu’au début des mises en production, car ils ont évolués, d’autres besoins sont venus se greffer aux prérequis initiaux, et divers groupes d’exploitation les ont appliqués à leur façon. Et petit à petit, les standards et best practice laissent place aux exceptions.

Powershell Desired State Configuration (DSC) permet de garder une complète possession de son parc informatique, en appliquant des standards d’entreprise à travers la programmation de procédures et configurations, de s’assurer qu’ils sont appliqués. Et lorsque ces standards évoluent et que ces configurations sont mis à jour, le parc évolue aussi, le tout avec la stabilité nécessaire à toute Production car lorsque c’est mis en place, ce sont les systèmes qui viennent chercher leurs configurations, et si quelqu’un les modifie, les systèmes reviennent aux configurations définies par DSC. Et ça, mes amis, c’est le Graal de tout Sysadmin.

Powershell DSC est une extension de Powershell qui permet de:

  • Créer des configurations à travers la programmation sous Powershell et en utilisant des standards tels que MOF.
  • Définir des configurations simples comme l’ajout d’un fichier à un endroit donné, ou compliquée, comme l’exécution de scripts si des conditions sont réunies ou gérer des comptes et groupes locaux ou encore changer des clés de registre ou encore configurer des cartes réseau, activer ou désactiver des services, des parefeux, des règles de sécurité… la liste est longue.
  • Appliquer des configurations sur des serveurs ou postes de travail façon ciblée ou générique, soit en poussant ces configurations, soit en faisant en sorte que ces machines viennent chercher leurs configuration sur un serveur dédié. Ceci de façon répétitive.
  • S’assurer que si un serveur change de configuration, il revient à sa configuration initiale.
  • Créer des rapports de conformité.

Dans cet article nous allons voir comment on met en place un serveur qui contiendra toutes les configurations à appliquer à d’autres serveurs.

Nous allons mettre en place le serveur qu’on appelle PULL, y installer Powershell DSC, IIS, et configurer les modules d’extension pour le service Web Pull.

pullserver

Ce serveur sera en relation avec un contrôleur de domaine Active Directory car dans un des exemples il s’y appuiera pour récurer les noms des serveurs existants.

Le serveur Pull aura également un dossier partagé contenant des sources à appliquer aux nouveaux serveurs.

Nous avons ensuite des serveurs fraîchement installés, appelés dans l’exemple DC2 et SERVEUR1.

 Mise en place d’un serveur Pull

Pour démarrer la configuration de ce serveur en serveur Pull pour Powershell DSC, j’ai installé Windows 2012R2 en y ajoutant Powershell DSC comme fonctionnalité Windows:

DSCfeature

A noter qu’en ajoutant Powershell DSC, le serveur ajoute également les composants de IIS.

Récupérer le module de configuration pour DSC.

Extraire ce fichier zip dans $env:programFiles\WindowsPowershell\Modules

 

Vérifier que DSC est bien disponible à travers la commande Get-DSCResource:

 

 

Exécuter $env:programFiles\WindowsPowershell\Modules\xPSDesiredStateConfiguration\Examples\Sample_xDscWebService.ps1 afin de charger la fonction du même nom (bien mettre le point (.) devant pour invoquer le script :

execxDscload

Exécuter Sample_xDscWebService:

La commande crée un fichier mof qui contient toutes les configurations nécessaires pour créer nos services web. A noter que l’exemple s’appuie sur du trafic non chiffré.

Maintenant nous pouvons configurer notre serveur web avec DSC:

Vérification de ce qui s’est produit:

 

Vérifions si l’application web répond:IE

Afin d’utiliser les cmdlets Active Directory, nous devons charger le module servermanager et ajouter la feature RSAT-AD-Powershell. Ceci simplement parce que notre serveur PULL n’est pas un contrôleur de domaine:

 

Génération des configurations pour les nouveaux serveurs

Voici le script pour générer les configurations. Dans l’exemple nous allons:

  • Copier une arborescence de fichiers
  • Modifier une clé de registre

L’exemple va d’abord demander la liste des DCs à Active Directory. Et ensuite compléter cette liste avec un array de nouveaux serveurs. Finalement les configurations de chaque serveur et son checksum seront générés et placés dans le répertoire des configurations de DSC.

L’exemple va également créer un fichier CSV contenant les binômes Nom de serveur et GUID. Ce fichier sera utilisé lors de la découverte par les serveurs de leur propre configuration. DSC saura quelle configuration sera à appliquer à quel serveur.

Exécution du script de découverte des configurations à appliquer

Sur le nouveau serveur, nous allons simplement exécuter un script générique DiscoverConfiguration.ps1.

Voici le script:

Le script configure le Local Configuration Manager avec la règle d’aller chercher les configurations MOF depuis un serveur IIS.

Il indique aussi de vérifier si les configurations existantes sont conformes toutes les 30 mins. Et si c’est pas le cas, de ré-appliquer les configurations.

Voici l’exécution du script:

Vérification du Local Configuration Manager:

A noter que la configuration se mettra en place au bout de 30 minutes comme indiqué, que le mode choisi est ApplyAndAutoCorrect et finalement que la méthode de Refresh se fait à travers un Pull à travers un download sur un service Web.

Voici la clé et les fichiers créés sur le nouveau serveur:

regkey files

J’ai quand même essayé de supprimer les deux fichiers pour voir si DSC allait ré-appliquer la configuration, et 30 minutes plus tard ils ont réapparu. Puissant!

Attention quand même a ne pas mélanger DSC avec d’autres outils de configuration management. Si par exemple une GPO dit « 1 », et que DSC dit « 0 », les deux outils vont se livrer à une bataille sans fin pour appliquer leurs configurations respectives.

La révolution des DevOps a bien commencé.

L’article suivant va modifier le serveur PULL pour utiliser HTTPS et chiffrer ainsi le trafic.

Liens et références:

Article de Bruno Saille sur Technet. Cet article était parmi les plus clairs que j’ai pu lire à propos des serveurs Pull, et a grandement influencé mon article.

Local Configuration Manager

Built-In Windows PowerShell Desired State Configuration Resources

  • Pingback: Déploiement et configuration en IAAS Azure | Nouvelles Chroniques d'Amethyste()

  • Cadorex

    Bonjour,
    Merci beaucoup pour le tuto 🙂
    Je suis dans une ectreprise et je dois mettre en place DSC, mais sur un serveur 2008 r2.
    J’ai commencé par suivre ce site web  » https://davewyatt.wordpress.com/2014/06/07/how-to-install-a-dsc-pull-server-on-windows-2008-r2/  » mais je n’arrive pas à comprendre des lignes :

    – Run dism /online /Enable-Feature /FeatureName:ManagementOdata
    – Run dism /online /Enable-Feature /FeatureName:DSC-Service
    – Run $env:windir\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

    Si quelqu’un a plus d’explication je suis ok 🙂
    Merci beaucoup

    ps: je n’avais jamais touché le powershell 🙂

  • Hello Cadorex,
    La commande DISM est un outil qui permet de gérer les options installées. Dave Wyatt l’utilise pour installer les features DSC-Service (en gros DSC) et Management Odata (celà permet de créer le point d’entrée sur le site web pour récuperer le statut de conformité des configurations ) . Il y a des infos sur DISM ici: https://msdn.microsoft.com/fr-fr/library/hh825236.aspx.

    • Cadorex

      Merci Micky,
      Je vais aller voir tout cela de suite.

  • Cadorex

    Re-Bonjour Micky
    Je reviens vers vous encore pour avoir de l’aide.
    ( Merci pour les commandes )

    J’aimerais avoir plus d’explication sur cette commande : $env:programFiles\WindowsPowershell\Modules\xPSDesiredStateConfiguration\Examples\Sample_xDscWebService.ps1
    Pour résumé, cela ne fonctionne pas. J’ai donc test avec cette :

    ‘C:\programFiles\WindowsPowershell\Modules\xPSDesiredStateConfiguration\Examples\Sample_xDscWebService.ps1’

    Et j’ai ce résultat qui s’affiche sur le powershell : « >> »
    Donc par curiosité, j’ai tapé « Sample_xDscWebService » , rien ne s’affiche aussi.

    Cette commande est uniquement sous 2012?
    J’ai tout mes fichiers dans les bon répertoires, la commande :

    ls $env:programFiles\WindowsPowershell\Modules

    Si quelqu’un peut m’aider 🙂

    j’espère avoir été claire dans mes explications ;s

    Merci d’avance

    • Je devrais mettre à jour l’article, en fait il ne faut exécuter ce fichier tel quel, il faut l’exécuter à la façon Powershell: « . $env:programFiles\WindowsPowershell\Modules\xPSDesiredStateConfiguration\Examples\Sample_xDscWebService.ps1 ». C-a-d mettre le point devant, ainsi powershell charge le script dans le fichier. Cette façon de charger du code s’appelle dot-source, dot qui veut dire point :).

      Update: j’ai mis à jour l’article pour montrer comment exécuter, ou plutot dot-sourcer le fichier PS1 pour charger la fonction.
      L’idée est d’exécuter la fonction Sample_xDscWebService (la ligne d’après dans le tuto), or cette fonction est définie dans le fichier à charger, voilà.

    • Au fait, le prompt « >> » en Powershell, signifie que Powershell s’attend à plus, et offre, à travers ce prompt la possibilité de renseigner les commandes ou paramètres manquants. Clairement dans ce cas, ça nous montre seulement que le fichier PS1 en question n’est pas exécuté correctement.

      • Cadorex

        Merci pour la rapidité des réponses!!!!
        Je n’ai pas encore eu le temps de me pencher sur la commande après Update.
        Je verrais tout cela demain matin où lundi.
        je regarderais le fichier SP1 avec Notepad++, il doit surement avoir des lignes a renseigner….

        Merci encore 😉
        ———————————————————————————————————————————-
        Le message que j’avais sans le « . »

        Au caractère C:\Program
        Files\WindowsPowershell\Modules\xPSDesiredStateConfiguration\Examples\Sample_xDscWebService.ps1:15 : 64
        + Import-DSCResource -ModuleName xPSDesiredStateConfiguration
        + ~
        Impossible de charger le module « xPSDesiredStateConfiguration » : module introuvable.
        Au caractère C:\Program
        Files\WindowsPowershell\Modules\xPSDesiredStateConfiguration\Examples\Sample_xDscWebService.ps1:6 : 1
        + {
        + ~
        Accolade fermante « } » manquante dans le bloc d’instruction.
        Au caractère C:\Program
        Files\WindowsPowershell\Modules\xPSDesiredStateConfiguration\Examples\Sample_xDscWebService.ps1:50 : 2
        + }
        + ~
        Jeton inattendu « } » dans l’expression ou l’instruction.
        + CategoryInfo : ParserError: (:) [], ParseException
        + FullyQualifiedErrorId : ModuleNotFoundDuringParse

        Avec le « . »

        PS C:\> . \$env:programFiles\WindowsPowershell\Modules\xPSDesiredStateConfiguration\Examples\Sample_xDscWebService.ps1
        . : Le terme «\C:\Program
        Files\WindowsPowershell\Modules\xPSDesiredStateConfiguration\Examples\Sample_xDscWebService.ps1» n’est pas reconnu
        comme nom d’applet de commande, fonction, fichier de script ou programme exécutable. Vérifiez l’orthographe du nom, ou
        si un chemin d’accès existe, vérifiez que le chemin d’accès est correct et réessayez.
        Au caractère Ligne:1 : 3
        + . \$env:programFiles\WindowsPowershell\Modules\xPSDesiredStateConfiguration\Exam …
        + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo : ObjectNotFound: (\C:\Program Fil…cWebService.ps1:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException

        • Cadorex

          Désolé pour le dérangement ^^
          Merci beaucoup pour votre temps

          • Dans la 2eme version de l’exécution de la commande (dot-source) il y a un \ en trop au début.

            Concernant le premier test, on dirait que le module xPSDesiredStateConfiguration n’est pas correctement installé, le module s’affiche lorsque tu fais Get-DSCResource ? Le folder xPSDesiredStateConfiguration est-il bien positionné sous: $env:programFiles\WindowsPowershell\Modules ?

  • Cadorex

    Bonjour 😉
    Voici ce que me donne la commande :

    PS C:\Users\bgbr> Get-DscResource

    ImplementedAs Name Module Properties
    ————- —- —— ———-
    Binary File {DestinationPath, Attributes, Checksum, Con…
    PowerShell Archive PSDesiredStateConfiguration {Destination, Path, Checksum, DependsOn…}
    PowerShell Environment PSDesiredStateConfiguration {Name, DependsOn, Ensure, Path…}
    PowerShell Group PSDesiredStateConfiguration {GroupName, Credential, DependsOn, Descript…
    Binary Log PSDesiredStateConfiguration {Message, DependsOn}
    PowerShell Package PSDesiredStateConfiguration {Name, Path, ProductId, Arguments…}
    PowerShell Registry PSDesiredStateConfiguration {Key, ValueName, DependsOn, Ensure…}
    PowerShell Script PSDesiredStateConfiguration {GetScript, SetScript, TestScript, Credenti…
    PowerShell Service PSDesiredStateConfiguration {Name, BuiltInAccount, Credential, DependsO…
    PowerShell User PSDesiredStateConfiguration {UserName, DependsOn, Description, Disabled…
    PowerShell WindowsFeature PSDesiredStateConfiguration {Name, Credential, DependsOn, Ensure…}
    PowerShell WindowsProcess PSDesiredStateConfiguration {Arguments, Path, Credential, DependsOn…}
    PowerShell xArchive xPSDesiredStateConfiguration {Destination, Path, CompressionLevel, Depen…
    PowerShell xDSCWebService xPSDesiredStateConfiguration {CertificateThumbPrint, EndpointName, Confi…
    Composite xFileUpload xPSDesiredStateConfiguration {destinationPath, sourcePath, credential, c…
    PowerShell xGroup xPSDesiredStateConfiguration {GroupName, Credential, DependsOn, Descript…
    PowerShell xPackage xPSDesiredStateConfiguration {Name, Path, ProductId, Arguments…}
    PowerShell xPSEndpoint xPSDesiredStateConfiguration {Name, AccessMode, DependsOn, Ensure…}
    PowerShell xRemoteFile xPSDesiredStateConfiguration {DestinationPath, Uri, Credential, DependsO…
    PowerShell xService xPSDesiredStateConfiguration {Name, BuiltInAccount, Credential, Dependen…
    PowerShell xWindowsOptionalFeature xPSDesiredStateConfiguration {Name, DependsOn, Ensure, LogLevel…}
    PowerShell xWindowsProcess xPSDesiredStateConfiguration {Arguments, Path, Credential, DependsOn…}

    • Cadorex

      Pou résumé :
      -J’ai un serveur 2008 R2 ( avec IIS d’installé)
      – Suivie le tuto de Dave Wyatt’s ( Grace a votre aide ):
      https://davewyatt.wordpress.com/2014/06/07/how-to-install-a-dsc-pull-server-on-windows-2008-r2/

      – Pour finir j’ai basculé sur votre blog : a partir d’ici ( Récupérer le module de configuration pour DSC…)

      Ps : Est-il possible de commenter avec des images a ‘appui?

      • Je crois qu’il faut passer par un site tiers pour stocker des images et ensuite laisser l’url ici.

        En tout cas je pense qu’il faut reprendre de l’exécution de :

        . $env:programFiles\WindowsPowershell\Modules\xPSDesiredStateConfiguration\Examples\Sample_xDscWebService.ps1

        et pas:

        . \$env:programFiles\WindowsPowershell\Modules\xPSDesiredStateConfiguration\Examples\Sample_xDscWebService.ps1

  • Minotte

    Bonjour,

    Si ça peux aider certaines personnes qui ont rencontré le problème de Cadorex et Moi entre autre même si ça date, il suffit juste de mettre son serveur à jour.

    Cordialement