Catégories
VMware

PowerCLI – Script d'inventaire des VMDK

Voici un petit script qui permet de récupérer dans un fichier Excel la liste des VMDK utilisés par les machines virtuelles vues d’un vCenter. C’est utilisable sans ce dernier, en saisissant à l’invite de commande le nom ou l’adresse ip d’un ESX.

Le résultat se présente sous forme d’un tableau Excel. Les machines virtuelles démarrées génèrent des remplissages de cases en VERT. Pour un inventaire complet, il faut que les VMware tools fonctionnent sur toutes les VM et que le nombre de partitions des VM soit identique au nombre de VMDK. Cela permet d’avoir une vue depuis l’intérieur de la VM la taille des partitions, le taux de remplissage et de générer les alertes rouges ou oranges suivant ce taux.

Exemple de rendu :

Et le script :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
## Pré requis : la VM doit être installée avec un nombre identique de VMDK et de partitions vus du système pour que
##              l'utilisation de la seconde partie du script soit pertinente. Donc peu utilisable avec des VM Linux.
### Variables ###
$vcenter = read-host "Saisissez le nom ou l'ip de votre vCenter"
$logfilexls = "c:tmpalogfile.xls"
$diskseuil = 10                                    #Seuil d'affichage d'un espace disque disponible critique (Rouge).
$diskseuilbas = 20                                 #Seuil d'affichage d'un espace disque disponible faible (orange).
$excel = New-Object -ComObject Excel.Application
$excel.visible = $True
$excel = $excel.Workbooks.Add()
### Initialisation du tableau Excel ###
# pour personnaliser les couleurs des cellules : <a href="http://www.mvps.org/dmcritchie/excel/colors.htm">http://www.mvps.org/dmcritchie/excel/colors.htm</a>
$Sheet = $Excel.Worksheets.Item(1)
$Sheet.Cells.Item(1,1) = "Nom du Datacenter"
$Sheet.Cells.Item(1,2) = "Nom de l'hôte"
$Sheet.Cells.Item(1,3) = "Nom de VM"
$Sheet.Cells.Item(1,4) = "Id Disque"
$Sheet.Cells.Item(1,5) = "Chemin VMDK"
$Sheet.Cells.Item(1,6) = "Capacité (Go)"
$Sheet.Cells.Item(1,7) = "Espace libre (Go)"
$Sheet.Cells.Item(1,8) = "Pourcentage Libre"
$Sheet.Cells.Item(1,9) = "Volume occupé (Go)"
$Sheet.Cells.Item(1,10) = "Format"
$WorkBook = $Sheet.UsedRange
$WorkBook.Interior.ColorIndex = 15
$WorkBook.Font.Bold = $True
$introw =2
connect-viserver $vcenter
### Première partie : récupération de tous les disques durs utilisés par les VM (classés par VM, par host, par datacenter)
$dc = get-datacenter |select name,id
  foreach ($_.name in $dc ) {
    $logdc = $_.name
    write-host $logdc
    $listvm = get-datacenter $logdc | get-vm | select name,vmhost,powerstate
    foreach ($_.name in $listvm){
        #Identification de la VM
        $vmname = [string]$_.name
        $vmhost = [string]$_.vmhost
        $vmstate = [string]$_.powerstate
        #Récupération des informations des disques
        $introw2 = $introw
        $vmdiskproperties = get-vm $vmname | get-harddisk | select name, filename,capacitykb, storageformat
        $vmdiskproperties | foreach-object {
          $vmdkinfo = [string]$_.name
          $vmdkname = [string]$_.filename
          $vmdkformat = [string]$_.storageformat
          $vmdkcapa = $_.capacitykb /1024 /1024
          #Remplissage du tableau
          $Sheet.Cells.Item($intRow, 1) = $logdc
          $Sheet.Cells.Item($intRow, 2) = $vmhost
          $Sheet.Cells.Item($intRow, 3) = $vmname
           #Coloration Verte pour VM en marche
          if ($vmstate -match "PoweredOn"){$Sheet.Cells.Item($intRow, 3).Interior.ColorIndex = 10
                                           $Sheet.Cells.Item($intRow, 3).Font.ColorIndex = 2}
          $Sheet.Cells.Item($intRow, 4) = $vmdkinfo
          $Sheet.Cells.Item($intRow, 5) = $vmdkname
          $Sheet.Cells.Item($intRow, 6) = $vmdkcapa
          $Sheet.Cells.Item($intRow, 10) = $vmdkformat
          $intRow++
          }
### Seconde partie : récupération des taux d'utilisation des VMDK, les valeurs dépendent de l'installation des VMwareTools
 #       $ostools = get-vm $vmname | get-view | select -expandproperty Guest  | Select toolsstatus, toolsrunningstatus
 #       $ostools | foreach-object { $ostools = $_.toolsstatus
 #                                   $ostoolsrun = $_.toolsrunningstatus
 #                                 }
 #       #Données des volumes présentés       
 #       $osdisks = get-vm $vmname | get-vmguest | where{$_.disks} | select -expandproperty disks vmname | Select vmName, capacity, FreeSpace, @{ N="PercentFree"; E={ "{0:f2}" -f ($_.FreeSpace / $_.Capacity * 100)  }}
 #       $osdisks | foreach-object {
 #         $osdiskcapa = $_.Capacity
 #         $osdiskfree = $_.freespace
 #         $ospercentfree = $_.percentfree
 #         #Pour éviter des alertes de volumes sur des OS
 #         if ($ostoolsrun -match "guestToolsRunning") {
 #           if ($intRow2 -lt $intRow){
 #           $Sheet.Cells.Item($intRow2, 7) = $osdiskfree/1024/1024/1024
 #           $Sheet.Cells.Item($intRow2, 8) = $ospercentfree
 #           $Sheet.Cells.Item($intRow2, 9) = ($osdiskcapa - $osdiskfree) /1024/1024/1024
 #           if ($ospercentfree -le $diskseuilbas){
 #             $Sheet.Cells.Item($intRow2, 8).Interior.ColorIndex = 45
 #             if ($ospercentfree -le $diskseuil){
 #               $Sheet.Cells.Item($intRow2, 8).Interior.ColorIndex = 3
 #               }
 #             }
 #           }}
 #         else{
 #           $Sheet.Cells.Item($intRow2, 7) = "VMware Tools HS"
 #           }
 #         $intRow2++
 #         }
    }
  }
