Disque virtuel de taille nulle sur vSphere 6.5

Alerte de sauvegarde sur une machine virtuelle en exécution, snapshot impossible pour cause de disque inaccessible : celui-ci affiche une taille de 0 Ko.

Pourtant, en allant parcourir le datastore, on voit bien les fichiers VMDK aux côtés des fichiers de configuration et de mémoire vive.

Afin de résoudre le problème, j'ai essayé les manipulations suivantes :

  • Storage vMotion vers un autre datastore, machine éteinte : KO
  • vMotion vers un autre hôte, machine éteinte : KO

Il a finalement fallu que je supprime la machine de l'inventaire avant de la réinscrire sur le datastore d'origine. J'imagine que la réinscription dans l'inventaire et la lecture du fichier .vmx a permis à vSphere de rafraîchir les informations.

Enfin, le démarrage de la machine s'est déroulé sans accroc et j'ai pu créer un snapshot de test pour vérifier le bon fonctionnement d'une interaction avec le fichier VMDK. Mon flux de sauvegarde pourra reprendre son cours.

Extension de partition sur Debian Jessie grâce à GParted

Comme évoqué dans mon précédent article, je me suis confronté à un problème d'espace disque sur ma machine virtuelle faisant fonctionner Plex Media Server. Je vais donc procéder à l'augmentation de la taille du disque virtuel pour élargir la partition /dev/sda1 qui a besoin de plus d'espace.

Première étape, l'extension de disque dans la console ESXi elle-même ; étant donné que je suis en 6.5 et que ma machine virtuelle est de version 12 - si mes souvenirs sont corrects - je suis obligé de passer par l'interface web, bien que je préfère très nettement le client lourd. Mon datastore composé de deux disques durs de 3 To en RAID 1 me le permettant très largement, je passe de 60 Go à 100 Go.

Etant donné qu'à l'installation de Debian, je n'ai pas séparé certains répertoires sur des partitions distinctes (/var, /home par exemple) - ce qui n'est pas très propre, j'en conviens, mais plus facile pour gérer l'espace libre lorsqu'on est pas aguerri sur Debian - je suis condamné à réaliser l'élargissement avec GParted en live CD.

Il faut donc démarrer sur le disque virtuel, en pressant échap dans la console VMware.

Puis on arrive sur cet écran :

On choisit la première option, vient par la suite la configuration du clavier, rien de difficile. Il faut ensuite confirmer la disposition de celui-ci.

Une fois l'initialisation terminée - ce qui peut prendre quelques minutes - on arrive sur l'écran principal de l'application GParted qui présente l'état du stockage.

Confirmation de la bonne extension du VMDK : on a 40 Go non alloués. Je ne peux étendre directement /dev/sda1, car comme cela est visible sur le graphique, mon espace non alloué est après la partition étendue et le swap. Je vais donc devoir supprimer le swap, la partition étendue, puis étendre /dev/sda1 et recréer une partition et le swap.

Une fois le disque étendu, on valide l'écriture sur le disque. Si tout s'est bien passé, /dev/sda1 a bien été étendue à environ 100 Go - car il ne faut pas oublier de laisser un peu de place pour le swap ! - puis on procède à la recréation de la partition étendue, puis du swap.

On écrit de nouveau les modifications sur le disque.

Une fois l'écriture terminée, on constate que tout semble s'être bien déroulé : /dev/sda1 a été agrandie, et le swap a bien repris sa place et son point de montage.

Un simple redémarrage plus tard - il y a un raccourci pour faire un redémarrage proprement sur le "bureau" du live CD, df nous indique bien que /dev/sda1 a grossi pour nous offrir quelques dizaines de Go supplémentaires.

VMware et Powershell : contrôle de l'état des vmtools et des disques orphelins

Suite à quelques cas de vmtools qui tombaient en carafe sur des serveurs Windows en clientèle, j'ai eu l'idée de réaliser un petit script personnel afin de contrôler l'état des vmtools sur un ESXi ou un vCenter, et de remonter une alerte par email si jamais ils ne sont pas dans leur état normal.

Add-PSSnapin VMware.VimAutomation.Core
$From = "admin-vmw@localhost"
$To = "supervision@localhost"
$Smtp = "smtp.localdomain"
$ESXServer = "esxi.localdomain"
$ESXUser = "service"
$ESXPwd = "P@ssw0rd"

Connect-VIServer $ESXserver -User $ESXUser -Password $ESXPwd

$VMArray = Get-VM
foreach ($VM in $VMArray)
    {
    $VMPoweredOn = $VM.PowerState
    $toolsStatus = $VM.ExtensionData.Guest.ToolsStatus
    if ($toolsStatus -ne "toolsOK" -and $VMPoweredOn -eq "PoweredOn")
        {
        $MailString = "Bonjour, les vmtools sur la machine '$VM' remontent avec le statut inhabituel suivant : '$toolsStatus'."
        Send-MailMessage -From $From -To $To -Subject "vmtools en statut anormal sur $VM" -SmtpServer $Smtp -Body $MailString
        }
    }

On reçoit donc un courriel si les vmtools ne sont pas : en cours d'exécution, à jour ou installés. Par défaut, le script renvoie comme vmtools en erreur les machines qui sont éteintes car le serveur ne peut les joindre. C'est pourquoi il est nécessaire lors du contrôle d'exclure les machines éteintes.

Cela permet alors de pouvoir être plus réactif sur le bon fonctionnement des vmtools et d'éviter d'avoir des soucis de drivers réseau ou d'interface avec d'autres applications. Ce script est disponible dans une version commentée en cliquant sur mon miroir de téléchargement.

Le deuxième script que j'ai écrit (je pense qu'il peut nettement être amélioré...) permet de trouver les VMDK orphelins présents sur les datastores d'un vCenter ou d'un ESX. Il prend la liste des VMDK sur les datastore puis récupère la liste des disques rattachés à une machine virtuelle. Il fait ensuite la différence dans un tableau et l'exporte dans un fichier envoyé en pièce jointe par courriel. Cela permet de voir si des machines ont été supprimées de l'inventaire ou migrées ailleurs mais qu'il reste des reliquats à un endroit.

Add-PSSnapin VMware.VimAutomation.Core

$From = "admin-vmw@localhost"
$To = "supervision@localhost"
$Smtp = "smtp.localdomain"
$ESXServer = "esxi.localdomain"
$ESXUser = "service"
$ESXPwd = "P@ssw0rd"
$ReportFile = "c:temporphandisks.log"

Connect-VIServer $ESXserver -User $ESXUser -Password $ESXPwd

$VMDKArray = New-Object System.Collections.ArrayList
$VMDiskArray = New-Object System.Collections.ArrayList
$OrphanArray = New-Object System.Collections.ArrayList

$VMDKList=@()
$VMDiskList=@()
$DatastoreArray = Get-Datastore
$VMArray = Get-VM

ForEach ($Datastore in $DatastoreArray)
    {
    $DatastoreVMDK = Get-HardDisk -Datastore $Datastore | select Filename
    $VMDKList+=$DatastoreVMDK
    }

$VMDKList = $VMDKList | sort Filename
$VMDiskList = $VMArray | Get-HardDisk | select Filename | sort Filename

for($i=0;$i -lt $VMDKList.Length-1;$i++)
    {
    $VMDKArray.Add($VMDKList[$i])
    }

$loops = $VMDKList.Length-1

for($i=0;$i -lt $loops;$i++)
    {
    if($VMDKArray[$i].Filename -ne $VMDiskList[$i].Filename)
        {
        $OrphanArray.Add($VMDKArray[$i].Filename)
        $VMDKArray.Remove($VMDKArray[$i])
        $i=-1
        $loops--
        }
    }

if ($OrphanArray.Count -ne 0)
    {
    Remove-Item $ReportFile
    for($i=0;$i -lt $OrphanArray.Count; $i++)
        {
        Add-Content -Path $ReportFile -value $OrphanArray[$i]
        }
    $MailString = "Bonjour, voici la liste des VMDK orphelins en PJ."
    Send-MailMessage -From $From -To $To -Subject "VMDK orphelins" -SmtpServer $Smtp -Body $MailString -Attachments $ReportFile
    }
