Cleanup Nutanix Snapshots After # Amount Of Days

Quick blog post. The PowerShell script is selfexplaining 😉

You can schedule this on a secure server to run periodically or run this manually when needed. There is a password in the script so use with caution.

This script checks the Nutanix cluster for available snapshots (Protection Domain snapshots are not part of the check).
The list of snapshots is checked against the $DeleteAfterDays and is the snapshot is older then the given days it will be deleted.

Cleanedup space is freed after curator has done his magics ;)

Please change $DeleteAfterdays, $DryRun, $PrismElementIP, $UserName, $Password to match your needs.
The $DryRun can be $True or $False. When it is $True no real snapshots will be deleted.
Remove the "-password" in the connect string and the script will ask for you password. ;)

Make sure the powershell cmdlets are installed. More info here:

This script is an evolution of

Version    : 1.0 Date : 23 December 2022
Created by : Jeroen Tielen - Tielen Consultancy B.V.
Email      :

History    : 1.0 : 23 December 2022 - Initial setup script.

# Tune this variables to your need.
$DeleteAfterDays = 30
$Dryrun          = $False
$PrismElementIP  = ""
$UserName        = "admin"
$Password        = ConvertTo-SecureString "nutanix/4u" -AsPlainText -Force

# Load snapins and connect to cluster.
ASNP Nutanix*
Connect-NutanixCluster -Server $PrismElementIP -UserName $UserName -Password $Password -AcceptInvalidSSLCerts -ForcedConnection

# Script Start.
$NutSnaps        = Get-NTNXSnapshot
$AllNutVMs       = Get-NTNXVM | Select UUID,VMName

If ($DryRun -eq $True) {Write-Host "Dryrun activated, no snapshots will be deleted.`n" -ForegroundColor Yellow -BackgroundColor Black} else {Write-Host "Dryrun disabled, snapshots will be deleted if older then $DeleteAfterdays days.`n" -ForegroundColor Red -BackgroundColor Black}

ForEach ($Snap in $NutSnaps) {
$VMName= ($AllNutVMs | Where {$_.UUID -eq $Snap.VMUUID}).VMName
$SnapDt=(Get-Date '1/1/1970').AddMilliSeconds($SnapTime)
$Limit = (Get-Date).AddDays(-$DeleteAfterDays)
If ($Limit -lt $ActualSnapDt) {
Write-Host "Snapshot named " -NoNewline
Write-Host $Snap.SnapShotName -ForegroundColor Yellow -NoNewline
Write-Host " on VM " -NoNewline
Write-Host $VMName -ForegroundColor Yellow -NoNewline
Write-Host " created on " -NoNewline
Write-Host $ActualSnapDt -ForegroundColor Yellow -NoNewline
Write-Host " is within the limit and will not be deleted."
} Else {
Write-Host "Snapshot named " -NoNewline
Write-Host $Snap.SnapShotName -ForegroundColor Red -NoNewline
Write-Host " on VM " -NoNewline
Write-Host $VMName -ForegroundColor Red -NoNewline
Write-Host " created on " -NoNewline
Write-Host $ActualSnapDt -ForegroundColor Red -NoNewline
Write-Host " is older then the limit and will be deleted."
If ($DryRun -eq $False) { $Remove = Remove-NTNXSnapshot -UUID $Snap.UUID }
Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.