$WorkBook.EntireColumn.AutoFit()
$sheet.SaveAs($logfilexls)
disconnect-viserver -confirm:$false

11 réponses sur « PowerCLI – Script d'inventaire des VMDK »

Bonjour,

je souhaite utiliser ton script mais j’ai quelques questions, la toute première, assez con :

Ne doit-on pas renseigner un compte et son mot de passe?

Au lancement du script il nous est demandé l’IP du vCenter mais aucune autre info.

D’avance merci et merci pour le partage 🙂

Romain

Bonjour,
Il faut effectivement être connecté avec un compte disposant de quelques droits sur l’infra VMware. C’est la session Windows qui compte. Tu peux aussi ajouter au script
$username = read-host "Nom d'utilisateur"
$password = read-host "Mot de passe "

Et remplacer la ligne de connection au vcenter par :
Connect-VIServer $vcenter -User $username -Password $password

Ensuite avec l’IP du vCenter, il récupère toutes les VM et les classe par Datacenter.

Je viens de faire les modifications et le test mais cela ne fonctionne pas. Voici le retour que j’ai :

Le terme « Connect-VIServer » n’est pas reconnu comme nom d’applet de commande,
fonction, fichier de script ou programme exécutable. Vérifiez l’orthographe du
nom, ou si un chemin d’accès existe, vérifiez que le chemin d’accès est correc
t et réessayez.
Au niveau de C:Scriptvcenter-2.ps1 : 31 Caractère : 17
+ Connect-VIServer <<<< $vcenter -User $username -Password $password
+ CategoryInfo : ObjectNotFound: (Connect-VIServer:String) [], Co
mmandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Le terme « get-datacenter » n'est pas reconnu comme nom d'applet de commande, f
onction, fichier de script ou programme exécutable. Vérifiez l'orthographe du n
om, ou si un chemin d'accès existe, vérifiez que le chemin d'accès est correct
et réessayez.
Au niveau de C:Scriptvcenter-2.ps1 : 33 Caractère : 21
+ $dc = get-datacenter <<<< |select name,id
+ CategoryInfo : ObjectNotFound: (get-datacenter:String) [], Comm
andNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Le terme « get-datacenter » n'est pas reconnu comme nom d'applet de commande, f
onction, fichier de script ou programme exécutable. Vérifiez l'orthographe du n
om, ou si un chemin d'accès existe, vérifiez que le chemin d'accès est correct
et réessayez.
Au niveau de C:Scriptvcenter-2.ps1 : 37 Caractère : 29
+ $listvm = get-datacenter <<<< $logdc | get-vm | select name,vmhost,power
state
+ CategoryInfo : ObjectNotFound: (get-datacenter:String) [], Comm
andNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Le terme « get-vm » n'est pas reconnu comme nom d'applet de commande, fonction,
fichier de script ou programme exécutable. Vérifiez l'orthographe du nom, ou s
i un chemin d'accès existe, vérifiez que le chemin d'accès est correct et réess
ayez.
Au niveau de C:Scriptvcenter-2.ps1 : 45 Caractère : 35
+ $vmdiskproperties = get-vm <<<< $vmname | get-harddisk | select name
, filename,capacitykb, storageformat
+ CategoryInfo : ObjectNotFound: (get-vm:String) [], CommandNotFo
undException
+ FullyQualifiedErrorId : CommandNotFoundException

