get-snapshot++

Depuis la version U1 du Power-CLI, vous avez peut être remarqué que la cmdlet get-snapshot est 3000% plus lente. Nous supposons que l’ajout de la propriété SizeMB y est pour beaucoup car plus les différents snapshot d’une VM sont gros, plus le résultat sera long à arriver. Cette information n’est pas nécessaire dans tous les cas, on aurait donc beaucoup apprécié que la cmdlet originale n’ai pas été remplacée.

Pour un besoin spécifique (gestion de la rétention des snapshot en l’occurrence), nous avions besoin de lister tous les snapshot d’une infra avec un filtre sur la description. Dans ce cas précis, nul besoin de la taille du snapshot. La cmdlet get-snapshot du Power-CLI U1 retourne la liste en plusieurs dixaines de minutes sur cette infra (oui, il y en a BEAUCOUP), ce qui n’était pas acceptable. Nous avons donc retroussé nos manches pour scripter une fonction récursive en powershell afin de lister les snapshots d’une, d’une liste ou de toutes les VM présentes dans le vCenter :

param($VM)
 
if ($VM) {$rootsnap = $VM|%{Get-View -ViewType VirtualMachine -Filter @{"Name" = $_}}|%{$_.Snapshot.RootSnapshotList}}
else
{$rootsnap = Get-View -ViewType VirtualMachine |%{$_.Snapshot.RootSnapshotList}}
 
$snaplist = @()
$snaplist += $rootsnap
 
function get-snapshotlegacy ($rootsnap){
	foreach ($snap in ($rootsnap|%{$_.ChildSnapshotList})){
		$snap
		if ((($snap|%{$_.ChildSnapshotList})|Measure-Object).count -gt 0){
			get-snapshotlegacy $snap
		}
	}
}
 
$snaplist += get-snapshotlegacy $rootsnap
$snaplist

Ce script peut etre utilisé de 3 façons différentes : pour une seule VM, pour une liste de VM ou pour toutes les VM.

.\get-legacysnapshot.ps1 VM1

.\get-legacysnapshot.ps1 @(“VM1″;”VM2″;”VM3″)

.\get-legacysnapshot.ps1

La liste d’objets retournée par ce script est utilisable par la suite pour d’autre cmdlet. Par exemple, si l’on souhaite supprimer tous les snapshot dont la description est “à supprimer”, voici la syntaxe :

.\get-legacysnapshot.ps1 |?{$_.Description -eq "à supprimer"} |%{(get-view $_.snapshot).RemoveSnapshot_Task(0)}

Vous pouvez constater ci dessous que pour lister 111 snapshot dans plus de 600 VM, l’exécution du script ne prend que 53 secondes (contre plus de 20min avec la cmdlet get-snapshot) :

snaplegacy

Tags: , ,

One Response to “get-snapshot++”

  1. [...] dans laquelle nous avons, entre autres, re-coder les zones faisant appel à la cmdlet get-snapshot (extrêmement lente comme nous l’avions évoqué), ajouté quelques check (VMHost/VMFS, CPU Wait, VM disks space left, DRS per cluster summary, VC [...]

Leave a Reply