Отчет о выполнении бэкапов Veeam Backup

A. Vasiliev рассказал нам, как он борется с множеством серверов Veeam Backup.

Виртуальная инфраструктура нашей организации распределена по 40 филиалам в различных городах. Соответственно, в каждом городе имеется свой сервер. Однажды, мы озадачились проблемой сбора данных о результатах выполнения бэкапа в консолидированном виде.

E-mail оповещение с каждого сервера не подходит. Слишком много ненужной информации и будет приходить столько e-mail, сколько задач по всем нашим серверам, то есть как минимум 40 штук. Поднимать ради простого отчета Enterprise сервер тоже не хотелось, к тому же его отчет не совсем то, что мы хотели видеть.

Было принято решение написать центральный скрипт мониторинга, который бы опрашивал все серверы бэкапов и выдавать консолидированную красивую картинку. С задачей успешно справился мой коллега, A.Shabalin. Результат его плодотворной работы ниже.

Собственно сам скрипт:

Script.ps1

param(
$xml_param_file= "VeeamBackupMonitoring.xml",
$smtpServer= "mail"
)

$script= {
function Fun_4{
get-vbrjob | select name, lateststatus, @{Name=”LatestRun”; Expression={(get-vbrjobschedule (get-vbrjob $_.name)).latestrun}}
}

function Fun_5{
get-vbrjob | select name, @{Name=”LatestStatus”; Expression={$_.info.lateststatus}}, @{Name=”LatestRun”; Expression={(get-vbrjobscheduleoptions $_).latestrun}}
}

function Def{
Get-process -name “Veeam.Backup.Service” | select @{Name=”Name”; Expression={“Information”}}, @{Name=”LatestStatus”; Expression={$_.ProductVersion}}, @{Name=”LatestRun”; Expression={“You need add this version to script”}}
}

get-pssnapin -registered | add-pssnapin
Get-process -name “Veeam.Backup.Service” | select ProductVersion | foreach-object {
switch ($_.productversion){
“5.0.1.198” {Fun_5}
“5.0.2.224” {Fun_5}
“5.0.2.230” {Fun_5}
“4.1.1.105” {Fun_4}
“4.1.0.96” {Fun_4}
“4.0.0.80” {Fun_4}
default {Def}
}
}
}

$xml_param= [xml](Get-Content $xml_param_file)

$xml_param.root.item | foreach-object{

$body= “”
$stat_war= 0
$stat_err= 0
$stat_all= 0
$stat_ic_error= 0
$_.host | foreach-object{
$body += “`n$_`n”
$IC_error = “”
$jobs = Invoke-Command -ComputerName $_.ToString() -scriptblock $script -errorvariable IC_error

if ($IC_error -ne “”) {
$body += “$IC_error`n”
$stat_ic_error ++
}
elseif ($jobs -eq $null) {$body +=”Нет заданий`n”}
else {
$jobs | foreach-object {
$body +=”$($_.lateststatus.tostring()): $($_.name), прошлый запуск $(get-date $_.LatestRun -f ‘dd-MM-yy HH:mm:ss’)`n”
$stat_all++
if($_.lateststatus.tostring() -eq “Failed”) {$stat_err ++}
if($_.lateststatus.tostring() -eq “Warning”) {$stat_war ++}
}
}
}

if (($stat_err + $stat_war + $stat_ic_error) -eq 0) {
$subject = “Всё OK,ошибок нет”
$mail =”Любимый город может спать спокойно …`n`n”
}
else
{$subject = “VeeamBackup: ошибок – $stat_err, предупреждений – $stat_war из $stat_all”
if ($stat_ic_error -ne 0) {$subject +=”, ошибок соединения – $stat_ic_error”}
$mail = “Ошибки резервного копирования VeeamBackup.`n`n”
}

$mail += $body
$footer = “`n`n” + $(hostname) + ”                         From RUSSIA with love”
$mail += $footer

$_.email | foreach-object {
send-mailmessage -to (‘Administrator <‘ + $_ + ‘>’) -from ‘VeeamBackup monitoring<script@domain.ru>’ -body $mail -subject $subject -smtpServer $smtpServer -Encoding ([System.Text.Encoding]::UTF8)
}
}

И файл параметров к нему:

VeeamBackupMonitoring.xml
<root>
<item>
<email>mail@domain.ru</email>
<host>perm-bckp-01</host>
<host>backup.oren</host>
<host>ulsk-bckp-01</host>
</item>
</root>

Как вы заметили, используется функционал Powershell Remoting (WinRM), который, соответственно, необходимо включить и настроить на серверах бэкапов:
Winrm qc –q

Особо пытливые умы заметили наличие оператора switch с перечислением возможных версий Veeam. Все потому, что разработчики Veeam переписали интерфейс оснастки powershell для версии 5. На 6-ой версии работа скрипта еще не проверялась.

P.S. Кстати, классная идея использовать в качестве файла параметров для скриптов powershell файл xml, который прекрасно разбирается в коде левой задней пяткой:
$xml_param = [xml](Get-Content $xml_param_file)

И на выходе получается объект, свойствами которого являются указанные параметры.

Запись опубликована в рубрике VMware, vSphere с метками , , . Добавьте в закладки постоянную ссылку.

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

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