True
Le terme « disconnect-viserver » n'est pas reconnu comme nom d'applet de comman
de, fonction, fichier de script ou programme exécutable. Vérifiez l'orthographe
du nom, ou si un chemin d'accès existe, vérifiez que le chemin d'accès est cor
rect et réessayez.
Au niveau de C:Scriptvcenter-2.ps1 : 97 Caractère : 20
+ disconnect-viserver <<<< -confirm:$false
+ CategoryInfo : ObjectNotFound: (disconnect-viserver:String) [],
CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Et j'ai rajouté ces lignes au script :

$username = read-host "Nom d'utilisateur"
$password = read-host "Mot de passe"

connect-viserver $vcenter -User $username -Password $password

Par rapport au retour que j'ai je ne vois pas trop d'où vient le problème.

D'avance merci,

@romain0412
Le Pb vient du faite qu’il faut exécuter le script depuis la console PowerCLI. Autrement, il faut d’abord ajouter le composant pour VMware avant de lancer le script avec la commande:
add-pssnapin VMware.VimAutomation.Core
Ou alors, lancer le script avec le composant: avec la commande:
C:WINDOWSsystem32windowspowershellv1.0powershell.exe -psc “C:Program FilesVMwareInfrastructurevSphere PowerCLIvim.psc1″ -c ” & “C:Scriptvcenter-2.ps1″

J’utilise bien la console PowerCLI :

Le terme « connect-viserver » n’est pas reconnu comme nom d’applet de commande,
fonction, fichier de script ou programme exécutable. Vérifiez l’orthographe du
nom, ou si un chemin d’accès existe, vérifiez que le chemin d’accès est correc
t et réessayez.
Au niveau de C:Scriptvcenter-2.ps1 : 31 Caractère : 17
+ connect-viserver <<<< $vcenter -User $username -Password $password
+ CategoryInfo : ObjectNotFound: (connect-viserver:String) [], Co
mmandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Le terme « get-datacenter » n'est pas reconnu comme nom d'applet de commande, f
onction, fichier de script ou programme exécutable. Vérifiez l'orthographe du n
om, ou si un chemin d'accès existe, vérifiez que le chemin d'accès est correct
et réessayez.
Au niveau de C:Scriptvcenter-2.ps1 : 33 Caractère : 21
+ $dc = get-datacenter <<<< |select name,id
+ CategoryInfo : ObjectNotFound: (get-datacenter:String) [], Comm
andNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Le terme « get-datacenter » n'est pas reconnu comme nom d'applet de commande, f
onction, fichier de script ou programme exécutable. Vérifiez l'orthographe du n
om, ou si un chemin d'accès existe, vérifiez que le chemin d'accès est correct
et réessayez.
Au niveau de C:Scriptvcenter-2.ps1 : 37 Caractère : 29
+ $listvm = get-datacenter <<<< $logdc | get-vm | select name,vmhost,power
state
+ CategoryInfo : ObjectNotFound: (get-datacenter:String) [], Comm
andNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Le terme « get-vm » n'est pas reconnu comme nom d'applet de commande, fonction,
fichier de script ou programme exécutable. Vérifiez l'orthographe du nom, ou s
i un chemin d'accès existe, vérifiez que le chemin d'accès est correct et réess
ayez.
Au niveau de C:Scriptvcenter-2.ps1 : 45 Caractère : 35
+ $vmdiskproperties = get-vm <<<< $vmname | get-harddisk | select name
, filename,capacitykb, storageformat
+ CategoryInfo : ObjectNotFound: (get-vm:String) [], CommandNotFo
undException
+ FullyQualifiedErrorId : CommandNotFoundException

True
Exception lors de l'appel de « SaveAs » avec « 1 » argument(s) : « Impossible d
'accéder à 'logfile.xls'. »
Au niveau de C:Scriptvcenter-2.ps1 : 96 Caractère : 14
+ $sheet.SaveAs <<<< ($logfilexls)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation

Le terme « disconnect-viserver » n'est pas reconnu comme nom d'applet de comman
de, fonction, fichier de script ou programme exécutable. Vérifiez l'orthographe
du nom, ou si un chemin d'accès existe, vérifiez que le chemin d'accès est cor
rect et réessayez.
Au niveau de C:Scriptvcenter-2.ps1 : 97 Caractère : 20
+ disconnect-viserver <<< connect-
viserver

applet de commande Connect-VIServer à la position 1 du pipeline de la commande
Fournissez des valeurs pour les paramètres suivants :

@romain0412
Tu as essayé en ajouter le composant VMware? Tu as essayer le add-pssnapin depuis un console CMD puis Powershell? ou la deuxième commande depuis une console CMD?
Tu arrives à faire Connect-VIserver manuellement dans la console PowerCLI?
Le PowerShell classique fonctionne? tu as bien le chemin PowerShell dans les variables « Path » et « PSModulePath »?
Car la typiquement tu as un problème d’intégration PowerShell + PowerCLI.

Bonjour,

tout d’abord un grand merci pour ce script que j’utilise dans mon entreprise, c’est vraiment du super travail !
Juste une petite question, est-il possible de configurer une alerte mail quand l’espace libre sur une vmdk est par exemple inférieur à 10% ? Et dans l’idéal, intégrer cette fonction dans le script actuel ?

Merci d’avance 😉
P.

Déterrage de dossier..; désolé d’avance!
dans le script,

mon ISE n’aime pas :
$listvm = get-vm | select name,vmhost,powerstate
foreach ($_.name in $listvm) {}
Le « . » à l’air d’interrompre le foreach, quid de votre côté ?

je suis en PS 5.0

@Bastien
Bonjour Bastien,
J’ai le même problème que toi au niveau du foreach…
Est-ce que depuis le temps tu as trouvé une solution ?

Par avance je te remercie.

Les commentaires sont fermés.