Скрипт проверки снапшотов в ESXI и отправка отчета на почту
Добрый день! Уважаемые читатели и гости одного из крупнейших IT Pyatilistnik.org. В прошлый раз мы с вами разобрали вопрос, как сменить mac адрес на сетевом интерфейсе на различных платформах. Сегодня я хочу с вами поделиться полезным скриптом, который будет просматривать ваш vCenter сервер и находить все виртуальные машины, где есть моментальные снимки старше 30 дней с оповещением на электронную почту.
Описание ситуации
Произошла ситуация. Есть виртуальная машина работающая на гипервизоре ESXI 6.5, появилась задача произвести расширение виртуального диска. При выполнении задачи было выяснено, что на виртуальной машине есть снапшот, который не дает расширить. Потребовалось его удалить. После его удаления виртуальная машина поломалась, в виду того, что снимку было более одного года. Появилась задача произвести инвентаризацию всех виртуальных машин на предмет наличия снимков старше 30 дней с оповещением на электронную почту. Должен прийти список, а так же вестись лог обработки скрипта.
Скрипт проверки наличия снапшотов, которые старше 30 дней
$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 через планировщик задач, я об этом подробно рассказывал уже. В результате у вас должно прийти вот такого рода письмо.
А вот так вот выглядит папка с файлами логами, где вы детально можете посмотреть все события, которые были сгенерированны скрптом.
Надеюсь, что мой опыт будет вам полезен и скрипт по поиску снапшотов старше 30 дней сэкономит вам время. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.