Отчет о выполнении бэкапов 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 не будет опубликован. Обязательные поля помечены *