SRM: Como automatizar procesos de DR

Bueno, siguiendo la línea de herramientas de Disaster Recovery y como comenté en el anterior post, vamos a hablar de automatización de procesos de SRM. Quién no se ha encontrado alguna vez con la necesidad de automatizar algún proceso? Pues, porque no vamos a poder automatizar procesos o tareas de SRM. A partir de la versión VMware Site Recovery Manager 5.8, permite la integración de SRM con PowerCLI. Por lo que podemos lanzar instrucciones vía PowerCLI para interactuar con SRM, y más importante podemos fácilmente “scriptar” tareas básicas utilizando PowerCLI + Powershell. A continuación vamos a detallar como automatizar las siguientes tareas:

  • Proteger una VM

Seguramente nos haya ocurrido que hemos tenido que crear un gran número de máquinas virtuales y nos ha surgido el tener que protegerlas todas. Incluso el posible que alguno haya implementado un workflow para vCO. A continuación voy a detallar como proteger una VM o incluso un grupo de VMs pasadas como parámetro. En el script que yo voy a exponer, debemos recoger como parámetros, la máquina virtual (Incluso podemos pasar un txt y añadir una sentencia “foreach” para proteger una a una las VMs), el Virtual Center y el Protection Group.

param(
[Parameter(Mandatory=$True)]
[string]$VCENTER,
[Parameter(Mandatory=$True)]
[string]$PG,
[Parameter(Mandatory=$True)]
[string]$VMNAME # Como he dicho podemos pasar un txt con los nombre de VMs a proteger 
 # e incluir un foreach para realizar el mismo proceso con cada VM
)
# Modulo para lanzar comandos de PowerCLI desde Powershell
Add-PSSnapin VMware.VimAutomation.Core
Import-Module Meadowcroft.SRM

# CREDENCIALES
$USER = 'USERNAME CON PERMISOS'
$PASS = 'AQUI INTRODUCIMOS LA PASS'

# Conexion al vCenter
Connect-VIServer -server $VCENTER -user $USER -password $PASS |out-null

# Conexion a SRM Server y llamada API

$Srm = Connect-SrmServer
$SrmApi=$Srm.ExtensionData

# Recogemos información de Protection Group y también recogemos el ProtectionSpec

$protectionGroups= $srmApi.Protection.ListProtectionGroups()
$targetProtectionGroup = $protectionGroups | where {$_.GetInfo().Name -eq $PG }
$protectionSpec = New-Object VMware.Vimautomation.Srm.Views.SrmProtectionGroupVmProtectionSpec
$protectionSpec.Vm = $VMNAME.ExtensionData.MoRef

#Protegemos la VM y realizamos un Workaround para controlar el proceso de Protección
$TareaProtege = $targetProtectionGroup.ProtectVms($protectionSpec)
while (-not $TareaProtege.IsComplete()) { sleep 1 }

# Desconectar de Virtual Center y Srm

Disconnect-SrmServer -Confirm:$false
Disconnect-VIServer -Confirm:$false
  • Desproteger una VM

Igual que antes, otra tarea que podemos querer automatizar es la de desproteger una máquina virtual previa al proceso de borrado de la máquina. A continuación os copio el script, debemos recoger como parámetros, la máquina virtual (Incluso podemos pasar un txt y añadir una sentencia “foreach” para proteger una a una las VMs), el Virtual Center y el Protection Group.


param(
[Parameter(Mandatory=$True)]
[string]$VCENTER,
[Parameter(Mandatory=$True)]
[string]$PG,
[Parameter(Mandatory=$True)]
[string]$VMNAME # Como he dicho podemos pasar un txt con los nombre de VMs a proteger
# e incluir un foreach para realizar el mismo proceso con cada VM
)
# Modulo para lanzar comandos de PowerCLI desde Powershell
Add-PSSnapin VMware.VimAutomation.Core
Import-Module Meadowcroft.SRM

# CREDENCIALES
$USER = 'USERNAME CON PERMISOS'
$PASS = 'AQUI INTRODUCIMOS LA PASS'

# Conexion al vCenter
Connect-VIServer -server $VCENTER -user $USER -password $PASS |out-null

