vbscript, vmware, virtual server y otras hierbas


Al final resulta que la clave para administrar infraestructura es tener la mayor parte de operaciones automatizadas. Así que para administrar de manera eficiente hay que tener bastantes scripts que te liberen de tareas repetitivas y si puede ser, que arreglen el problema directamente antes que reportarlo.

El script que pondré a continuación tiene sentido cuando estás monitorizando varias decenas de servidores, muchos de ellos con VMWare, Virtual Server o las dos cosas. Para monitorizar lo más práctico IMHO es Zabbix, aunque sé que también hay mucha gente que usa Nagios.
No tengo nada en contra de Nagios: siempre me he regido por el principio de que uno debe usar la herramienta que más se adapta a sus necesidades y en la que se sienta más confortable. Personalmente nunca me gustó de Nagios tener que resetear el servicio para aplicar cambios en la configuración .. pero en fin.

En un entorno donde hay Nagios, Zabbix o lo que sea, si queremos monitorizar equipos donde se están ejecutando tropecientas máquinas virtuales al final de cada “sonda” habrá un pequeño script que hará el trabajo sucio. Y aquí comienza el bello arte del scripting: lo mismo dá si es en Perl, Bash, AWK, VBScript o yo que sé. Lo que cuenta que es hagan su función correctamente (a poder ser, que corrijan el error y que no se limiten a reportarlo) y listo!

Hasta hace relativamente poco yo ignoraba el potencial de VBscript y lo tenía como un lenguaje de scripting para hacer dos cositas (onClick? dios quiera que me perdonen los fanáticos de AJAX …) y poco más. También he de reconocer que pensaba lo mismo de Javascript, pero ultimamente por motivos laborales estoy tocando bastante JS y tengo que reconocer que JS, E4X … son herramientas muy potentes y tienen mucha más aplicación que la web.

Me dí cuenta de mi ignorancia en el tema cuando empecé a ser asiduo de Computer Performance a raíz cursar el MCSA, y muchos de los scripts que he usado después en entornos Windows se han inspirado directa o indirectamente de ahí.

Volviendo al tema: al usar Zabbix, Nagios o lo que sea, al final estas herramientas necesitan instalar un agente en cada equipo monitorizado para poder monitorizar valores “no triviales”. Digamos que, si aspiramos a monitorizar algo más que si el equipo responde a ping, o si tiene noseque puerto a la escucha, necesitaremos instalar el susodicho agente. Y si el check es algo más elaborado, pues tendremos que scriptear, y al final devolver 0 o 1.

En mi caso, tengo bastantes servidores de máquinas virtuales VMWare, Virtual Server y éste script me ha quitado bastante trabajo:


'**************************************************************************
' Author: quimicefa@gmail.com
' conecta con el servicio de Virtual Server y VMWare Server, y devuelve
' el total de maquinas que no est·n en estado "running"
'**************************************************************************
' Estados VMWare
' 1: ejecutando
' 2: parado
' 3: pausado
'**************************************************************************
' Estados Virtual Server
' 1: stopped
' 6: paused
''''''''''''''''''''''''' 2: paused ?? no lo parece!
' 5: running
'**************************************************************************
On Error Resume Next

Const vmExecutionState_On = 1
Const vmExecutionState_Off = 2
Const vmExecutionState_Suspended = 3
Const vmExecutionState_Stuck = 4
Const vmExecutionState_Unknown = 5
Const vmPowerOpMode_Hard = 1
Const vmPowerOpMode_Soft = 2
Const vmPowerOpMode_TrySoft = 3

'**************************************************************************
' Las maquinas virtuales que tengan un nombre que empiece por "strPrefix"
' "^" significa = "que empiecen por...", al estilo regexp, grep awk de toda la vida!
' estan excluidas de de este script:
' -no cuentan como maquinas paradas
' -no se arrancan o se les pone en play si estuvieran paradas o pausadas
'**************************************************************************
strPrefix = "^OUT-"

'**************************************************************************
' 0: no cumple el patrón
' -1: cumple el patrón
'**************************************************************************
Function HasPrefix(paramStr)
Set objRegExp = New RegExp
With objRegExp
.Pattern = strPrefix
.IgnoreCase = True
.Global = True
End With
HasPrefix=objRegExp.Test(paramStr)
End Function

Dim nMachinesOut
nMachinesOut = 0

'**************************************************************************
' Conectar con el servicio de Virtual Server
'**************************************************************************
Set objVS = CreateObject("VirtualServer.Application")
set colVMs = objVS.VirtualMachines
If objVMColl.Count > 0 Then
For Each objVM in colVMS
If HasPrefix(objVM)=0 Then
If ( objVM.State 5 ) Then
nMachinesOut = nMachinesOut + 1
If ( objVM.State = 1 ) Then
objVM.Startup()
ElseIf ( objVM.State = 6 ) Then ' 2 o 6 ??
objVM.Resume()
End If
End If
End If
Next
End If

'**************************************************************************
' Conectar con el servicio VMWare
'**************************************************************************
Set cp = CreateObject("VmCOM.VmConnectParams")
Set server = CreateObject("VmCOM.VmServerCtl")
server.Connect cp
Set vmCollection = server.RegisteredVmNames
If vmCollection.Count > 0 Then
For Each vmName in vmCollection
Set vm = CreateObject("VmCOM.VmCtl")
vm.Connect cp,vmName
If HasPrefix(vm.Config("displayName"))=0 Then
If vm.ExecutionState 1 Then
nMachinesOut = nMachinesOut + 1
vm.Start(vmPowerOpMode_TrySoft)
End If
End If
Next
End If

WScript.Echo nMachinesOut

Este script tiene dos secciones equivalentes para VMWare Server y Virtual Server. Conecta con el servicio VMW/VS y para todas las maquinas virtuales que encuentra *a no ser que su nombre comience por OUT-* si está pausada la “resume” y si está parada la arranca. Al final devuelve el número total de maquinas que ha tenido que “resumir” o arrancar, que es el valor interesante a monitorizar. No quiero saber el total de maquinas paradas (y cuales son) para tener que ir arrancándolas a mano, quiero que las arranque todas y me diga si ha tenido que intervenir o no.

El tema de excluir las que tienen un nombre que empieza por “OUT-” es simplemente porque si alguien ha de hacer una operación de mantenimiento como cambiar la RAM asignada, copiarla a otro equipo .. etc no es nada recomendable que se arranque cuando estamos a mitad de operación. Por eso, antes de comenzar la operación de mantenimiento, renombraremos la maquina “misuperchismedeproducción” a “out-misuperchismedeproducción” y con esto quedamos excluidos de las comprobaciones del script.

Espero que esto pueda servir a alguien que administre “cacharritos” virtualizados!

Unos enlaces:

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: