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 comments