else
    {
    $MailString = "Bonjour, il n'y a pas de VMDK orphelins sur les datastores."
    Send-MailMessage -From $From -To $To -Subject "VMDK orphelins" -SmtpServer $Smtp -Body $MailString
    }

Vous pouvez également trouver ce script dans une version commentée sur ce lien provenant de mon miroir de téléchargement.

VMware et Powershell : détection de snapshots anciens et surveillance de l'espace libre

PowerCli est un excellent outil pour faciliter l'administration et la maintenance d'une infrastructure VMware. Il m'arrive d'écrire des scripts pour un client ou pour moi-même en fonction de tâches que j'ai à réaliser. Dans ce billet, je vais partager aujourd'hui deux petits scripts tout simples.

Le premier permet de scanner les VM présentes sur l'ESX ou le vCenter et d'envoyer un courriel si un snapshot est plus ancien qu'un certain nombre de jours. Par défaut, si un snapshot existe sur une machine virtuelle, un mail est tout de même envoyé.

Add-PSSnapin VMware.VimAutomation.Core
$From = "admin-vmw@localhost"
$To = "supervision@localhost"
$Smtp = "smtp.localdomain"
$ESXServer = "esxi.localdomain"
$ESXUser = "service"
$ESXPwd = "P@ssw0rd"
$Delay = 7

Connect-VIServer $ESXserver -User $ESXUser -Password $ESXPwd

$VMNamesArray = Get-VM | select Name
foreach ($VMName in $VMNamesArray)
    {
    $VMSnaps = Get-Snapshot $VMName.name
    foreach ($Snap in $VMSnaps)
        {
        $now = Get-Date
        if ($Snap.Created.AddDays($Delay) -gt $now -eq $false)
            {
            $SnapVM = $Snap.VM
            $MailString = "Bonjour, le snapshot '$Snap' de la machine '$SnapVM' existe depuis plus de $Delay jours."
            Send-MailMessage -From $From -To $To -Subject "Alerte snapshot" -SmtpServer $Smtp -Body $MailString
            }
        else
            {
            $MailString = "Aucun snapshot datant de plus de $Delay jours existant."
            Send-MailMessage -From $From -To $To -Subject "Rapport snapshot" -SmtpServer $Smtp -Body $MailString
            }
        }
    }

Le second script analyse les datastore de l'ESX ou du vCenter et envoie un mail si jamais il y a dépassement du seuil prédéfini. Il me semble que les préconisations VMware font état d'un besoin minimal de 20% de libre sur un datastore pour assurer le fonctionnement optimal de celui-ci. Le script va envoyer un courriel si jamais un datastore tombe à moins de 25% d'espace libre.

Add-PSSnapin VMware.VimAutomation.Core
$From = "admin-vmw@localhost"
$To = "supervision@localhost"
$Smtp = "smtp.localdomain"
$ESXServer = "esxi.localdomain"
$ESXUser = "service"
$ESXPwd = "P@ssw0rd"
$SeuilAlerte = 25

Connect-VIServer $ESXserver -User $ESXUser -Password $ESXPwd

$DatastoreArray = Get-Datastore
foreach ($Datastore in $DatastoreArray)
    {
    $MBAvail = $Datastore.FreeSpaceMB
    $MBTotal = $Datastore.CapacityMB
    $FreeProp = ($MBAvail/$MBTotal) * 100
    if ($FreeProp -lt $SeuilAlerte)
        {
        $FreeProp = [math]::Round($FreeProp,1)
        $MailString = "Bonjour, le datastore '$Datastore' n'a plus que $FreeProp % de libre."
        Send-MailMessage -From $From -To $To -Subject "Alerte occupation Datastore" -SmtpServer $Smtp -Body $MailString
        }
    }

Concernant l'authentification, il est possible de passer par un compte de service tout simple n'ayant qu'un accès en lecture. Il est également possible de ne pas indiquer en clair dans le code du script les identifiants permettant de se connecter au serveur : en enregistrant dans le coffre-fort Windows du compte qui va exécuter le script les informations d'identifications, il est possible de se connecter en appelant les valeurs depuis le code directement.

Vous pouvez récupérer les scripts depuis mon miroir de téléchargement dans des versions commentées :
Script d'alerte snapshot
Script d'alerte datastore