15/11/2024

Déployer un hôte Hyper-V avec PowerShell DSC

I. Présentation

PowerShell DSC est une solution rapide et pratique pour déployer rapidement le rôle Hyper-V sur un nouveau serveur. En exécutant une configuration déjà prête, on pourra installer le rôle Hyper-V et ses outils, puis commencer déjà à préparer sa configuration.

C'est ce que nous allons voir dans ce chapitre qui vient se greffer à la fin du cours "Débuter avec PowerShell DSC".

II. Rédiger la configuration

La rédaction de la configuration va se dérouler en plusieurs étapes, afin que ce soit compréhensible.

On va commencer par ouvrir PowerShell ISE, puis insérer ce bout de code :

Configuration BuildHyperVHost{
    # Paramètres
    param([string]$NodeName = "localhost")
    # Importer les modules/ressources
    Import-DscResource –ModuleName xHyper-V
    Import-DscResource -ModuleName PSDesiredStateConfiguration
}

Le début de code ci-dessus permet de déclarer une configuration nommée "BuildHyperVHost" dans laquelle on déclare le paramètre $NodeName qui a une valeur inscrite en dure correspondante  au nom du serveur cible. En l'occurrence "localhost" puisque l'on exécutera la configuration directement en local sur l'hôte fraîchement installé.

On importe également deux modules que l'on va utiliser dans cette configuration, le module xHyper-V n'étant pas natif, il faudra l'installer :

Install-Module xHyper-V

La commande ci-dessus n'est pas à intégrer dans le bloc de configuration mais doit être exécutée au préalable pour installer le module xHyper-V. Ce module sera utilisé pour créer un vSwitch suite à l'installation du rôle Hyper-V.

Sous l'importation des modules, on va déclarer notre bloc de configuration pour l'hôte :

    node $NodeName {
    }

Puis on va le remplir, pour commencer, avec trois blocs permettant d'installer respectivement le rôle Hyper-V, le module Hyper-V pour PowerShell et enfin la console d'administration Hyper-V. Dans l'ordre, ces fonctionnalités doivent être appelées par les noms suivants : Hyper-V, Hyper-V-Powershell, Hyper-V-Tools.

Ce qui nous donnera le code suivant à ajouter dans le bloc "node" :

        # Role Hyper-V
        WindowsFeature "Hyper-V" {
            Name="Hyper-V"
            Ensure="Present"
        }
        # Module Hyper-V pour PowerShell
        WindowsFeature "Hyper-V-PS" {
            Name="Hyper-V-PowerShell"
            Ensure="Present"
            DependsOn = "[WindowsFeature]Hyper-V"
        }
        # Outils d'administration Hyper-V
        WindowsFeature "Hyper-V-Tools" {
            Name="Hyper-V-Tools"
            Ensure="Present"
            DependsOn = "[WindowsFeature]Hyper-V"
        }

Avec cette configuration, on se retrouverait avec un Hyper-V installé, mais on va allez un petit peu plus loin... En effet, on va créer un dossier nommé "VMs" qui pourra servir à stocker les VMs et aussi nous allons créer un commutateur virtuel nommé "LAN" qui s'appuiera sur une carte physique du serveur, l'objectif étant de créer un réseau - externe - pour connecter les VMs au réseau local.

Pour créer le dossier "VMs" on utilise la ressource "File" incluse dans le module PSDesiredStateConfiguration. Le code sera le suivant pour créer le répertoire "V:\VM" :

        # Créer le répertoire "VM"
        File VMsFolder
        {
            Type = "Directory"
            DestinationPath = "V:\VM"
            Ensure = "Present"
        }

Cette ressource est simple à utiliser, on indique le type qui peut être un fichier ou un dossier, ainsi que le chemin de destination, puis le tour est joué ! 🙂 - Il faudra penser à modifier les paramètres Hyper-V manuellement pour lui dire qu'il utilise ce dossier pour stocker ses machines virtuelles.

Pour la création du vSwitch, on s'appuie sur la ressource "xVMSwitch" du module xHyper-V que nous avons installés. Avant de vous donner le bout de code, voici quelques infos sur les paramètres de cette ressource :

  • Name : Nom du vSwitch
  • Type : External, Internal ou Private - Selon le type de vSwitch que l'on veut créer, ceci correspond aux 3 modes proposés dans Hyper-V
  • NetAdapterName : Nom de la carte réseau physique que l'on souhaite associée au vSwitch
  • AllowManagementOS : Booléen qui permet d'indiquer si l'on souhaite activer ou non l'option "Autoriser le système d'exploitation de gestion à partager cette carte réseau" - Activez cette option notamment si le serveur physique doit pouvoir continuer à utiliser cette interface, sinon elle sera réservée aux VMs.

Voilà maintenant je peux vous donner la déclaration de cette ressource à ajouter à la configuration :

        # Créer un vSwitch sur l'hôte Hyper-V
        xVMSwitch "vSwitchLAN"
        {
            Name = "LAN"
            Type = "External"
            NetAdapterName = "Ethernet"
            AllowManagementOS = $true
            Ensure = "Present"
            DependsOn = "[WindowsFeature]Hyper-V"
        }

Ce qui nous donnera la configuration complète suivante :

Configuration BuildHyperVHost{
    # Paramètres
    param([string]$NodeName = "localhost")
    # Importer les modules/ressources
    Import-DscResource –ModuleName xHyper-V
    Import-DscResource -ModuleName PSDesiredStateConfiguration
    node $NodeName {
        # Role Hyper-V
        WindowsFeature "Hyper-V" {
            Name="Hyper-V"
            Ensure="Present"
        }
        # Module Hyper-V pour PowerShell
        WindowsFeature "Hyper-V-PS" {
            Name="Hyper-V-PowerShell"
            Ensure="Present"
            DependsOn = "[WindowsFeature]Hyper-V"
        }
        # Outils d'administration Hyper-V
        WindowsFeature "Hyper-V-Tools" {
            Name="Hyper-V-Tools"
            Ensure="Present"
            DependsOn = "[WindowsFeature]Hyper-V"
        }
        # Créer le répertoire "VM"
        File VMsFolder
        {
            Type = "Directory"
            DestinationPath = "V:\VM"
            Ensure = "Present"
        }
        # Créer un vSwitch sur l'hôte Hyper-V
        xVMSwitch "vSwitchLAN"
        {
            Name = "LAN"
            Type = "External"
            NetAdapterName = "Ethernet"
            AllowManagementOS = $true
            Ensure = "Present"
            DependsOn = "[WindowsFeature]Hyper-V"
        }
    }
}

III. Générer le fichier compilé et pousser la configuration

On va désormais appeler la configuration par son nom pour générer le fichier compilé pour le noeud "localhost" (on exécute la config en local sur le serveur à configurer) :

BuildHyperVHost

Puis, ensuite, on pousse la configuration pour appliquer nos directives :

Start-DscConfiguration -Path .\BuildHyperVHost -Wait -Verbose -Force

Lors de l'exécution de la configuration, pour qu'elle puisse se terminer entièrement (création du vSwitch), le serveur devra être redémarré pour finaliser l'installation du rôle Hyper-V.

Je tiens à préciser que configuration PowerShell DSC fonctionne sous Windows Server 2016 🙂

dsc-hyper-v-1

dsc-hyper-v-2

On pourrait aller un peu plus loin en ajoutant dans la configuration l'intégration au domaine, ceci est possible notamment avec la ressource "xComputer" du module "xComputerManagement".

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail