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!

2 thoughts on “SRM: Como automatizar procesos de DR

  1. Pingback: Importar/Exportar configuración SRM | CloudVM

  2. Pingback: Import/Export configuration SRM [Script] | CloudVM

Deja un comentario

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