logo_mini_comments

Sans partage, la connaissance n'est rien !

Fil de navigation

Ce script créé par mes soins permet de lister l'ensemble des snapshots existants sur le vCenter et d'envoyer le résultat par mail sous la forme d'un rapport.

 

Fonctionnalités :

  • Lister l'ensemble des snapshots existants sur le vCenter
  • Envoyer un rapport par mail uniquement s'il existe au moins un snapshot sur le vCenter afin de limiter les mails

 

Prérequis :

  • Avoir les droits administrateur sur la plateforme VMware
  • Installer la dernière version des VMware PowerCLI

 

Utilisation :

  • Compléter les variables suivantes dans le script :
    • $vCenter = "vCenterServerName" (Serveur vCenter)
    • $MailFrom = "UserName[at]mail.fr" (Adresse mail de l'expéditeur)
    • $MailTo = "UserName[at]mail.fr" (Adresse mail du destinataire)
    • $MailCc = "UserName[at]mail.fr" (Adresse mail de la personne à mettre en copie)
    • $MailSMTPServer = "SMTPServerName" (Serveur SMTP)

 

Screenshot :

 

Code du script :

<#
.SYNOPSIS
    Retrieves VM snapshots on your VMware vCenter Server.
.DESCRIPTION
    Retrieves and send by e-mail all VM snapshots on your VMware vCenter Server.
.NOTES
    File name : Get-Snapshots.ps1
    Author : Pierre JACQUOT
    Date : 30/05/2016
    Version : 1.0
.LINK
    Website : https://www.pierrejacquot.yo.fr
    Reference : https://www.pierrejacquot.yo.fr/index.php/scripts/40-script-get-snapshots
#>

Clear-Host

# List of variables
$StartTime = Get-Date -Format "dd/MM/yyyy HH:mm:ss"
[string]$Hostname = [Environment]::MachineName
[string]$Login = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
[string]$Workfolder = Split-Path $MyInvocation.MyCommand.Path
[string]$Date = Get-Date -UFormat "%Y-%m-%d"
[string]$CSVFile = $Workfolder + "\$Date-Snapshots-Export.csv"
[string]$ReportFile = $Workfolder + "\$Date-Snapshots-Report.html"
[string]$vCenter = "vCenterServerName"
[string]$Table = $Null

Write-Host "Get-Snapshots :" -ForegroundColor Black -BackgroundColor Yellow

# Trying to connect to the VMware vCenter Server
Try {
    $Connexion = Connect-VIServer -Server $vCenter
    Write-Host "Connected on the VMware vCenter Server : $Connexion" -ForegroundColor Green
}
Catch {
    Write-Host "[ERROR] : Unable to connect on the VMware vCenter Server" -ForegroundColor Red
    Exit
}

# Retrieves and count VM snapshot(s) on the VMware vCenter Server
[array]$Snapshots = (Get-VM | Get-Snapshot | Sort-Object Created -Descending | Select-Object VM, @{Name="SizeGB";Expression={"{0:N2}" -f $_.SizeGB}}, Created, Name, Description)
[int]$SnapshotsNumber = $Snapshots.Count

If ($SnapshotsNumber -ge 1) {
    # Send-MailMessage parameters
    [string]$MailFrom = "vCenter[at]mail.fr"
    [string]$MailTo = @('UserName[at]mail.fr')
    [string]$MailCc = @('UserName[at]mail.fr')
    [string]$MailSubject = "[$Date] - [VMware] - Snapshot(s) daily report on : $vCenter"
    [string]$MailSMTPServer = "SMTPServerName"

    [string]$MailBody = '<html>'
    $MailBody += '<head>'
    $MailBody += "<title>$MailSubject</title>"
    $MailBody += '<style type="text/css">'
    $MailBody += 'h1 { font-family: Arial; color: #e68a00; font-size: 28px; }'
    $MailBody += 'h2 { font-family: Arial; color: #000000; font-size: 16px; }'
    $MailBody += '.customTable { border: 1px solid #000000; }'
    $MailBody += '.customTable table { border-collapse: collapse; border-spacing: 0; margin: 0px; padding: 0px; }'
    $MailBody += '.customTable th { background-color: #d3e5d4; font-size: 14px; font-family: Arial; font-weight: bold; }'
    $MailBody += '.customTable td { font-size: 13px; font-family: Arial; }'
    $MailBody += '.customTable tr:nth-child(even) { background-color: #f0f0f2; }'
    $MailBody += '.customTable tr:hover { background-color: #ddd; }'
    $MailBody += '#PostInfo { font-family: Arial; font-size: 11px; font-style: italic; }'
    $MailBody += 'span.Info { color: #000099; }'
    $MailBody += '</style>'
    $MailBody += '</head>'

    $MailBody += '<body>'
    $MailBody += "<h1>$MailSubject</h1>"
    $MailBody += "<h2>Number of snapshot(s) : <span class='Info'>$SnapshotsNumber</span></h2>"

    # Prepare Table
    $Table += '<table class="customTable">'
    $Table += "<tr><th>VM</th><th>SizeGB</th><th>Created</th><th>Name</th><th>Description</th></tr>"

    Foreach ($Snapshot in $Snapshots) {
        [string]$SnapVM = ($Snapshot.VM).Name
        $SnapSizeGB = "{0:N2}" -f $Snapshot.SizeGB
        $SnapCreated = $Snapshot.Created
        [string]$SnapName = $Snapshot.Name
        [string]$SnapDescription = $Snapshot.Description

        $Table += "<tr><td>$SnapVM</td><td>$SnapSizeGB</td><td>$SnapCreated</td><td>$SnapName</td><td>$SnapDescription</td></tr>"
    }

    $Table += "</table>"

    $Snapshots | Export-Csv -Path $CSVFile -NoTypeInformation -Delimiter ";" -Encoding UTF8
    $EndTime = Get-Date -Format "dd/MM/yyyy HH:mm:ss"
    [decimal]$Duration = [math]::Round((New-TimeSpan -Start $StartTime -End $EndTime).TotalSeconds,2)

    [string]$Info = "<p id='PostInfo'>Script launched from : <span class='Info'>$Hostname</span><br/>
    By : <span class='Info'>$Login</span><br/>
    Path : <span class='Info'>$Workfolder</span><br/>
    CSV file : <span class='Info'>$(Split-Path $CSVFile -Leaf)</span><br/>
    Report file : <span class='Info'>$(Split-Path $ReportFile -Leaf)</span><br/>
    Start time : <span class='Info'>$StartTime</span><br/>
    End time : <span class='Info'>$EndTime</span><br/>
    Duration : <span class='Info'>$Duration</span> second(s)</p>"

    $MailBody += $Table
    $MailBody += $Info
    $MailBody += '</body>'
    $MailBody += '</html>'

    $MailBody | Out-File -FilePath $ReportFile

    $Snapshots | Format-Table

    Try {
        Send-MailMessage -From $MailFrom -To $MailTo -Cc $MailCc -Subject $MailSubject -Body $MailBody -Priority High -Attachments $ReportFile -SmtpServer $MailSMTPServer -BodyAsHtml -Encoding UTF8
        Write-Host "VM snapshot(s) report with attached file : $(Split-Path $ReportFile -Leaf) has been sent by e-mail" -ForegroundColor Green
    }
    Catch {
        [string]$ErrorMessage = $_.Exception.Message
        Write-Host $ErrorMessage -ForegroundColor Red
    }
    Disconnect-VIServer -Server $vCenter -Confirm:$false
}
Else {
    Disconnect-VIServer -Server $vCenter -Confirm:$false
}

Write-Host "`r"
Write-Host "Script launched from : " -NoNewline; Write-Host $Hostname -ForegroundColor Red
Write-Host "By : " -NoNewline; Write-Host $Login -ForegroundColor Red
Write-Host "Path : " -NoNewline; Write-Host $Workfolder -ForegroundColor Red
Write-Host "CSV file : " -NoNewline; Write-Host (Split-Path $CSVFile -Leaf) -ForegroundColor Red
Write-Host "Report file : " -NoNewline; Write-Host (Split-Path $ReportFile -Leaf) -ForegroundColor Red
Write-Host "Start time : " -NoNewline; Write-Host $StartTime -ForegroundColor Red
Write-Host "End time : " -NoNewline; Write-Host $EndTime -ForegroundColor Red
Write-Host "Duration : " -NoNewline; Write-Host $Duration -ForegroundColor Red -nonewline; Write-Host " second(s)"
Write-Host "`r"

 

Il ne reste plus qu'à planifier l'exécution du script via un ordonnanceur.

 

Cliquer ici pour visualiser un exemple du rapport Snapshots-Report.html créé automatiquement.

 

Cliquer ici pour télécharger le script.