Cómo obtener listado de todas las máquinas virtuales de un host VMware ESXi, o de un clúster vCenter Server o de un vSphere. Obtiene todas las máquinas virtuales, así como sus datos básicos: nombre de la máquina virtual, nombre del host, IP, nombre del sistema operativo, total CPU asignada, total memoria RAM asignada, uso de memoria RAM, nombre de la red asignada (grupo de puertos o port group), datastore, snapshot creados, etc. Además, el script PowerShell (PowerCLI) enviará los datos recabados por correo electrónico con formato HTML.
- Requisitos para obtener listado de máquinas virtuales y enviar por mail.
- Script PowerShell (PowerCLI) para obtener listado de máquinas virtuales y sus datos y enviarlo por correo electrónico email.
- Ejecución del script PowerShell.
Requisitos para obtener listado de máquinas virtuales y enviar por mail
Necesitaremos disponer de las VMware PowerCLI instaladas en el equipo. En el siguiente artículo explicamos cómo instalarlas desde PowerShell en equipo Windows:
El equipo debe tener acceso al servidor hipervisor ESXi o bien al clúster VMware vCenter Server del que queramos obtener listado de las máquinas virtuales y sus datos.
Necesitaremos disponer de un usuario y contraseña con privilegios suficientes para listar máquinas virtuales en el ESXi o en el vCenter Server.
Script PowerShell (PowerCLI) para obtener listado de máquinas virtuales y sus datos y enviarlo por correo electrónico email
A continuación, mostramos el contenido completo del script PowerShell (ps) que realizará las siguientes acciones:
- Establecer valores de configuración del entorno PowerCLI.
- Conectar con servidor VMware ESXi o bien vCenter Server (el proceso es el mismo).
- Obtener los datos de cada máquina virtual y guardarlos en una variable.
- Enviar un correo electrónico SSL con los datos obtenidos en el cuerpo del mensaje, en formato HTML.
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 |
#Establecemos la configuración de las PowerCLI Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false -Scope AllUsers Set-PowerCLIConfiguration -ParticipateInCeip $false -Confirm:$false -Scope AllUsers Set-PowerCLIConfiguration -DefaultVIServerMode Single -Confirm:$false -Scope AllUsers Set-PowerCLIConfiguration -ProxyPolicy NoProxy -Confirm:$false -Scope AllUsers Set-PowerCLIConfiguration -DisplayDeprecationWarning $false -Confirm:$false -Scope AllUsers #Conectamos con el servidor ESXi o el vSphere o el vCenter Connect-VIServer -Server 192.168.1.3 -User root -Password MiContraseña -Force -Verbose:$false #Obtenemos las máquinas virtuales del vCenter o el ESXi y sus datos $informe = @() foreach($maquinaVirtualActual in Get-View -ViewType Virtualmachine){ $datosMVActual = "" | Select-Object VMName, Hostname, IPAddress, OS, VMState, TotalCPU, OverallCpuUsage, TotalMemory, MemoryUsage, ToolsStatus, HardwareVersion, Portgroup, VMHost, ProvisionedSpaceGB, UsedSpaceGB, Datastore, SnapshotName, SnapshotDate, SnapshotSizeGB $datosMVActual.VMName = $maquinaVirtualActual.Name $datosMVActual.Hostname = $maquinaVirtualActual.guest.hostname $datosMVActual.IPAddress = $maquinaVirtualActual.guest.ipAddress $datosMVActual.OS = $maquinaVirtualActual.Config.GuestFullName $datosMVActual.VMState = $maquinaVirtualActual.summary.runtime.powerState $datosMVActual.TotalCPU = $maquinaVirtualActual.summary.config.numcpu $datosMVActual.TotalMemory = $maquinaVirtualActual.summary.config.memorysizemb $datosMVActual.OverallCpuUsage = $maquinaVirtualActual.summary.quickStats.OverallCpuUsage $datosMVActual.MemoryUsage = $maquinaVirtualActual.summary.quickStats.guestMemoryUsage $datosMVActual.ToolsStatus = $maquinaVirtualActual.guest.toolsstatus $datosMVActual.HardwareVersion = $maquinaVirtualActual.config.Version $datosMVActual.Portgroup = Get-View -Id $maquinaVirtualActual.Network -Property Name | select -ExpandProperty Name $datosMVActual.VMHost = Get-View -Id $maquinaVirtualActual.Runtime.Host -property Name | select -ExpandProperty Name $datosMVActual.ProvisionedSpaceGB = [math]::Round($vm.Summary.Storage.UnCommitted/1GB,2) $datosMVActual.UsedSpaceGB = [math]::Round($vm.Summary.Storage.Committed/1GB,2) $datosMVActual.Datastore = $maquinaVirtualActual.Config.DatastoreUrl[0].Name $datosMVActual.SnapshotName = &{$script:snaps = Get-Snapshot -VM $maquinaVirtualActual.Name; $script:snaps.Name -join ','} $datosMVActual.SnapshotDate = $script:snaps.Created -join ',' $datosMVActual.SnapshotSizeGB = $script:snaps.SizeGB -join ',' $informe += $datosMVActual } #Enviamos por mail el informe obtenido anteriormente $servidorSMTP = "smtp.gmail.com" $mensajeObj = New-Object Net.Mail.MailMessage $smtp = New-Object Net.Mail.SmtpClient($servidorSMTP) $smtp.EnableSsl = $True $smtp.Credentials = New-Object System.Net.NetworkCredential("proyectoa@proyectoa.com", "ContraseñaMail"); $mensajeObj.From = "proyectoa@proyectoa.com" $mensajeObj.To.Add("proyectoa_vmware@proyectoa.com") $mensajeObj.Subject = "Listado de Máquinas virtuales - ProyectoA" $mensajeObj.IsBodyHtml = $true $mensajeObj.Body = ($informe | ConvertTo-Html | Out-String) $smtp.Send($mensajeObj) |
Ejecución del script PowerShell
Podremos programar una tarea (si lo deseamos) o bien ejecutarlo directamente. Sea como fuere, el script debe ejecutarse con privilegios elevados, dado que realiza modificaciones en directivas de seguridad de PowerShell o PowerCLI.
Ejecución directa del script PowerShell (ps)
En este caso, o bien ejecutamos el script desde Windows PowerShell ISE, abriéndolo como administrador:
Copiaremos y pegaremos el script en la interfaz gráfica de PowerShell ISE, modificando y adaptando los valores a nuestro entorno:
Una vez configurado el script, para ejecutarlo, será suficiente con pulsar la tecla F5 o bien el botón «Ejecutar script»:
Programar tarea para ejecutar script PowerShell periódicamente
Si optamos por crear una tarea programada que ejecute el script PowerShell periódicamente, previamente lo guardaremos en un fichero .ps, por ejemplo con el nombre Obtener_MV_Mail.ps1. Este fichero contiene usuario y contraseña de acceso al vCenter, por lo que debemos colocarlo en una carpeta segura, a la que únicamente tengan acceso los administradores del sistema.
Crearemos la tarea programada, marcaremos «Ejecutar tanto si el usuario inició sesión como si no» y marcaremos «Ejecutar con los privilegios más altos». Estableceremos un usuario con permisos suficientes para ejecutar tareas con los privilegios más altos:
Estableceremos el desencadenador, por ejemplo, una vez a la semana (los lunes a las 8 de la tarde):
Añadiremos la acción, seleccionando «Iniciar un programa». Introduciendo los siguientes datos:
- Programa o script: elegiremos aquí la ubicación del fichero .exe de PowerShell, que suele ser:
1 |
C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe |
- Agregar argumentos: añadiremos aquí los parámetros de ejecución, entre ellos, el más importante, la ruta del script PowerShell a ejecutar. En nuestro caso ubicado en C:\Scripts\PowerShell\Obtener_MV_Mail.ps1:
1 |
-Noninteractive -WindowStyle Hidden -ExecutionPolicy Bypass –Noprofile -file "C:\Scripts\PowerShell\Obtener_MV_Mail.ps1" |
Cuando se ejecute el script PowerShell, nos llegará un mail como el siguiente: