Serveur d'impression

Utilisation de PowerShell pour localiser un ordinateur virtuel Hyper-V – Serveur d’impression

Le 29 septembre 2019 - 7 minutes de lecture

Hyper-V est un environnement dynamique et les ordinateurs virtuels peuvent facilement passer d’un hôte à l’autre. Cependant, vous devrez peut-être parfois savoir sur quel hôte Hyper-V une machine virtuelle particulière est en cours d'exécution pour pouvoir exécuter une sorte de tâche de gestion sur la machine virtuelle. PowerShell facilite la localisation d'une seule machine virtuelle parmi un grand nombre d'hôtes Hyper-V.

Recherche d'un ordinateur virtuel Hyper-V: la méthode rapide et sale

Il existe différentes manières d'effectuer le travail. La méthode à utiliser varie en fonction du nombre d'hôtes que vous avez et de la fréquence à laquelle vous devez localiser une machine virtuelle spécifique. Si vous cherchez simplement un moyen rapide et sale de trouver une machine virtuelle particulière, vous pouvez utiliser une commande comme celle-ci:

Get-VM -ComputerName ,, -VMName -ErrorAction SilentlyContinue | Nom-objet-VMName, ComputerName

Si vous deviez exécuter cette commande dans la vie réelle, vous remplaceriez , , et avec les noms de vos hôtes Hyper-V (les adresses IP ne fonctionnent que dans des circonstances très spécifiques). Vous voudriez aussi remplacer avec le nom de la machine virtuelle que vous recherchez.

Lorsque vous exécutez cette commande, chacun de vos hôtes Hyper-V vérifie si la machine virtuelle spécifiée existe. Si la machine virtuelle n'existe pas sur un hôte particulier, PowerShell masque le message d'erreur qui serait normalement affiché. Si la machine virtuelle existe, PowerShell affiche le nom de la machine virtuelle et le nom de l'hôte sur lequel réside la machine virtuelle. Vous pouvez voir un exemple dans la figure ci-dessous.


Comme vous pouvez le voir sur la figure, cette technique fonctionne vraiment bien. Néanmoins, l’utilisation de cette méthode présente quelques inconvénients. Pour commencer, vous devez entrer le nom ou l'adresse IP de vos hôtes Hyper-V. Ce n’est probablement pas un problème si vous n’avez que quelques hôtes, mais si vous avez plus de trois ou quatre hôtes, cela peut rapidement devenir une corvée fastidieuse.

L’autre inconvénient de cette approche est que la commande nous donne les informations requises, mais qu’elle ne fait rien avec. Cette approche serait beaucoup plus utile si le nom de la machine virtuelle et le nom de l'hôte étaient écrits dans des variables afin que nous puissions exécuter des commandes supplémentaires. Par exemple, nous souhaitons peut-être établir une session à distance avec l'hôte ou initier une migration en direct ou quelque chose du genre. Le tout pourrait être automatisé si nous pouvions mettre le nom de la VM et le nom de son hôte dans des variables.

Utiliser un fichier texte

Une façon de vous épargner en tapant est de créer un fichier texte contenant les noms de vos hôtes Hyper-V. Vous pouvez ensuite demander à PowerShell de lire les noms de ce fichier afin de ne pas avoir à les saisir à chaque fois.

Pour les besoins de cet article, j'ai créé un fichier nommé C: Scripts HostList.txt. Ce fichier répertorie le nom ou l'adresse IP de chacun de mes hôtes Hyper-V. Chaque hôte apparaît sur une ligne distincte. J'ai ensuite écrit un court script qui fait exactement la même chose que la commande que je vous ai montrée plus tôt, sauf qu'il extrait les noms d'hôtes de mon fichier texte. Voici à quoi ressemble le script:

$ HyperVHosts = Get-Content 'c:  scripts  HostList.txt'
ForEach ($ IndividualHost dans $ HyperVHosts)

Get-VM -ComputerName $ IndividualHost -VMName  -ErrorAction SilentlyContinue 

La première ligne de code indique à PowerShell de lire le contenu du fichier dans une variable appelée $ HyperVHosts. J'ai ensuite créé une boucle qui examine chaque hôte répertorié dans le fichier texte. L'hôte en cours de vérification est référencé par la variable $ IndividalHost. Vous pouvez voir mon code et la sortie du script dans la figure suivante.

Utiliser des variables

Jusqu'à présent, nous avons résolu le problème de devoir taper une longue liste d'hôtes, mais nous devons néanmoins placer le nom de la machine virtuelle et le nom de son hôte actuel dans les variables que nous pouvons utiliser à d'autres fins. Si vous regardez la capture d'écran précédente, vous pouvez voir que j'ai codé en dur le nom de la machine virtuelle que je cherche, mais il serait tout aussi facile d'accepter le nom de la machine virtuelle en tant qu'entrée.

J'ai accompli cela en ajoutant une ligne de code au début du script:

$ VM = Read-Host "Veuillez saisir le nom de la machine virtuelle que vous recherchez."

Cette ligne invite l'utilisateur à entrer un nom de machine virtuelle, puis écrit ce nom dans une variable appelée $ VM. J'ai ensuite référencé cette variable dans la commande Get-VM. Vous pouvez voir le script et sa sortie dans la figure ci-dessous.

Nous avons donc maintenant une variable qui contient le nom de la machine virtuelle. La dernière chose à faire est d’écrire le nom de l’hôte de la machine virtuelle dans une variable. Voici comment cela se fait:

$ VM = Read-Host "Veuillez saisir le nom de la machine virtuelle que vous recherchez."
$ HyperVHosts = Get-Content 'c:  scripts  HostList.txt'
ForEach ($ IndividualHost dans $ HyperVHosts)

Get-VM -ComputerName $ IndividualHost -VMName $ VM -ErrorAction SilentlyContinue 
Write-Host "La machine virtuelle" $ VM "est hébergée sur" $ VMHost

Comme vous pouvez le constater, j'ai considérablement modifié la commande Get-VM. Initialement, la commande Get-VM tente d'extraire la machine virtuelle spécifiée du serveur hôte en cours de vérification. Les erreurs sont également supprimées, comme avant. Cependant, j'utilise maintenant la commande Tee-Object pour écrire le résultat dans une variable. J'ai ensuite ajouté la cmdlet Out-Null pour empêcher l'affichage des résultats de la cmdlet Get-VM à l'écran.

La cmdlet Tee-Object crée une variable appelée $ Temp, qui contient le contenu de la cmdlet Get-VM. Dans la même boucle, je crée également une variable appelée $ VMHost. Le contenu de $ Temp.NomOrdinateur est affecté à cette variable qui, à un moment donné, stockera le nom de l'hôte qui exécute la machine virtuelle spécifiée. Vous pouvez voir le script et sa sortie dans la figure ci-dessous.

Vérification finale

Le script que j'ai créé est assez simple pour que vous ne rencontriez pas trop de problèmes. Si toutefois vous rencontrez des problèmes, vous devez vérifier trois points.

1. Assurez-vous que le fichier texte de la liste d'hôtes répertorie les hôtes par nom et non par adresse IP.
2. Assurez-vous que l'ordinateur sur lequel vous exécutez PowerShell peut résoudre les noms d'hôte.
3. Assurez-vous que tous les hôtes (et la machine sur laquelle le script est exécuté) exécutent des versions similaires de Windows. J'ai rencontré des problèmes lorsque j'ai exécuté le script sur un ordinateur Windows Server 2016, mais la machine virtuelle que j'ai spécifiée était hébergée sur Windows Server 2012 R2 Hyper-V.

L'image sélectionnée: Pixabay

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.