# Conexion a SRM Server y llamada API

$Srm = Connect-SrmServer
$SrmApi=$Srm.ExtensionData

# Recogemos información de Protection Group

$protectionGroups= $srmApi.Protection.ListProtectionGroups()
$targetProtectionGroup = $protectionGroups | where {$_.GetInfo().Name -eq $PG }

#Protegemos la VM y realizamos un Workaround para controlar el proceso de Protección
$TareaDesproteger=$targetProtectionGroup.UnprotectVms($VMNAME.ExtensionData.MoRef)
while (-not$TareaDesproteger.IsComplete()) { sleep-Seconds1 }

# Desconectar de Virtual Center y Srm

Disconnect-SrmServer -Confirm:$false
Disconnect-VIServer -Confirm:$false

  • Generar un reporte de las VMs protegidas por SRM

Como medida de HealthCheck para comprobar el estado de SRM, podemos generar un reporte de las máquinas virtuales protegidas por SRM. Y porque no, vamos a realizar un script para que exporte a un fichero “csv”, los datos del estado de las VMs protegidas por SRM. A continuación voy a detallar un script para ello, simplemente le pasaremos como parámetro, el Virtual Center.

param(
[Parameter(Mandatory=$True)]
[string]$VCENTER
)
# Modulo para lanzar comandos de PowerCLI desde Powershell
Add-PSSnapin VMware.VimAutomation.Core
Import-Module Meadowcroft.SRM

# CREDENCIALES
$USER = 'USERNAME CON PERMISOS'
$PASS = 'AQUI INTRODUCIMOS LA PASS'

# Conexion al vCenter
Connect-VIServer -server $VCENTER -user $USER -password $PASS |out-null

# Conexion a SRM Server y llamada API

$Srm = Connect-SrmServer
$SrmApi=$Srm.ExtensionData

#Recogemos la lista de PG en nuestro Srm

$protectionGroups = $srmApi.Protection.ListProtectionGroups()

#Recorremos el lista de los PG recogidos e iremos volcando la Información en 
$protectionGroups | % {
 $protectionGroup = $_
 
 $protectionGroupInfo = $protectionGroup.GetInfo()
 
 # Listamos las máquinas virtuales recogidas en cada PG y recogemos un array de información de cada VM
 $protectedVms = $protectionGroup.ListProtectedVms()
 # Para rellenar los datos con la información recogida invocamos a UpdateViewData
 $protectedVms | % { $_.Vm.UpdateViewData() }
 # Despues recogeremos los datos que necesitemos volcar en el reporte
 $protectedVms | %{
 $output = "" | select VmName, PgName
 $output.VmName = $_.Vm.Name
 $output.PgName = $protectionGroupInfo.Name
 $output
 }
} | Format-Table @{Label="VM Name"; Expression={$_.VmName} }, @{Label="Protection group name"; Expression={$_.PgName} } | Export-Csv -Path "Report.csv"

# Desconectar de Virtual Center y Srm

Disconnect-SrmServer -Confirm:$false
Disconnect-VIServer -Confirm:$false
  • Ejecución de Recovery Plan

Para finalizar con el post, voy a incluir un script para automatizar el proceso de lanzamiento de un Recovery Plan. Para el script deberemos pasar como parámetros, el Virtual Center (Recovery Site), el Modo (failover,test,reprotect o CleanupTest) y por último le pasaremos el Recovery Plan a ejecutar. Este script como podemos comprobar, permite los 4 modos de ejecución, por lo que podremos utilizar el script para realizar pruebas con lanzamientos de Recovery Plan.


param(
[Parameter(Mandatory=$True)]
[string]$RECOVERY_PLAN,
[Parameter(Mandatory=$True)]
[string]$MODO, # test - reprotect - failover - CleanupTest
[Parameter(Mandatory=$True)]
[string]$VCENTER
)

# Modulo para lanzar comandos de PowerCLI desde Powershell
Add-PSSnapin VMware.VimAutomation.Core
Import-Module Meadowcroft.SRM

# CREDENCIALES
$USER = 'USERNAME CON PERMISOS'
$PASS = 'AQUI INTRODUCIMOS LA PASS'

