Déployer un hôte Hyper-V avec PowerShell DSC
Sommaire
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 🙂
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".