terça-feira, 15 de setembro de 2015

Automatizando Backup de VMs Hyper-V com o Veeamzip 8

Hoje compartilharei com vocês um procedimento para automatizar backup de seus servidores virtuais através da ferramenta da Veeam, o Veeam Backup Free Edition versão 8.

Como o próprio nome diz, o Veeam Backup, trata-se de uma ferramenta totalmente gratuita que permite que você realize backups constantes de suas maquinas virtuais (Hyper-V | VMware) de maneira muito simples e intuitiva sem precisar pausar ou desligar suas VMs.

Por se tratar de uma versão free, a unica limitação dessa versão é a impossibilidade de agendar tarefas de backup de suas VMs. Obrigando dessa maneira você iniciar os backups "na mão" através de sua console de gerenciamento.

Claro que na versão full, além de você poder criar/agendar jobs de backup de suas VMs, você tem outras inúmeras funcionalidades muito uteis e interessantes para quem tem um ambiente de virtualização mais complexo. Mas o nosso proposito aqui é usufruir da versão Free.

Bem, graças a um update recente (Update 2) para a versão 8 do Veeam Backup Free Edition, é possível utilizar o módulo PowerShell do Veeam e escrever um script para realizar o backup de suas VMs e posteriormente utilizar o Task Scheduler do Windows para agendar a execução desse script.

Para obter o Veeam bem como a sua atualização, pesquise na internet por Veeam Backup Free Edition v8 ou entre no link atual do produto:

Obs,: É necessário realizar um cadastro para realizar o download do produto.


A instalação de Veeam é bem simples, mas para quem tiver alguma duvida, pode consultar a documentação online do passo a passo:



Muito Importante!!! Durante a instalação, será solicitado para escolher as funções que deseja instalar, nessa etapa você deverá obrigatoriamente habilitar a opção Veeam Backup & Replication PowerShell SDK (destacada em vermelho na imagem abaixo).



Script PowerShell para Backup de Virtual Machines

Para realizar o backup das VMs, vamos utilizar o script PowerShell abaixo. Consegui esse script na internet e fiz algumas alterações. 

Como a maioria dos clientes que atendo usam Hyper-V, o script abaixo está escrito para realizar somente backup de VMs rodando sobre Hyper-V.

Copie o código abaixo em um bloco de notas e salve o mesmo como VeeamBackupVMs.ps1.
ou faça download do script pronto através do link abaixo:


##################################################################
#                   Script de Backup VMs - Hyper-V
##################################################################

# Nome das VMs como elas aparecem na console Hyper-V separadas por virgula. Exemplo, $VMNames = “VM1”,”VM2”
$VMNames = "VM1","VM2"

# Hostname ou IP do host Hyper-V ou VCenter onde estão rodando as VMs
$HostName = "IP do Servidor Hyper-V"

# Diretorio onde serao salvos os backups (Exemplo: C:\Backup\Virtual_Machines)
$Directory = "C:\Backup\Virtual_Machines"

# Nivel de compressão do Backup (Valores: 0 - None, 4 - Dedupe-friendly, 5 - Optimal, 6 - High, 9 - Extreme) 
$CompressionLevel = "5"

# Quiesce VM when taking snapshot (Optional; VMware Tools are required; Possible values: $True/$False)
$EnableQuiescence = $True

# Protect resulting backup with encryption key (Optional; $True/$False)
$EnableEncryption = $False

# Encryption Key (Optional; path to a secure string)
$EncryptionKey = ""

# Retencao do Backup (Por padrão, os arquivos VeeamZIP não removidos e serão mantidos no local onde foi salvo por periodo indeterminado
# Valores: Never , Tonight, TomorrowNight, In3days, In1Week, In2Weeks, In1Month)
$Retention = "Never"

##################################################################
#                   Configuracoes de Email
##################################################################

# Ativando ou Desativando Alertas por Email
$EnableNotification = $True

# Email SMTP server
$SMTPServer = "IP do seu servidor Relay SMTP"

# Email FROM
$EmailFrom = "endereco de email que enviara as notificacoes do backup" 

# Email TO
$EmailTo = "endereco de email que recebera as notificacoes do backup"

# Email subject
$EmailSubject = "[BACKUP VM] - Backup Report VM - Veeam Backup"

##################################################################
#                   Formatacao do corpo do Email
##################################################################

$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>"

##################################################################
#                   Declaracao das Variaveis
##################################################################

#################### DA PARTIR DESSE PONTO, NAO ALTERAR NENHUMA LINHA ################
Asnp VeeamPSSnapin

$Server = Get-VBRServer -name $HostName
$MesssagyBody = @()

foreach ($VMName in $VMNames)
{
  $VM = Find-VBRHvEntity -Name $VMName -Server $Server
  
  If ($EnableEncryption)
  {
    $EncryptionKey = Add-VBREncryptionKey -Password (cat $EncryptionKey | ConvertTo-SecureString)
    $ZIPSession = Start-VBRZip -Entity $VM -Folder $Directory -Compression $CompressionLevel -DisableQuiesce:(!$EnableQuiescence) -AutoDelete $Retention -EncryptionKey $EncryptionKey
  }
  
  Else 
  {
    $ZIPSession = Start-VBRZip -Entity $VM -Folder $Directory -Compression $CompressionLevel -DisableQuiesce:(!$EnableQuiescence) -AutoDelete $Retention
  }
  
  If ($EnableNotification) 
  {
    $TaskSessions = $ZIPSession.GetTaskSessions().logger.getlog().updatedrecords
    $FailedSessions =  $TaskSessions | where {$_.status -eq "EWarning" -or $_.Status -eq "EFailed"}
  
  if ($FailedSessions -ne $Null)
  {
    $MesssagyBody = $MesssagyBody + ($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}})
  }
   
  Else
  {
    $MesssagyBody = $MesssagyBody + ($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={($TaskSessions | sort creationtime -Descending | select -first 1).Title}})
  }
  
  }   
}
If ($EnableNotification)
{
$Message = New-Object System.Net.Mail.MailMessage $EmailFrom, $EmailTo
$Message.Subject = $EmailSubject
$Message.IsBodyHTML = $True
$message.Body = $MesssagyBody | ConvertTo-Html -head $style | Out-String
$SMTP = New-Object Net.Mail.SmtpClient($SMTPServer)
$SMTP.Send($Message)
}




Basicamente, a unica coisa que muda no script para backups de Hyper-V ou VMware, é a entidade na linha 76, como mostra as imagens abaixo.



Entidade para Backups de VMs em Hyper-V


 Entidade para Backups de VMs em VMware


Agendando execução do script PowerShell pelo Task Scheduler

Abra o Task Scheduler e siga as etapas abaixo:


clique em criar tarefa básica



De um nome e uma descrição para nova tarefa


No nosso exemplo, vou criar uma tarefa para executar 5 dias na semana.   Mas no de vocês, escolham a frequência que mais se enquadra com seu ambiente.


Escolha os dias de execução do script


Escolha iniciar um programa


Powershell –file “Caminho do arquivo VeeamBackupVMs.ps1”


Caso apareça o alerta abaixo, clique em sim


Clique em concluir


Opcionalmente você pode usar outra ferramenta agendar a execução do script de Backup. Eu particularmente gosto de uma chamada System Scheduler.

Caso se interessem, podem baixa-la através do link abaixo:



Bem, é isso, espero que seja útil.

Abraços!!!

2 comentários:

  1. Muito bom seu post, parabéns. Este script funciona na versão 9.5 e com windows server 2012?
    Obrigado.

    ResponderExcluir
    Respostas
    1. Olá, Muito Obrigado,

      Pra falar a verdade eu não testei esse script com versões mais recentes do Veeam. Mas acredito que pelo fato do Veeam disponibilizar o módulo PowerShell em seu pacote, isso seja possivel.

      Vale fazer um Lab disso antes de implementar em produção.

      Abçs!

      Excluir