lunes, 25 de junio de 2018

Creando copias de backup programadas con VeeamZIP

Ey, un momento... ¿Pero una de las pegas de VeeamZip no es que no se pueden programar copias, ya que es un software gratuito? Bueno...si, no se podía... hasta la segunda actualización de Veeam Backup 9.5, donde se ha agregado esta funcionalidad mediante cmdlets, lanzables con Start-VBRZIP en Powershell.


Veeam te facilita incluso el script preparado para descargar y configurar los parámetros conforme a tus necesidades. Aqui tienes el Script para VMware y para Hyper-V listos. De todas formas hago aqui el copypaste del script, para que le eches un ojo antes de descargarlo. Verás que es simple.

# Author: Vladimir Eremin
# Created Date: 3/24/2015
# http://forums.veeam.com/member31097.html
#

##################################################################
#                   User Defined Variables
##################################################################

# Names of VMs to backup separated by comma (Mandatory). For instance, $VMNames = “VM1”,”VM2”
$VMNames = ""

# Name of vCenter or standalone host VMs to backup reside on (Mandatory)
$HostName = ""

# Directory that VM backups should go to (Mandatory; for instance, C:\Backup)
$Directory = ""

# Desired compression level (Optional; Possible values: 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 = $True

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

# Retention settings (Optional; By default, VeeamZIP files are not removed and kept in the specified location for an indefinite period of time.
# Possible values: Never , Tonight, TomorrowNight, In3days, In1Week, In2Weeks, In1Month)
$Retention = "Never"

##################################################################
#                   Notification Settings
##################################################################

# Enable notification (Optional)
$EnableNotification = $True

# Email SMTP server
$SMTPServer = ""

# Email FROM
$EmailFrom = ""

# Email TO
$EmailTo = ""

# Email subject
$EmailSubject = ""

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

##################################################################
#                   End User Defined Variables
##################################################################

#################### DO NOT MODIFY PAST THIS LINE ################
Asnp VeeamPSSnapin

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

foreach ($VMName in $VMNames)
{
  $VM = Find-VBRViEntity -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)
}



Por cierto, aunque lo indica la cabecera, no está de mas agradecerle el esfuerzo a Vladimir Eremin, un crack de Veeam y Powershell.

Yo me suelo cargar la parte de email formatting y notification settings porque la notificación la realizo posteriormente con otro sistema, pero esto va por gustos. En fin, seguimos:

En rojo, las partes que debes modificar conforme a tu sistema.

Hay una parte, $EnableEncryption = $True y $EncryptionKey = "" que hacen referencia a la introduccion de un sistema de encriptado e copias, altamente recomendado, por seguridad. Pero esta parte del script está incompleta. Es decir, si pones $EnableEncryption = $False, no hay problema, pero si pones True, previamente, en Powershell, necesitas ingresar las siguientes lineas:

$SecurePassword = Read-Host -Prompt "Enter password" -AsSecureString
$SecurePassword | ConvertFrom-SecureString > “Directorio donde la clave debería almacenarse; C:\SecureString.txt, for instance”

Despues de esto, en el script, manteniendo la encriptacion en $True, en la siguiente linea, la de $EncryptionKey, introduces la ruta del .txt que indicaste previamente. Esto es así porque powershell no admite contraseñas en cadenas regulares. 

Vamos ahora con la parte de la programación de la tarea programada para la ejecucion del script. A estas alturas de la película no voy a explicar cómo se crea una tarea programada, pero sí indicaré el único punto delicado de la configuración, la acción "Ejecutar un programa". El programador de tareas ejecuta por defecto CMD, no powershell, asi que hay que llamar a Powershell e indicarle como añadido la ruta del archivo a ejecutar:


O bien, lo haces como un parámetro agregado a la invocacion del programa, así:

Powershell -file "aqui la ruta del archivo .ps1" sin comillas

¡No tiene mas! Visto asi parece complicado, pero es muy sencillo, de veras. A ver si saco tiempo, y para el siguiente post indico cómo enlazar esta copia completa de la VM con un sistema de almacenamiento en la nube, permitiendonos dejar así unas copias perfectas para cubrir una contingencia tipo Disaster Recovery.

Por si acaso, una vez realizada la programación, ejecutala a mano. Nunca está de más asegurarse de que la tarea funciona.

4 comentarios:

  1. como podemos pasarle al script el usuario y contraseña de una unidad CIFS/ samba, ya que no copia sin los accesos
    atento a sus respuestas
    gracias

    ResponderEliminar
  2. Bueno, el script es para powershell, lo que quiere decir que estás ejecutando la copia en un sistema Windows. Para copiar los datos a una unidad CIFS quiere decir que previamente la debes montar en un sistema Windows. No se si te valdrá con esto:
    https://guiesbibtic.upf.edu/recerca/samba/esp/windows

    ResponderEliminar
    Respuestas
    1. esta montado amigo , pero aun asi el veaam 9.5 pide las credenciales , si la realiza manual puedo agregar la credencial por interfaz grafica

      Eliminar
    2. lo unico que se me ocurre es que ocnsultes al creador del script en su perfil de Veeam, https://forums.veeam.com/member31097.html
      La otra es buscar toda la info disponible sobre la powershell console de Veeam, para ve si puedes, y de qué manera, añadir los parámetros de conexio nque te pide la unidad de red.

      Eliminar

¡Gracias por colaborar en este blog con tus comentarios! :)