# Comprobamos el MODO pasado como parámetro y le asignamos los diferentes estados

if ($MODO -eq "failover"){
$ESTADO_INICIAL = "ready"
$ESTADO_TRAS_FALLO ="needsFailover"
$ESTADO_FINAL = "failedOver"
}
elseif ($MODO -eq "reprotect"){
$ESTADO_INICIAL = "failedOver"
$ESTADO_TRAS_FALLO ="needsReprotect"
$ESTADO_FINAL = "protecting"
}
elseif ($MODO -eq "test"){
$ESTADO_INICIAL = "ready"
$ESTADO_FINAL = "needsCleanup"
}
elseif ($MODO -eq "CleanupTest"){
$ESTADO_INICIAL = "needsCleanup"
$ESTADO_FINAL = "ready"
}
else{
write-host "Valor incorrecto para MODO: failover | reprotect | test | CleanupTest"
Disconnect-VCENTER -server $VCENTER -confirm:$false |out-null
write-host "Desconectando de vCenter $VCENTER"
exit(1)
}

# Conexion al vCenter
Connect-VCENTER -server $VCENTER -user $USER -password $PASS |out-null

# Conexion a SRM Server y llamada API

$Srm = Connect-SrmServer
$SrmApi=$Srm.ExtensionData

#Comprobamos que existe el Recovery Plan

$existe=Get-SrmRecoveryPlan -Name $RECOVERY_PLAN
if ($existe -eq $null){
write-host "El dominio de salto $RECOVERY_PLAN no existe"
Disconnect-VCENTER -server $VCENTER -confirm:$false |out-null
write-host "Desconectando de vCenter $VCENTER"
exit(1)
}

# Comprobamos estado Recovery Plan

$SrmApi=$Srm.ExtensionData
$rp=$SrmApi.Recovery.ListPlans().GetInfo() | Where-Object {$_.Name -eq $RECOVERY_PLAN}
$ESTADO=$rp.State

# Ejecutamos el Recovery Plan

if ($ESTADO -eq $ESTADO_INICIAL){
Get-SrmRecoveryPlan -Name $RECOVERY_PLAN | Start-SrmRecoveryPlan -RecoveryMode $MODO -Confirm:$false
Write-Output "$(Get-Date -format "HH:mm:ss") -- Ejecutando Recovery Plan $($RECOVERY_PLAN) en modo $($MODO)..." | Out-File $LogEjecucion -Append
Write-host "Ejecutando Recovery Plan $RECOVERY_PLAN en modo $MODO..."
$i = 0
$ESTADO = "running"
while ($ESTADO -eq "running"){
$rp=$srmApi.Recovery.ListPlans().GetInfo() | Where-Object {$_.Name -eq $RECOVERY_PLAN}
$ESTADO=$rp.State
sleep 10
$i++
if ($i -gt 150){
write-host "Demasiadas iteracciones, saliendo por timeout: $ESTADO"
Disconnect-VCENTER -server $VCENTER -confirm:$false |out-null
write-host "Desconectando de vCenter $VCENTER"
exit(1)
}
}
}

# Comprobamos que el estado de la finalización del Recovery Plan

if ($ESTADO -eq $ESTADO_FINAL){
write-host "Operacion finalizada con exito: $ESTADO"
}
else{
write-host "Operacion finalizada con errores: $ESTADO"
Disconnect-VCENTER -server $VCENTER -confirm:$false |out-null
write-host "Desconectando de vCenter $VCENTER"
exit(1)
}

# Desconexión de Virtual Center y SRM
Disconnect-VCENTER -server $VCENTER -confirm:$false |out-null
Disconnect-SrmServer -Confirm:$false

Ya que estamos hablando de Automatización, deberíamos indicar que vRealize Orchestrator integra APIs de SRM, que permiten diseñar Workflows para ejecución de tareas automatizadas. Y porque no, en siguientes post, hablaremos de vRealize Orchestrator.

Espero que os haya gustado 🙂 . En siguientes post seguiremos hablando del maravilloso mundo de la Virtualización.

Muchas gracias por compartir!

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInBuffer this pageEmail this to someonePrint this page

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *