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.

Installation de TeamViewer 12 sur Debian Jessie

Je voulais installer TeamViewer sur une machine Linux afin de prendre en main à distance ma machine chez moi.

Cependant, sur ma machine virtuelle qui est installée sous Debian Jessie avec un environnement graphique MATE, le paquet que l'on peut obtenir via le site de TeamViewer ne peut s'installer. En effet, le paquet est conçu pour une architecture i386 et mon Debian est une amd64.

Afin que le paquet puisse s'installer correctement, quelques petites commandes dans le terminal ainsi que l'installation de gdebi pour une meilleure gestion des dépendances du paquet sont nécessaires.

En su, ou alors en précédant les commandes de sudo, on va ajouter à dpkg l'installation de paquets en i386, puis installer gdebi qui pourra installer le paquet teamviewer et toutes les dépendances, car il y en a un paquet (vous aurez noté le jeu de mots...)

dpkg --add-architecture i386
apt-get install gdebi
gdebi teamviewer_12.0.71510_i386.deb

Et normalement, le paquet est installé. Si il y a des dépendances que ne peut résoudre gdebi, ce qui ne devrait pas arriver, il est possible de corriger cela avec la commande suivante :

apt-get install -f

Les dépendances seront corrigées et le paquet teamviewer installé. Il est désormais disponible au lancement.

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

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 !