Question [RESOLU] Listing des VM HyperV dans un cluster

Plus d'informations
il y a 13 ans 9 mois #12495 par Zedd
Bonjour,

Je cherche à lister les VM dans un cluster, plus exactement à savoir sur quel serveur la VM est active à l'instant où je lance le script.

Avant, je n'avais que deux serveurs HyperV qui n'étaient pas en cluster, et j'utilisais ceci :

[code:1]
#Variables\"
$ServerSource = \"nvhyperv01\"
$VMSource = \"NvCompta\"
$VMchemin = \"C:\scripts\\"
$Journal = $VMchemin + $VMSource + '.txt'
#########################################################################################################
#Lecture de l'état de la VM à cloner pour savoir si on continu ou non le script
#########################################################################################################
\"Lecture de l'etat à \" + (get-date).tostring(‘hh:mm:«»ss’) >> $Journal
$VMList = Get-WmiObject -Namespace root\virtualization Msvm_ComputerSystem -ComputerName $ServerSource
$VMList = $VMList | Where-Object {$_.ElementName -eq $VMSource}
$VMList | Format-Table ElementName,EnabledState -Autosize >> $Journal[/code:1]

Aujourd'hui, c'est un peu plus compliqué, puisque dans un cluster, la VM n'est pas associée directement à un serveur. (si le serveur prioritaire d'une VM est injoignable pour une raison X ou Y, la VM fonctionnera sur un autre serveur).

J'ai imaginé la chose suivante, mais ça ne marche pas super bien ^^


[code:1]####################################################
# Paramétrage
####################################################
# Paramétrage Dossier
$BackupFolder = \"\\nvhyperv01\h$\"
# Paramétrage VM
$VMName = \"NvCompta\"
$Journal = 'C:\Script_test\journal.txt'
# Test de présence de la VM sur un serveur
foreach ($server in ${C:\script_test\servers.txt}) {
$VMList = Get-WmiObject -Namespace root\virtualization Msvm_ComputerSystem -ComputerName $Server
$VMList = $VMList | Where-Object {$_.ElementName -eq $VMName}
$VMList | Format-Table __Server,ElementName,EnabledState -Autosize >> $Journal
$Serversource = $VMList | Where-Object {$_.__Server -ne \"\"}
if ($VMList | Where-Object {$_.__Server -eq $server}) { $Serversource = \"$server\" }
}

echo $Serversource[/code:1]

Le fichier C:\script_test\servers.txt contient la liste de tous les serveurs du cluster.
J'ai testé ça qui marche un peu mieux, mais c'est cochon :

[code:1]$VMList = Get-WmiObject -Namespace root\virtualization Msvm_ComputerSystem -ComputerName nvhyperv03
$VMList = $VMList | Where-Object {$_.ElementName -eq $VMName}
$VMList | Format-Table __Server,ElementName,EnabledState -Autosize > $Journal
$Serversource = $VMList | Where-Object {$_.__Server -ne ''}

if ($VMList | Where-Object {$_.__Server -eq \"NVHYPERV01\"}) { $Serversource = \"nvhyperv01\" }
if ($VMList | Where-Object {$_.__Server -eq \"NVHYPERV02\"}) { $Serversource = \"nvhyperv02\" }
if ($VMList | Where-Object {$_.__Server -eq \"NVHYPERV03\"}) { $Serversource = \"nvhyperv03\" }
if ($VMList | Where-Object {$_.__Server -eq \"NVHYPERV04\"}) { $Serversource = \"nvhyperv04\" }
echo $Serversource

[/code:1]


Une idée pour faire du propre et pas du cochon ?

Mon but est d'arriver à placer le nom du serveur actif en variable, pour la suite de mon script.

Cdt,

Zedd<br><br>Message édité par: Zedd, à: 13/08/12 16:31

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 9 mois #12501 par Matthew BETTON
Bonjour,

Une idée pour faire du propre et pas du cochon ?


Sans directement répondre à ta question, d'après ta dernière question posée sur ce forum, tu connais l'existance du module Hyper-V qui 'wrap' les commandes WMI pour la gestion d'une infra Hyper-V.

Il permet notamment de simplifier le code en fournissant des Cmdlets PowerShell ... qui font moins cochon :P

@ +

Matthew

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 9 mois #12514 par Zedd
Salut,

merci pour la réponse, mais une réponse directe aurait été mieux :p

je suis une quiche en powershell et j'improvise avec ce que je trouve sur la toile.
Je fais plus du puzzle de code des autres que de la réelle écriture de code^^

Et pour info, à part le ptit wrap de chez Mcdo.. wrap, connais pas :p

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 9 mois #12515 par xyz
Salut,
le truc qui me fait tiquer c'est les quatres instructions IF.
Ne connaissant pas le clustering, ta variable $VMList peut contenir des VM provenant de + serveurs ou toutes sont oblgatoirement sur le même ?<br><br>Message édité par: Laurent Dardenne, à: 10/08/12 15:05

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 9 mois #12516 par Zedd
En gros (en tres gros), un cluster est un groupe de serveur reliés entre eux qui vont assurer la disponibilité de tes VM.
Chaque VM est associée à 1 serveur, mais si tu retires le câble d'alimentation du serveur par exemple, son voisin attrape la VM et la fait fonctionner.
Le tout sans coupure de service sur la VM.

L’inconvenant dans ce genre de cas, C'est que ta VM n'est plus rattachée à 1 serveur indépendant, mais peut potentiellement se balader d'un serveur à l'autre.

Le but c'est d'aller fouiller chaque serveur du cluster pour savoir sur lequel se trouve la VM désirée.

J'ai un peu progressé cette aprèm, et je coince à un truc tout bête.. voici mon bout de script :


####################################################
# Paramétrage
####################################################
# Paramétrage VM
$VMName = \&quot;xptestbis\&quot;
# Paramétrage Dossier
$Backup = \&quot;C:\ClusterStorage\Volume2\Backup\\&quot;
$Journal = 'C:\Script_test\journal.txt'

#ce module n'est semble-t-il présent que sur les
#machines avec le rôle FAilOver installé
Import-Module FailoverClusters

cls

# Je liste TOUTES les VM de mon cluster
$VMGroups = Get-ClusterGroup | ?{ $_ | Get-ClusterResource | ?{ $_.ResourceType -like \&quot;Virtual Machine\&quot; }}
echo $VMGroups

#Je filtre pour n'avoir QUE la VM voulue
$VM = $VMGroups | Where-Object {$_.Name -eq $VMName}
#J'affiche le serveur sur lequel elle est
echo $VM.ownernode.name

#Et la je coince.. ce que je vois en echo au dessus
#ne veut pas se mettre en variable ci-dessous..
$ServeurSource = $VM.ownernode.name
#du coup, l'echo n'echo rien :/
echo $ServerSource

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 9 mois #12518 par Matthew BETTON
[code:1]$ServeurSource = $VM.ownernode.name
#du coup, l'echo n'echo rien :/
echo $ServerSource[/code:1]

Une erreur de syntaxe ?

il manque un \&quot;u\&quot; ici :

[code:1]echo $ServerSource[/code:1]

parce que là il y a le \&quot;u\&quot; dans \&quot;Serveur\&quot; :

[code:1]$ServeurSource = $VM.ownernode.name[/code:1]

;)

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.044 secondes
Propulsé par Kunena