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.

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"
$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"
$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
        }
    }

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

Plus de réseau sur Debian Jessie

Alors que je souhaitais faire un petit tour de passe-passe sur mes machines GNU/Linux afin d’y faire les mises à jour des paquets, j’ai été surpris de ne pouvoir me connecter en SSH à l’une de mes machines.

Je tente alors de la joindre par un ping, et pas de réponse. Les requêtes ICMP atterrissant bien à la normale sur le serveur, j’ai pensé à un crash sévère de la machine ou de l’interface réseau. Je lance alors la console VMware et arrive sur le prompt du login sans soucis.

Une fois connecté, un petit ifconfig me renvoie les informations suivantes :

Je comprends pourquoi ma machine est injoignable : pas d’IP affectée, pas même une IPv6. Normalement, tout est géré par DHCP, les serveurs Linux ayant un bail permanent (les machines Windows en IP fixe afin de pouvoir avoir en DNS primaire le serveur ActiveDirectory et en secondaire l’appliance pfSense, bien qu’ils aient en secours un bail DHCP fixe aussi).

Naturellement, un ping de mon appliance pfSense ainsi que du DNS Windows ne renvoient rien. Par ailleurs, je voulais tenter un ifdown eth0 et un ifup eth0, sans succès vu que l’interface eth0 ne semble pas être configurée tout court.

Tout d’un coup, mon cerveau fait tilt, et je me souviens avoir déconnecté tous les lecteurs optiques des VM une fois les installations des OS terminées. Or, sur le client web ESXi, la case de déconnexion du lecteur optique est juste en dessous… de la case de déconnexion de la carte réseau.

Une fois la carte réseau connectée suite à cette fausse manipulation, un petit redémarrage du serveur (bien que je pense qu’un simple redémarrage du service networking aurait suffit) et la connectivité réseau est revenue !

Restriction de l’accès SSH sur ESXi 6.5

Pour des raisons de sécurité, je désactivais toujours l’accès SSH à mon serveur ESXi, laissant donc l’administration via la console web (que je n’aime pas trop par ailleurs) et le vClient.

Seulement, il n’y a pas si longtemps, les services de management ont crashé, rendant impossible la connexion via l’interface web ou le vClient, que ce soit via une machine virtuelle situé sur l’ESX ou bien en distant. Le serveur ne répondait pas non plus aux requêtes PowerCLI. J’ai donc dû demander un KVM sur le serveur afin de pouvoir prendre le shell en direct et relancer les services.

Depuis, je me suis dit qu’avoir quand même la main sur le shell pouvait être une option intéressante si besoin. Par contre, je voulais tout de même garder une certaine sécurité en ne le laissant pas ouvert depuis l’extérieur.

Via le vClient, il est possible de filtrer les connexions au serveur SSH par adresse IP ou blocs d’IP, ce qui dans mon cas m’intéresse puisque je vais lui demander d’autoriser seulement les connexions provenant de l’adresse IP LAN de mes machines virtuelles.

Dans le vClient, onglet Configuration > Profil de Sécurité > Modifier les propriétés du pare-feu puis Serveur SSH

Ensuite, la tentative de connexion depuis mon ordinateur personnel chez moi ne renvoie rien :

Depuis le réseau interne, cela fonctionne bien :

Par contre, par défaut, l’accès est possible en root uniquement. Etant donné que je possède un utilisateur standard afin d’accéder aux consoles et faire de la gestion rapide avec des privilèges limités, je voulais interdire la connexion en SSH avec l’utilisateur root et autoriser mon compte standard en connexion pour ensuite procéder à une élévation des droits avec su – mais cela ne semble plus être possible dans les dernières versions d’ESXi (testé sur 6.0 et 6.5).