El Blog de Gualtrysoft

Windows 2000/2003/2008, Active Directory, VBScript, Hyper-V, PowerShell y todo aquello interesante a la hora de usar, configurar y administrar Windows Server. También tenemos longanizas…

PowerShell: Cmdlet para inventariar las máquinas virtuales gestionadas por un servidor SCVMM

Posted by urpiano en Miércoles 6 \06\UTC octubre \06\UTC 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.
}

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: