Enregistrer dans l’inventaire toutes les VMs d’un datastore

On peut avoir des LUNs actives sur un site et répliquées sur un autre. En mote Actif/Passif, les LUNs du second site sont en lecture seule, donc les hosts ESXi du second site ne peuvent y accéder.
Au moment de la bascule (exercice ou perte du site), les LUNs seront passées en lecture/écriture. Il va falloir alors inventorier toutes les VMs qu’elles hébergent afin de pouvoir les démarrer.

On peut naturellement faire cet inventaire manuellement s’il s’agit d’un exercice et qu’on veut juste démarrer quelques VMs.
Mais en cas de besoin de démarrer des dizaines ou des centaines de VMs, mieux vaut avoir un script.

Le script ci-dessous parcours les datastores et recherche tous les .vmx, puis enregistre les VMs correspondantes.
Si jamais une VM du même nom existe déjà, la nouvelle est simplement créée avec un incrément entre parenthèses : (2) puis (3)…

Etant donné qu’on n’est supposé passer ce script que sur des datastores qui étaient inutilisés jusque là, je n’ai pas pris la peine de valider dans le script que le .vmx lui-même n’était pas déjà enregistré dans l’inventaire. Si jamais vous passez ce script sur un datastore où des VMs sont déjà enregistrées, cela générera une erreur qui apparaîtra dans la log. Ce n’est pas très propre, mais il n’y aura pas d’impact.


Variables

Deux variables sont initialisée aux 2 premières lignes.

$DatastoreList : contient la liste des datastores à parcourir.
Elle est initialisée par une requête pour lister par exemple un datastore, plusieurs datastores séparés par une virgule, ou les datastores d’un cluster de datastore.

$DatastoreList = Get-Datastore NomDatastore
$DatastoreList = Get-Datastore NomDatastore1,NomDatastore2
$DatastoreList = Get-DatastoreCluster NomClusterDatastore | Get-Datastore

$ESXHost : contient le nom de l’ESX sur lequel les VMs seront à enregistrer.
Elle est initialisée par une requête pour lister par exemple un host précis, le premier host de l’inventaire, ou le premier host d’un cluster.
La variable ne doit contenir qu’un host. Peu importe qu’on enregistre 600 VMs sur le même host, c’est au moment du démarrage qu’elles se répartiront sur les hosts du cluster.

$ESXHost = Get-VMHost NomDuHost
$ESXHost = Get-VMHost | select -First 1
$ESXHost = Get-Cluster NomCluster | Get-VMHost | select -First 1

Script

$DatastoreList = Get-DatastoreCluster iSCSI | Get-Datastore
$ESXHost = Get-VMHost | select -First 1
Foreach ($Datastore in $DatastoreList)
{
   $DatastorePath = "[" + $Datastore.Name + "]"
   $SearchFilter = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec
   $SearchFilter.MatchPattern = "*.vmx"
   $DatastoreView = $Datastore | Get-View
   $DatastoreBrowser =  Get-View $DatastoreView.Browser
   $SearchResult = $DatastoreBrowser.SearchDatastoreSubFolders($DatastorePath, $SearchFilter) | Where-Object {($_.FolderPath -notmatch ".snapshot") -and ($_.File -ne $null)} | Foreach-Object {$_.FolderPath + ($_.File | select Path).Path}
   Foreach ($VM in $SearchResult)
   {
      New-VM -VMFilePath $VM -VMHost $ESXHost -RunAsync
   }
}

1 Comment

  1. swipe dit :

    au top ! merci

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *