Скрипт проверки снапшотов в ESXI и отправка отчета на почту

Обновлено 13.05.2020

snapshot logo

Добрый день! Уважаемые читатели и гости одного из крупнейших IT Pyatilistnik.org. В прошлый раз мы с вами разобрали  вопрос, как сменить mac адрес на сетевом интерфейсе на различных платформах. Сегодня я хочу с вами поделиться полезным скриптом, который будет просматривать ваш vCenter сервер и находить все виртуальные машины, где есть моментальные снимки старше 30 дней с оповещением на электронную почту.

Описание ситуации

Произошла ситуация. Есть виртуальная машина работающая на гипервизоре ESXI 6.5, появилась задача произвести расширение виртуального диска. При выполнении задачи было выяснено, что на виртуальной машине есть снапшот, который не дает расширить. Потребовалось его удалить. После его удаления виртуальная машина поломалась, в виду того, что снимку было более одного года. Появилась задача произвести инвентаризацию всех виртуальных машин на предмет наличия снимков старше 30 дней с оповещением на электронную почту. Должен прийти список, а так же вестись лог обработки скрипта.

Скрипт проверки наличия снапшотов, которые старше 30 дней

function Date {Get-Date -Format "yyyy.MM.dd HH:mm:ss"}

$log_folder = "$PSScriptRoot\Logs\" + $($MyInvocation.MyCommand.Name -replace (".ps1", ""))
$log = "$log_folder\$(Get-Date -Format "yyyy_MM_dd_HH_mm_ss").txt"

$viserver = "vcenter.root.pyatilistnik.org" #Пишем тут свой адрес vCenter сервера или ESXI хоста

if (! (Test-Path $log_folder -ErrorAction SilentlyContinue)) #Проверка наличия папки log
{
New-Item $log_folder -ItemType D -Force
} # Форсированное создание папки log

"$(Date) Start Processing" | Tee-Object $log -Append

"$(Date) Trying to import VMware.PowerCLI module" | Tee-Object $log -Append
try {
Import-Module VMware.PowerCLI -ErrorAction Stop
} # Импортируем модуль VMware.PowerCLI 
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
Break
}

"$(Date) Trying to connect to VIServer $viserver" | Tee-Object $log -Append # Подключаемся к нашему vCenter

try {
Connect-VIServer -Server $viserver -ErrorAction Stop
}
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
Break
}

"$(Date) Trying to get list of VM Snapshots older than 30 days" | Tee-Object $log -Append
$snapshots = $null
try {
$snapshots = Get-VM | Get-Snapshot | ? {$_.created -le (Get-Date).AddDays(-30)}
}
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
Break
}

"$(Date) Total snapshots: $($snapshots.Length)" | Tee-Object $log -Append

$snapshots_data = @()

foreach ($snapshot in $snapshots)
{
$snapshot_data = New-Object PSObject

$snapshot_data | Add-Member -MemberType NoteProperty -Name "VM" -Value $snapshot.VM
$snapshot_data | Add-Member -MemberType NoteProperty -Name "Description" -Value $snapshot.Description
$snapshot_data | Add-Member -MemberType NoteProperty -Name "Created" -Value $(Get-Date $snapshot.Created -Format "dd.MM.yyyy")
$snapshot_data | Add-Member -MemberType NoteProperty -Name "Size, GB" -Value $([math]::Round($snapshot.SizeGB, 1))

# $snapshots | select VM, Description, Created, SizeGB | ConvertTo-Html
$snapshots_data += $snapshot_data
}

if ($snapshots.Length -gt 0)
{
$from = "notify@pyatilistnik.org"
$to = "admins@pyatilistnik.org"
# $cc1 = "admins@pyatilistnik.org"
# $cc2 = "admins@pyatilistnik.org"
# $cc3 = "admins@pyatilistnik.org"
# $cc4 = "admins@pyatilistnik.org"
$Subject = "VM Snapshots older than 30 days"
$smtpserver = "relay.pyatilistnik.org"
$secure = $true
$port = 587 # TLS, for SSL use 465
$username = "notify"
$password = 'Password'

$Header = @"
<style>
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style>
"@

$body = $snapshots_data | select VM, Description, Created, "Size, GB" | ConvertTo-Html -Head $Header
$body += "<p>Generated on $($env:COMPUTERNAME + "." + $((Get-WmiObject Win32_ComputerSystem).Domain))"

$message = New-Object System.Net.Mail.MailMessage
$message.From = $from
$message.To.Add($to)
# $message.CC.Add($cc1)
# $message.CC.Add($cc2)
# $message.CC.Add($cc3)
# $message.CC.Add($cc4)
$message.Subject = $Subject
$message.Body = $body
$message.IsBodyHtml = $true

$smtp = New-Object Net.Mail.SmtpClient($smtpserver, $port)
$smtp.EnableSsl = $secure
$smtp.Credentials = New-Object System.Net.NetworkCredential($username, $password)

"$(Date) Trying to send e-mail notification" | Tee-Object $log -Append

try {
$smtp.Send($message)
}
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
}
}

###

"$(Date) End Processing" | Tee-Object $log -Append

Далее вы запускаете данный скрипт PowerShell через планировщик задач, я об этом подробно рассказывал уже. В результате у вас должно прийти вот такого рода письмо.

VM Snapshots older than 30 days

А вот так вот выглядит папка с файлами логами, где вы детально можете посмотреть все события, которые были сгенерированны скрптом.

Файлы логи по поиску снапшотов старше 30 дней

Надеюсь, что мой опыт будет вам полезен и скрипт по поиску снапшотов старше 30 дней сэкономит вам время. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.

Автор - Сёмин Иван

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *