Планирование резервного копирования 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
}
Другие вопросы по тегам