Cómo monitorizar los recursos básicos: espacio usado en datastores, número de máquinas virtuales, número de alarmas, número de máquinas virtuales sin las VMware Tools instaladas, uso de CPU, uso de RAM, etc, en un servidor hipervisor de virtualización VMware ESXi 6.7 o en un clúster VMware vCenter. Para obtener los datos usaremos VMware PowerCLI y como sistema de monitorización usaremos Pandora FMS 7.0.
- Requisitos para monitorizar servidor host VMware ESXi con PowerCLI.
- Instalar agente de Pandora FMS en equipo Windows.
- Crear script PowerCLI para obtener datos del host ESXi o de todos los hosts ESXi de un VMware vCenter Server.
- Agregar módulos en agentes de Pandora FMS para que obtengan los datos del VMware vCenter Server y hosts ESXi.
- Visualizar los datos obtenidos en Pandora FMS Server.
Requisitos para monitorizar servidor host VMware ESXi con PowerCLI
La monitorización la realizaremos desde un equipo con sistema operativo Windows 10, Windows 11 o bien Windows Server 2016, 2019 o 2022. A continuación detallamos los requisitos para monitorizar uno o varios hosts ESXi y un vCenter Server.
Disponer de uno o varios hipervisores VMware ESXi o también disponer de un clúster VMware vCenter Server
Necesitaremos, como es evidente, uno o varios host ESXi o bien, un clúster vCenter Server. En el siguiente artículo explicamos cómo montar un clúster vCenter Server desde cero:
Se puede dar el caso de tener únicamente un host ESXi o bien de tener varios pero no en clúster.
En este artículo explicaremos cómo monitorizar ambos casos: vCenter Server y host ESXi.
Equipo con Windows 10, 11 o Windows Server 2016, 2019, 2022 con las PowerCLI
Si disponemos de un clúster VMware vCenter Server sobre Windows Server, podríamos usar este mismo servidor para la monitorización. En cambio, si disponemos de un vCenter Server sobre Linux, seguiremos los pasos de este tutorial para usar cualquier equipo Windows de la red (que tenga acceso al vCenter Server) para monitorizarlo «en remoto».
A su vez, si únicamente queremos monitorizar un host ESXi (o varios sin clúster), el proceso será el mismo que para un vCenter Server, solo variará el script a ejecutar. Todo esto lo explicamos más adelante.
En dicho equipo Windows necesitaremos instalar las VMware PowerCLI. En el siguiente artículo explicamos cómo instalarlas y cómo acceder a un entorno de virtualización VMware vCenter Server (mismo método para acceder a un único host ESXi):
Usuario con permisos de lectura en los host VMware ESXi y en el vCenter Server
Necesitaremos disponer también de un usuario y contraseña de acceso a los hosts ESXi (o al clúster vCenter Server). Utilizaremos este usuario al llamar a los scripts que realizarán la conexión y obtendrán la información.
Para cada host ESXi, tanto si tenemos vCenter Server como si no, podremos crear el usuario como indicamos en el siguiente artículo:
En principio, este usuario, no necesita permisos especiales, únicamente permisos de solo lectura:

En el caso de un vCenter Server, crearemos el usuario para la monitorización con Pandora FMS, desde «Administración» – Single Sign On» – «Usuarios y grupos»:

Estableceremos el permiso de «Solo lectura» para este usuario, para todo el Datacenter, pulsando con el botón derecho sobre el «Datacenter» y eligiendo «Agregar permiso…»:

Elegiremos el usuario «pandora» creado anteriormente, y en Función, elegiremos «Solo lectura». Marcaremos el check «Propagar a objetos secundarios»:

De esta forma, tendremos un usuario en el vCenter Server con permisos para leer los datos que necesitaremos más adelante (datastores, máquinas virtuales, CPU, RAM, etc.).
Servidor con Pandora FMS Server
Dispondremos de un servidor con Pandora FMS Server. En el siguiente artículo explicamos cómo montar un servidor de monitorización con Pandora FMS:
Datos de ejemplo que se usarán en el entorno de pruebas
Para este ejemplo, dispondremos de los siguientes equipos:
- Un equipo cliente con Windows 10 y las PowerCLI instaladas, con visibilidad de la red del vCenter y los host ESXi.
- Un servidor con Pandora FMS Server, con IP 192.168.1.200.
- Un servidor hipervisor ESXi con IP 192.168.1.10.
- Un segundo servidor hipervisor ESXi con IP 192.168.1.11.
- Un VMware vCenter Server, clúster formado por los dos servidores anteriores, con IP 192.168.1.45.
Instalar agente de Pandora FMS en equipo Windows
En el equipo que usemos para obtener los datos del VMware vCenter o del host ESXi, en el que hayamos instalado las PowerCLI, instalaremos también el agente de Pandora FMS. Es bastante sencillo, descargaremos la última versión para Windows de la web oficial de Pandora FMS, a la fecha de este artículo, el fichero Pandora FMS Windows Agent v7.0NG.772.1_x86_64.exe:

Seguiremos los pasos del asistente de instalación de Pandora FMS Agent:

Indicaremos la dirección IP del servidor con Pandora FMS Server (podemos modificarla tras la instalación, en el fichero pandora_agent.conf):

No marcaremos la opción «Habilitar configuración remota». Esta opción está solo disponible para Pandora FMS Enterprise:

Desmarcaremos la opción «Ejecutar Pandora FMS Agent 7.0NG.772.1», dado que, de momento, no ejecutaremos el agente (hasta haber configurado todos los módulos, como explicaremos en los siguientes puntos del artículo).

Crear script PowerCLI para obtener datos del host ESXi o de todos los hosts ESXi de un VMware vCenter Server
A continuación, mostramos el contenido de los dos ficheros de scripts .ps (PowerShell de VMware), que usaremos para obtener los datos del ESXi o del vCenter Server (de todos sus ESXi). Estos scripts mostrarán una salida por pantalla con el formato correcto para envío al servidor de Pandora FMS de cada módulo (Carga_CPU, Memoria_RAM_Usada, Espacio_Usado_DS_XXXX, Numero_Alarmas, Numero_MV_VMwareTools_OLD, Numero_Alarmas_vCenter, etc.). En realidad, se puede obtener casi cualquier dato que se quiera monitorizar.
En primer lugar, en la carpeta del agente de Pandora FMS (instalado en el punto anterior), crearemos un fichero con el nombre datos_host.ps1, este fichero será el encargado de obtener los datos a monitorizar de un host ESXi concreto. Tendrá el siguiente contenido:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
param([string]$ip, [string]$user, [string]$password) Add-PSSnapin VMware.VimAutomation.Core $certificado = Set-PowerCLIConfiguration -InvalidCertificateAction "Ignore" -Confirm:$false $conexion = Connect-VIServer -server $ip -user $user -password $password $datosHostESX = Get-VMHost $estadisticasCPURAM = "cpu.usage.average","mem.usage.average" $estadisticas = Get-Stat -Entity $datosHostESX -Realtime -Stat $estadisticasCPURAM -MaxSamples 1 $estadisticas | Group-Object -Property Entity | %{ $hostESX = "" | Select HostName, VMName, CPUAvg $hostESX.HostName = $_.name $cpu = $_.Group | where {$_.MetricId -eq "cpu.usage.average"} | Measure-Object -Property value -Average $memoria = $_.Group | where {$_.MetricId -eq "mem.usage.average"} | Select -ExpandProperty Value $hostESX.CPUAvg = [int]$cpu.Average $hostname = $hostESX.HostName } # Memoria RAM ocupada y % carga CPU echo "<module>" echo " <name><![CDATA[Carga_CPU]]></name>" echo " <description><![CDATA[% carga de CPU ESXi]]></description>" echo (" <data><![CDATA[" + $cpu.Average + "]]></data>") echo "</module>" echo "<module>" echo " <name><![CDATA[Memoria_RAM_Usada]]></name>" echo " <description><![CDATA[% memoria RAM usada ESXi]]></description>" echo (" <data><![CDATA[" + $memoria + "]]></data>") echo "</module>" # Calculo porcentaje de espacio ocupado en Datastore function calcularPorcentaje { param([parameter(Mandatory = $true)] [int]$InputNum1, [parameter(Mandatory = $true)] [int]$InputNum2) $ocupado = $InputNum2 - $InputNum1 $ocupado / $InputNum2 * 100 } # Obtener datastores del host ESX y su espacio ocupado $datastores = Get-Datastore -Refresh -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue | Sort Name ForEach ($datastore in $datastores) { if (($datastore.Name -match "Shared") -or ($datastore.Name -match "")) { #if ($datastore.CapacityMB -match "0") #problemas al obtener espacio ocupado #{ # $porcentajeOcupado = "Antención: problemas al obtener espacio ocupado" #} #else #{ $porcentajeOcupado = calcularPorcentaje $datastore.FreeSpaceMB $datastore.CapacityMB $porcentajeOcupado = "{0:N2}" -f $porcentajeOcupado $datastore | Add-Member -type NoteProperty -name PercentFree -value $porcentajeOcupado #} } echo "<module>" echo (" <name><![CDATA[Espacio_Usado_DS_" + $datastore + "]]></name>") echo (" <description><![CDATA[% uso espacio datastore " + $datastore + "]]></description>") echo (" <data><![CDATA[" + $porcentajeOcupado + "]]></data>") echo (" <min_warning>75</min_warning>") echo (" <max_warning>90</max_warning>") echo (" <min_critical>91</min_critical>") echo (" <max_critical>100</max_critical>") echo "</module>" } # Numero de maquinas virtuales $mv = Get-VM echo "<module>" echo (" <name><![CDATA[Numero_MV]]></name>") echo " <description><![CDATA[Numero de maquinas virtuales]]></description>" echo (" <data><![CDATA[" + $mv.Count + "]]></data>") echo "</module>" # Maquinas virtuales con VMware Tools obsoletas $mvToolsObsoletas = Get-VM | where{$_.Guest.ExtensionData.ToolsStatus -eq 'toolsOld'} echo "<module>" echo " <name><![CDATA[Numero_MV_VMwareTools_OLD]]></name>" echo " <description><![CDATA[Numero MV VMwrare Tools obsoletas]]></description>" echo (" <data><![CDATA[" + $mvToolsObsoletas.Count + "]]></data>") echo "</module>" # Maquinas virtuales con VMware Tools no instaladas $mvToolsNoInstaladas = Get-VM | where{$_.Powerstate -eq "PoweredOn" -and $_.Guest.ExtensionData.ToolsStatus -eq 'toolsNotInstalled'} echo "<module>" echo " <name><![CDATA[Numero_MV_VMwareTools_No_Instaladas]]></name>" echo " <description><![CDATA[Numero MV VMwrare Tools no instaladas]]></description>" echo (" <data><![CDATA[" + $mvToolsNoInstaladas.Count + "]]></data>") echo "</module>" # Alarmas en el vCenter $descripcion = "Alarmas lanzadas en ESX" $numAlarmas = 0 $carpetasVCenter = Get-Folder # Obtenemos los contenedores de objetos del vCenter # Recorremos cada carpeta y cada alarma del vCenter foreach ($alarmaLanzada in $carpetasVCenter.ExtensionData.TriggeredAlarmState) { $definicionAlarma = Get-View -Id $alarmaLanzada.Alarm # Obtenemos información de la alarma $entidadObjeto = Get-View $alarmaLanzada.Entity $entidadObjetoTipo = $entidadObjeto.GetType().Name $descripcionAlarma += " [Alerta][" + $entidadObjetoTipo + "]" + $definicionAlarma.Info.Name $numAlarmas = $numAlarmas + 1 } if ($numAlarmas -gt 0) { $descripcion = $descripcionAlarma } echo "<module>" echo " <name><![CDATA[Numero_Alarmas]]></name>" echo (" <description><![CDATA[" + $descripcion + "]]></description>") echo (" <data><![CDATA[" + $numAlarmas + "]]></data>") echo "</module>" |
En cambio, si tenemos un VMware vCenter Server (con un clúster de hosts ESXi), crearemos un segundo fichero, también en la carpeta del agente de Pandora FMS, con el nombre datos_vcenter_ds.ps1, encargado de obtener los datos del vCenter Server (datastores, número de máquinas con VMware Tools obsoletas, memoria RAM total usada de todos los hipervisores del clúster, uso de CPU global, número de alarmas lanzadas en el vCenter, número de máquinas virtuales sin las VMware Tools instaladas, etc. El contenido de este fichero será:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
param([string]$ip, [string]$user, [string]$password) Add-PSSnapin VMware.VimAutomation.Core Set-PowerCLIConfiguration -InvalidCertificateAction "Ignore" -Confirm:$false connect-viserver -server $ip -user $user -password $password ######### CPU y RAM ######### $entity = Get-VMHost $counter = "cpu.usage.average","mem.usage.average" $stats = Get-Stat -Entity $entity -Realtime -Stat $counter -MaxSamples 1 $stats | Group-Object -Property Entity | %{ $hoststat = "" | Select HostName, VMName, CPUAvg $hoststat.HostName = $_.name $cpu = $_.Group | where {$_.MetricId -eq "cpu.usage.average"} | Measure-Object -Property value -Average $memory = $_.Group | where {$_.MetricId -eq "mem.usage.average"} | Select -ExpandProperty Value $hoststat.CPUAvg = [int]$cpu.Average $hostname = $hoststat.HostName } echo "<module>" echo " <name><![CDATA[Uso_CPU]]></name>" echo " <description><![CDATA[% uso CPU]]></description>" echo (" <data><![CDATA[" + $cpu.Average + "]]></data>") echo (" <unit>%</unit>") echo (" <min_warning>60</min_warning>") echo (" <max_warning>80</max_warning>") echo (" <min_critical>81</min_critical>") echo (" <max_critical>100</max_critical>") echo "</module>" echo "<module>" echo " <name><![CDATA[Memoria_RAM_Usada]]></name>" echo " <description><![CDATA[% uso memoria RAM]]></description>" echo (" <data><![CDATA[" + $memory + "]]></data>") echo (" <unit>%</unit>") echo (" <min_warning>60</min_warning>") echo (" <max_warning>80</max_warning>") echo (" <min_critical>81</min_critical>") echo (" <max_critical>100</max_critical>") echo "</module>" ######### ESPACIO DATASTORES ######### function CalcPercent { param( [parameter(Mandatory = $true)] [int]$InputNum1, [parameter(Mandatory = $true)] [int]$InputNum2) $ocupado = $InputNum2 - $InputNum1 $ocupado / $InputNum2*100 } $datastores = Get-Datastore -Refresh -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue | Sort Name ForEach ($ds in $datastores) { if (($ds.Name -match "Shared") -or ($ds.Name -match "")) { $PercentOcu = CalcPercent $ds.FreeSpaceMB $ds.CapacityMB $PercentOcu = "{0:N2}" -f $PercentOcu $ds | Add-Member -type NoteProperty -name PercentFree -value $PercentOcu } echo "<module>" echo (" <name><![CDATA[Espacio_Usado_DS_" + $ds.Name + "]]></name>") echo (" <description><![CDATA[% uso espacio datastore " + $ds.Name + "]]></description>") echo (" <data><![CDATA[" + $PercentOcu + "]]></data>") echo (" <unit>%</unit>") echo (" <min_warning>75</min_warning>") echo (" <max_warning>90</max_warning>") echo (" <min_critical>91</min_critical>") echo (" <max_critical>100</max_critical>") echo "</module>" #echo $ds.CapacityMB >> $salida #echo $ds.FreeSpaceMB >> $salida } # Numero de maquinas virtuales $mv = Get-VM echo "<module>" echo (" <name><![CDATA[Numero_MV]]></name>") echo " <description><![CDATA[Numero de maquinas virtuales]]></description>" echo (" <data><![CDATA[" + $mv.Count + "]]></data>") echo "</module>" # Maquinas virtuales con VMware Tools obsoletas $mvToolsObsoletas = Get-VM | where{$_.Guest.ExtensionData.ToolsStatus -eq 'toolsOld'} echo "<module>" echo " <name><![CDATA[Numero_MV_VMwareTools_OLD]]></name>" echo " <description><![CDATA[Numero MV VMwrare Tools obsoletas]]></description>" echo (" <data><![CDATA[" + $mvToolsObsoletas.Count + "]]></data>") echo "</module>" # Maquinas virtuales con VMware Tools no instaladas $mvToolsNoInstaladas = Get-VM | where{$_.Powerstate -eq "PoweredOn" -and $_.Guest.ExtensionData.ToolsStatus -eq 'toolsNotInstalled'} echo "<module>" echo " <name><![CDATA[Numero_MV_VMwareTools_No_Instaladas]]></name>" echo " <description><![CDATA[Numero MV VMwrare Tools no instaladas]]></description>" echo (" <data><![CDATA[" + $mvToolsNoInstaladas.Count + "]]></data>") echo "</module>" # Alarmas en el vCenter $descripcion = "Alarmas lanzadas en vCenter" $numAlarmas = 0 $carpetasVCenter = Get-Folder # Obtenemos los contenedores de objetos del vCenter # Recorremos cada carpeta y cada alarma del vCenter foreach ($alarmaLanzada in $carpetasVCenter.ExtensionData.TriggeredAlarmState) { $definicionAlarma = Get-View -Id $alarmaLanzada.Alarm # Obtenemos información de la alarma $entidadObjeto = Get-View $alarmaLanzada.Entity $entidadObjetoTipo = $entidadObjeto.GetType().Name if (($definicionAlarma.Info.Name -ne "VMware critical notification") -and ($entidadObjetoTipo -ne "Folder")) { $descripcionAlarma += " [Alerta][" + $entidadObjetoTipo + "]" + $definicionAlarma.Info.Name $numAlarmas = $numAlarmas + 1 } } if ($numAlarmas -gt 0) { $descripcion = $descripcionAlarma } echo "<module>" echo " <name><![CDATA[Numero_Alarmas_vCenter]]></name>" echo (" <description><![CDATA[" + $descripcion + "]]></description>") echo (" <data><![CDATA[" + $numAlarmas + "]]></data>") echo "</module>" |
La carpeta del agente de Pandora FMS, habitualmente, suele estar en:
C:Program Filespandora_agent
Es muy recomendable realizar una prueba de ejecución de los dos scripts anteriores, antes de agregar el módulo al agente de Pandora FMS (como explicaremos a continuación). Para probar estos scripts, abriremos una ventana de MS-DOS (Símbolo de sistema) y ejecutaremos:
powershell -ExecutionPolicy RemoteSigned -File "C:Program Filespandora_agentdatos_vcenter_ds.ps1" 192.168.1.45 pandora@vsphere.local Contraseña_Usuario_Pandora






