Accueil > VMware > PowerCLI – Script d'inventaire des VMDK
Avr/1126

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
  1. romain0412
    10/01/2012 à 12:02 | #1

    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

    • 10/01/2012 à 13:04 | #2

      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.

  2. romain0412
    10/01/2012 à 13:18 | #3

    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,

  3. 10/01/2012 à 14:39 | #4

    @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″

  4. romain0412
    10/01/2012 à 15:22 | #5

    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 :

  5. 10/01/2012 à 16:20 | #6

    @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.

  6. PolR
    22/05/2012 à 13:58 | #7

    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.

  7. lt
    17/10/2013 à 09:15 | #8

    Vraiment génial merci !

  8. Bastien
    15/03/2016 à 15:10 | #9

    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

  9. 24/08/2016 à 23:45 | #10

    @Bastien
    Ca marchait de mon coté, mais c’est vieux en effet.
    S’il y a un Pb de syntaxe ca doit etre aussi le cas 4 lignes plus hauts. Peut etre que ton $listvm est vide.

  10. Anthony
    26/08/2016 à 09:42 | #11

    @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.

  1. Pas encore de trackbacks