VMware et Powershell : liste des datastores en surcharge

J'avais déjà développé un script envoyant un mail si un datastore tombait sous un seuil défini dans le script d'espace libre. Aujourd'hui, voici une variante de ce script puisque celui-ci ne va détecter une espace disque trop faible mais une sur-allocation de celui-ci. En effet, avec les disques à provisionnement dynamique, il est possible de se retrouver en surcharge en créant de nouveaux disques virtuels positionnés sur ce même datastore sur lequel l'espace disque aura été jugé suffisant, en omettant de prendre en compte la croissance des disques déjà présents. Une capture d'écran peut permettre de comprendre le phénomène.

Cette capture d'écran montre bien les différences entre l'espace libre affiché et celui que l'on peut calculer en déduisant l'espace provisionné de la capacité maximale.

Sur cette capture, le sixième datastore affiche 320,49 Go de libre sur 749,75 Go : sur le papier, il est possible de créer une nouvelle VM puisque nous sommes en dessous du seuil d'occupation que l'on ne souhaite pas dépasser (généralement 80%). Seulement, 652 Go sur les 749 sont provisionnés. Cela signifie que si les disques virtuels viennent à atteindre leur taille maximale, nous serons en dessous des 20% d'espace libre. Pire, si la taille provisionnée est supérieure à la capacité, les disques virtuels seraient incapables de grossir et les VM pourraient planter.

Cela dit, il n'est pas forcément nécessaire de s'en tenir simplement à l'espace alloué et à la capacité maximale du datastore. Avec des machines bien dimensionnées et des données de capacity-planning, il est tout à fait possible d'exploiter chaque méga-octet du datastore sans perdre systématiquement au minimum 20% de l'espace de stockage.

Ce script liste donc tous les datastores qui ont un espace provisionné supérieur au seuil défini par rapport à la capacité maximale. Par défaut, ce seuil est de 80% (calculé par 1 - 0,20 dans le script). Il prend le nom du cluster en paramètre -Cluster. Dans une fenêtre PowerCli, on appellera le script ainsi si l'on souhaite analyser le cluster nommé PROD_PARIS :

.\vmw_ds-allocated-size.ps1 -Cluster "PROD_PARIS"
Param([string]$Cluster)
 $threshold = 0.20
 $dslist = Get-Datastore -Location $Cluster
 foreach($ds in $dslist){
     $allocsize = 0
     $hdlist = Get-HardDisk -Datastore $ds
     foreach($hd in $hdlist){
         $allocsize += $hd.CapacityGB
     }
     if($allocsize -gt $ds.CapacityGB*(1-$threshold)) { echo $ds.Name }
 }

VMware et Powershell : rapport des versions d'hôtes vSphere

Voici un script permettant de lister les versions des hôtes vSphere présents dans un vCenter. Le premier mode liste tous les hôtes tandis que le deuxième permet de lister une version spécifique, majeure ou mineure. Par exemple, en saisissant "6", alors le script cherchera les serveurs en 6.x.x tandis qu'en envoyant "5.5", il cherchera les serveurs en 5.5.x. Dans tous les cas, un export CSV exploitable est réalisé. Naturellement, il est nécessaire que les modules Powershell de VMware soient déployés sur la machine exécutant le script (si ils ne le sont pas, il suffit simplement de télécharger PowerCli).

Import-Module VMware.VimAutomation.Core

function allhosts{
Write-Host "Retrieving all hosts on vCenter $vcenter"
$spheres = Get-VMHost
process
}

function spechosts{
Write-Host "Retrieving specific hosts on vCenter $vcenter."
$reqver = Read-Host "Please input the desired version in one of those formats : 6, 6.0 or 6.0.0"
if($reqver.Length -lt 5) { $reqver = "$reqver*" }
$spheres = Get-VMHost | Where-Object {$_.Version -like $reqver}
process
}

function process{
$path = "$env:temp\vmware-hostver-$vcenter.csv"
$header = "Hostname,PowerState,Version"
Add-Content -Value $header -Path $path
foreach($vsphere in $spheres) {
$row = $vsphere.Name+","+$vsphere.PowerState+","+$vsphere.Version
Add-Content -Value $row -Path $path
}
Write-Host "Processing is done. Results are located in $path."
explorer $env:temp
}

Write-Host "vSphere host version listing script"
Write-Host "===================================`r`n"
$vcenter = Read-Host "vCenter to connect to ?"
Connect-VIServer $vcenter | Out-Null
Write-Host "1: List all hosts and versions on this vCenter`r`n2: List only hosts running under a specific version"
$mode = Read-Host "Choice"
switch ($mode){
1 { allhosts }
2 { spechosts }
}
Disconnect-VIServer $vcenter -confirm:$false | Out-Null
Write-Host "Bye."

VMware et Powershell : liste des alarmes déclenchées sur les hôtes physiques et VM

J'ai développé rapidement sur un coin de bureau un script pour lister les alarmes déclenchées sur les hôtes ESX et les machines virtuelles portées par ces hôtes, car à ma grande surprise, PowerCli ne possède pas de commande permettant de les obtenir directement. Il faut donc ruser un peu et utiliser les vues d'ensemble de machines virtuelles et physiques pour récupérer leur état et ensuite afficher les alarmes en lien. Ce script a été développé et testé avec PowerCli 6.5 ; à noter que depuis la version 6, ce ne sont plus des SnapIn mais des modules (source), il faudra donc adapter le début du script si jamais la version exécutée fonctionne avec des SnapIn.

Import-Module VMware.VimAutomation.Core
$ESXI = Read-Host "vSphere vCenter server to connect to"
Connect-VIServer $ESXI
Write-Host ""
Write-Host "Collecting virtual machines list..."
Write-Host ""
$VMArrayList = Get-VM
foreach ($VM in $VMArrayList)
{
$VMView = Get-View -ViewType VirtualMachine -Filter @{"Name" = "$VM"}
if ($VMView.TriggeredAlarmState.Overallstatus -eq "red")
{
foreach ($VMAlarm in $VMView.TriggeredAlarmState)
{
$VMAlarmType = $VMView.TriggeredAlarmState.Alarm
$VMAlarmTime = $VMView.TriggeredAlarmState.Time
$VMAlarm = Get-AlarmDefinition -id $VMAlarmType
Write-Host "Virtual Machine: $VM"
Write-Host "Alarm: $VMAlarm"
Write-Host "Time: $VMAlarmTime"
Write-Host ""
}
}
}
Write-Host "Done!"
Write-Host "Now collecting physical hosts list..."
Write-Host ""
$HostArrayList = Get-VMHost
foreach ($HostSys in $HostArrayList)
{
$HostView = Get-View -ViewType HostSystem -Filter @{"Name" = "$Host"}
if ($HostView.TriggeredAlarmState.Overallstatus -eq "red")
{
foreach ($HostAlarm in $HostView.TriggeredAlarmState)
{
$HostAlarmType = $HostView.TriggeredAlarmState.Alarm
$HostAlarmTime = $HostView.TriggeredAlarmState.Time
$HostAlarm = Get-AlarmDefinition -id $HostAlarmType
Write-Host "Host: $Hostsys"
Write-Host "Alarm: $HostAlarm"
Write-Host "Time: $HostAlarmTime"
Write-Host ""
}
}
}
Write-Host "Done!"

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.

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.

 

Add-PSSnapin VMware.VimAutomation.Core
Add-PSSnapin VMware.PowerCLI
$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
        }
    }

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. A noter que pour ce script comme pour le suivant, un seul module Powershell est nécessaire mais en fonction de la version de PowerCLI installée, le nom de celui-ci peut changer.

Le deuxième script que j'ai écrit 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 des deux disques et affiche la liste des différences. Avant de procéder à une suppression, tout de même vérifier si le VMDK n'a pas été désolidarisé pour une raison X ou Y, ou qu'il ne s'agit pas d'un snapshot.

Add-PSSnapin VMware.VimAutomation.Core
Add-PSSnapin VMware.PowerCLI

$vmdkds=@()
$vmdkvm=@()
Write-Host "Parsing all datastores and VMDKs. This might take a while.`r`n"
$dslist = Get-View -ViewType Datastore | select Name
foreach($ds in $dslist) {
	$vmdks = Get-HardDisk -Datastore $ds.Name
        foreach($vmdk in $vmdks) {
            $vmdkfilename = @{Filename = $vmdk.Filename}
            $vmdkentry = New-Object PSObject -Property $vmdkfilename
            $vmdkds+=$vmdkentry
        }
	}
    $vmlist = Get-View -ViewType VirtualMachine | select Name
    foreach($vm in $vmlist) {
        $vmdks = Get-HardDisk -VM $vm.Name
        foreach($vmdk in $vmdks) {
            $vmdkfilename = @{Filename = $vmdk.Filename}
            $vmdkentry = New-Object PSObject -Property $vmdkfilename
            $vmdkvm+=$vmdkentry 
        }
    }
Write-Host "Done. Now processing. Please wait.`r`n"
Compare-Object $vmdkvm $vmdkds -Property Filename | Where-Object { $_.SideIndicator -eq "=>" } | foreach-object { Write-Host $_.InputObject }

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