Планирование резервного копирования Veeam Backup Free Edition для всех виртуальных машин
Я хотел бы использовать бесплатную версию Veeam для резервного копирования моих виртуальных машин на сервере Windows Hyper-V 2016. Бесплатная версия инструмента не предоставляет инструмент для регулярного резервного копирования, поэтому я искал способ использовать его API в сочетании с планировщиком задач.
В поисках решения я наткнулся на этот пост, в котором подробно изложены все, что мне нужно:
https://blog.mwpreston.net/2015/04/29/scheduling-veeam-backup-free-edition-backups/
Param(
[Parameter(Mandatory=$true)][string]$VM,
[Parameter(Mandatory=$true)][string]$Destination,
[Parameter(Mandatory=$true)][ValidateSet(0,4,5,6,9)][int]$Compression,
[bool]$DisableQuiesce=$true,
[Parameter(Mandatory=$true)][ValidateSet("Never","Tonight","TomorrowNight","In3days","In1Week","In2Weeks","In1Month")][string]$Autodelete
)
#Load Veeam Toolkit
& "C:\Program Files\Veeam\Backup and Replication\Backup\Initialize-VeeamToolkit.ps1"
#Validate any parameters
$vmentity = Find-VBRViEntity -Name $VM
if ($vmentity -eq $null)
{
Write-Host "VM: $VM not found" -ForegroundColor "red"
exit
}
if (-Not (Test-Path $Destination))
{
Write-Host "Destination: $vmname not valid" -ForegroundColor "red"
exit
}
if ($DisableQuiesce -eq $true)
{
Start-VBRZip -Entity $vmentity -Folder $destination -Compression $Compression -AutoDelete $Autodelete -DisableQuiesce
}
else
{
Start-VBRZip -Entity $vmentity -Folder $destination -Compression $Compression -AutoDelete $Autodelete
}
Однако сценарий на этой странице поддерживает резервное копирование только одной виртуальной машины. Я мог бы создать многие из этих сценариев, но было бы предпочтительнее иметь один сценарий, который проходит через виртуальные машины.
Я полагаю, что это так же просто, как перебрать все виртуальные машины, но так как у меня нет опыта работы с PowerShell-скриптами, как и с Veeam, я ищу некоторую помощь / помощь в модификации скрипта для резервного копирования всех виртуальных машин. В комментариях на этой странице есть некоторые разговоры об этом, но, похоже, с тех пор сообщение в блоге было обновлено, поэтому оно не применяется напрямую.
Например что-то вроде этого:
(get-vm -ComputerName YOURSERVERFQDN | foreach { $_.Name }) -join "`",`"" | Tee-Object -Variable VMNames | Out-Null
Бонусом будет добавление какого-либо уведомления по электронной почте о сбое, но это немного за пределами темы этого вопроса.
1 ответ
Воскрешая старый вопрос, но, видимо, у Q было несколько просмотров, поэтому я решил поделиться окончательной версией скрипта, с которой я работал. Это основано на другой версии оригинального скрипта, который я где-то нашел, модифицированного для моих целей.
Это не супер-элегантный, но он выполняет свою работу, и он отправляет несколько удобных сообщений об ошибках по электронной почте в случае сбоя.
Param(
[Parameter(Mandatory=$false)][string]$hostname = 'yourhostname',
[Parameter(Mandatory=$false)][string]$BackupDestination = '\\yourdestination',
[ValidateSet(0,4,5,6,9)][int]$CompressionLevel = 5,
[bool]$DisableQuiesce=$false,
[ValidateSet("Never","Tonight","TomorrowNight","In3days","In1Week","In2Weeks","In1Month")][string]$Autodelete = "Tonight",
[bool]$EnableNotification=$true,
[string]$SMTPServer = 'smpt.yourmailserver.com'
)
##################################################################
# Notification Settings
##################################################################
# Email FROM
$EmailFrom = "veeam@domain"
# Email TO
$EmailTo = "you@domain"
# Email subject
$EmailSubject = "Veeam backup failed!"
##################################################################
# Email formatting
##################################################################
$style = "<style>BODY{font-family: Arial; font-size: 10pt;}"
$style = $style + "TABLE{border: 1px solid black; border-collapse: collapse;}"
$style = $style + "TH{border: 1px solid black; background: #dddddd; padding: 5px; }"
$style = $style + "TD{border: 1px solid black; padding: 5px; }"
$style = $style + "</style>"
try{
#Load Veeam Toolkit
& "C:\Program Files\Veeam\Backup and Replication\Console\Initialize-VeeamToolkit.ps1"
#Gather VM list dynamically
#Different methods of getting the vmlist
#$Script:VMList= (Get-VM -ComputerName $hostname -Credential $currentUser)
$script:VMList = Find-VBRHvEntity | Where-Object {$_.Type -eq 'Vm' -and $_.PowerState -eq "PoweredOn"}
#Add the hostname to the path in case you use some generic path
#$BackupDestinationWithHostName = Join-Path $BackupDestination $hostname
#Get the NAS credentials. This may not be needed depending on your setup. I am using active directy, but still found this to be the least painful solution
$NASCredentials = Get-VBRCredentials -Name "veeam@domain"
#Perform backup task for each identified VM
foreach ($vmentity in $VMList) {
#Perform the actual backup
$ZIPSession = Start-VBRZip -NetworkCredentials $NASCredentials -Entity $vmentity -Folder $BackupDestination -Compression $CompressionLevel -DisableQuiesce:($DisableQuiesce) -AutoDelete $Autodelete
#$ZIPSession = Start-VBRZip -Entity $vmentity -Folder $BackupDestination -Compression $CompressionLevel -DisableQuiesce:($DisableQuiesce) -AutoDelete $Autodelete
$TaskSessions = $ZIPSession.GetTaskSessions().logger.getlog().updatedrecords
$FailedSessions = $TaskSessions | where {$_.status -eq "EWarning" -or $_.Status -eq "EFailed"}
If ($EnableNotification) {
if ($FailedSessions -ne $Null) {
$sendFailedEmail = $true
$thisMessage = ($ZIPSession | Select-Object @{n="Name";e={($_.name).Substring(0, $_.name.LastIndexOf("("))}} ,@{n="Start Time";e={$_.CreationTime}},@{n="End Time";e={$_.EndTime}},Result,@{n="Details";e={$FailedSessions.Title}})
$MessageBody += $thisMessage
}
}
}
If (($EnableNotification -eq $true) -and ($sendFailedEmail -eq $true)) {
$Message = New-Object System.Net.Mail.MailMessage $EmailFrom, $EmailTo
$Message.Subject = $EmailSubject
$Message.IsBodyHTML = $True
$message.Body = $MessageBody | ConvertTo-Html -head $style | Out-String
$SMTP = New-Object Net.Mail.SmtpClient($SMTPServer)
$SMTP.Send($Message)
}
} catch{
$ErrorMessage = $_.Exception.Message
$Message = New-Object System.Net.Mail.MailMessage $EmailFrom, $EmailTo
$Message.Subject = "Unexpected error in Veeam powershell script"
$Message.Body = $ErrorMessage
$SMTP = New-Object Net.Mail.SmtpClient($SMTPServer)
$SMTP.Send($Message)
echo $_.Exception.Message
} finally {
# Any cleanup you need to perform. I am shutting down the server as it restarts on an automatic cycle when the task has to run again.
Stop-Computer
}