PowerShell: Cmdlet para inventariar las máquinas virtuales gestionadas por un servidor SCVMM
Posted by urpiano en Miércoles 6 \06\+01:00 octubre \06\+01:00 2010
Esta función de PowerShell lista las máquinas virtuales albergadas en los hosts de virtualización que administra un servidor de System Center Virtual Machine Manager. Puede listar todas las máquinas o sólo las que están albergadas en nodos de clúters. El listado se puede ver por pantalla o exportarlo a un fichero de valores separados por tabulador (ideal para ser abierto por Excel)
El Cmdlet incluye ayuda, pego a continuación la ayuda con modificador -Detailed (esta ayuda se basa en la prestación de ayuda basada en comentarios de PowerShell 2.0 ¿Qué todavía tienes la versión 1.0 y no la 2.0? ¿A qué esperas para instalarla si es mucho mejor?):
NOMBRE
Get-VMInventory
SINOPSIS
Lista las máquinas virtuales gestionadas por un servidor de SCVMM.
SINTAXIS
Get-VMInventory [[-VMM] ] [-Cluster] [[-Fichero] ] []
DESCRIPCIÓN
Este Cmdlet permite obtener un listado de las máquinas virtuales que
administra SCVMM. El Cmdlet lista todas las máquinas virtuales
gestionadas por SCVMM o sólo aquellas que están alojadas en clúster.
También desarrolla las conexiones de red virtual que tienen, así como
Los nombres y tamaños de los discos duros virtuales que tienen.
PARÁMETROS
-VMM
Nombre o IP del servidor SCVMM al que se consultará.
-Cluster []
Si se pasa este modificador, sólo se listarán las máquinas virtules
que estén albergadas en cluster.
-Fichero
Nombre y ruta del fichero de valores separados por tabulador que se
generará con los resultados.
Este cmdlet admite los parámetros comunes Verbose, Debug,
ErrorAction, ErrorVariable, WarningAction, WarningVariable,
OutBuffer y OutVariable. Para obtener más información, escriba:
"get-help about_commonparameters".
-------------------------- EJEMPLO 1 --------------------------
C:\PS>Get-VMInventory -VMM SCVMMTIA01
Muestra por pantalla todas las máquinas virtuales administradas
por el servidor de SCVMM de nombre SCVMMTIA01.
-------------------------- EJEMPLO 2 --------------------------
C:\PS>Get-VMInventory -VMM SCVMMTIA01 -Cluster
Muestra por pantalla todas las máquinas virtuales, administradas
por el servidor de SCVMM de nombre SCVMMTIA01, que estén albergadas
en clúster.
-------------------------- EJEMPLO 3 --------------------------
C:\PS>Get-VMInventory -VMM SCVMMTIA01 -Cluster -Fichero d:\MaquinasCluster.tab
Guarda en un fichero de valores separados por tabuladores un
listado con todas las máquinas virtuales, administradas por el
servidor de SCVMM de nombre SCVMMTIA01, que estén albergadas
en clúster.
Este es el código del Cmdlet:
Function Get-VMInventory([string] $VMM,
[switch] $Cluster,
[string] $Fichero)
{
# Comprobamos si están cargados los Cmdlets de Virtual Machine Manager.
# En caso contrario los cargamos.
# Lo primero es almacenar la acción configurada para los errores que no
# interrumpen (de forma predeterminada es "Continue")
$Accion = $ErrorActionPreference
# Cambiamos la acción a Stop, para que sí interrumpan y puedan ser
# capturados por Try/Catch
$ErrorActionPreference = "Stop"
# Miramos si está cargada la snap-in de SCVMM. Si no lo está dará error,
# de ahí el que lo capturemos con Try/Catch
Try
{
# Cargamos la devolución de Get-PsSnapin en una variable para evitar
# que sea parte de la devolución del Cmdlet
$Snapin = Get-PSSnapin Microsoft.SystemCenter.VirtualMachineManager
}
Catch
{
# Si estamos aquí, es que Get-PsSnapin produjo un error y por tanto
# el snap-in de SCVMM no está cargado, por lo que debemos cargarlo.
# Para cargar el snap-in de SCVMM usamos una estructura Try/Catch,
# por si la consola de SCVMM no estuviera instalada en el equipo y
# por tanto no existiera este snap-in.
Try
{
Add-PSSnapin -name Microsoft.SystemCenter.VirtualMachineManager
}
Catch
{
# Como se ha producido error al intentar cargar el snap-in de
# SCVMM, se lo advertimos al usuario, restituimos la acción ante
# errores que no interrumpen y terminamos el Cmdlet
Write-Host "Es necesario tener instalada la consola de" `
"administración de SCVMM en este equipo para" `
"poder ejecutar este Cmdlet."
# Restituimos la acción original ante errores que no interrumpen
$ErrorActionPreference = $Accion
# Finalizamos el Cmdlet
Break
}
}
# Restituimos el valor de $ErrorActionPreference
$ErrorActionPreference = $Accion
# Conectamos a SCVMM
$SVMM = Get-VMMServer $VMM
# Obtenemos los host, o todos o sólo los que pertenecen a
# un clúster. En primer lugar, si sólo queremos los que
# pertenecen a un clúster:
If($Cluster)
{
# Iniciamos la colección de hosts.
$VMHosts = @()
# Recorremos los clústers administrados por SCVMM
ForEach($HostCluster In Get-VMHostCluster)
{
# Recorremos los nodos del clúster
ForEach($Nodo In $HostCluster.Nodes)
{
# Almacenamos el nodo en la colección
$VMHosts += $Nodo
}
}
}
# Si queremos obtener todos los hosts:
Else
{
$VMHosts = Get-VMHost
}
# Iniciamos la devolución de la función
$Devolucion = @()
# Recorremos la colección de Hosts
ForEach($VMHost In $VMHosts)
{
# Obtenemos la colección de máquinas virtuales del Host
$VMs = Get-VM -VMHost $VMHost
# Recorremos la colección de máquinas virtuales
ForEach($VM In $VMs)
{
# Iniciamos la devolución de las conexiones a red virtual
# que tiene la máquina
$ConectadaA = ""
# Recorremos las conexiones de red de la máquina
ForEach($Conexion In $VM.VirtualNetworkAdapters)
{
# Agregamos el nombre de la red virtual a la que está
# conectada la conexión actual
$ConectadaA = "$ConectadaA$($Conexion.VirtualNetwork) | "
}
# Si no está vacia la conexión de red, debemos quitar el
# separador, integrado por tres caracteres (" | ")
If($ConectadaA.Length -gt 0)
{
$ConectadaA = $ConectadaA.SubString(0, $ConectadaA.Length - 3)
}
# Agregamos la lista de conexiones a red virtual a la máquina
Add-Member -InputObject $VM `
-MemberType NoteProperty `
-Name RedesVirtuales `
-Value $ConectadaA
# Iniciamos la devolución de los discos duros virtuales
$HDs = ""
# Recorremos los discos duros
ForEach($HD In $VM.VirtualHardDisks)
{
# Agregamos el nombre y el máximo tamaño del disco
$HDs = "$HDs$($HD.Name);$($HD.MaximumSize) | "
}
# Si no está vacia la lista de discos, debemos quitar el
# separador, integrado por tres caracteres (" | ")
If($HDs.Length -gt 0)
{
$HDs = $HDs.SubString(0, $HDs.Length - 3)
}
# Agregamos la lista de discos duros a la máquina
Add-Member -InputObject $VM `
-MemberType NoteProperty `
-Name DiscosDuros `
-Value $HDs
# Agregamos la máquina a la devolucion
$Devolucion += $VM
}
}
# Si debemos guardar en fichero los resultados,
# así lo hacemos
If($Fichero.Length -gt 0)
{
$Devolucion | Export-CSV -Delimiter "`t" $Fichero -NoTypeInformation
}
# Si no hay que guardar los resultados en fichero, los
# mostramos por pantalla
Else
{
$Devolucion
}
#.SYNOPSIS
# Lista las máquinas virtuales gestionadas por un servidor de SCVMM.
#.DESCRIPTION
# Este Cmdlet permite obtener un listado de las máquinas virtuales que
# administra SCVMM. El Cmdlet lista todas las máquinas virtuales
# gestionadas por SCVMM o sólo aquellas que están alojadas en clúster.
# También desarrolla las conexiones de red virtual que tienen, así como
# Los nombres y tamaños de los discos duros virtuales que tienen.
#.PARAMETER VMM
# Nombre o IP del servidor SCVMM al que se consultará.
#.PARAMETER Fichero
# Nombre y ruta del fichero de valores separados por tabulador que se
# generará con los resultados.
#.PARAMETER Cluster
# Si se pasa este modificador, sólo se listarán las máquinas virtules
# que estén albergadas en cluster.
#.NOTES
# Desarrollado por Fernando Reyes López
# Octubre de 2010
#.LINK
# http://freyes.svetlian.com -> Artículos de Fernando reyes
#.LINK
# https://urpiano.wordpress.com -> El Blog de GualtrySoft
#.EXAMPLE
# Get-VMInventory -VMM SCVMMTIA01
# Muestra por pantalla todas las máquinas virtuales administradas
# por el servidor de SCVMM de nombre SCVMMTIA01.
#.EXAMPLE
# Get-VMInventory -VMM SCVMMTIA01 -Cluster
# Muestra por pantalla todas las máquinas virtuales, administradas
# por el servidor de SCVMM de nombre SCVMMTIA01, que estén albergadas
# en clúster.
#.EXAMPLE
# Get-VMInventory -VMM SCVMMTIA01 -Cluster -Fichero d:\MaquinasCluster.tab
# Guarda en un fichero de valores separados por tabuladores un
# listado con todas las máquinas virtuales, administradas por el
# servidor de SCVMM de nombre SCVMMTIA01, que estén albergadas
# en clúster.
}
Kit said
Greetings from Colorado! I’m bored at work so I decidedd to
browse your site on my iphone during lunch break. I really like
the knowledge you provide here and can’t wait to take a look when I get
home. I’m shocked at how quick your blog loaded on my
cell phone .. I’m not even using WIFI, just 3G .. Anyhow, wonderful
blog!