vSphere PowerCLI

Get-vm Parte I: lo basico

Voy a empezar una serie de artículos para tratar en profundidad dos de los comandos mas utilizados e importantes del modulo de PowerShell de VMWare PowerCLI: Get-VM y Get-View.

  1. GET-VM PARTE I: LO BASICO
  2. GET-VM PARTE II: RENDIMIENTO
  3. GET-VIEW PARTE I: LO NO TAN BASICO
  4. GET-VIEW PARTE II: CASO PRÁCTICO
  5. GET-VIEW PARTE III: RENDIMIENTO
  6. GET-VM VS GET-VIEW: CONCLUSIONES

Hay mucha gente que usa Get-VM para todos los casos, ya sea por comodidad o desconocimiento, y no siempre es la mejor opción. La diferencia puede ser de un script que tarda horas en ejecutarse a unos pocos segundos.

Intentare explicar sus principales funcionalidades, ventajas e inconvenientes, así como y cuando usar cada uno para exprimirlos al máximo y obtener el mejor rendimiento. Al ser el primer articulo, también explicare mínimamente conceptos básicos de Powershell, aunque no entrare en detalle ya que no es el propósito del mismo.

Empiezo por el mas sencillo, Get-VM.

Get-VM

Get-VM permite obtener todas las propiedades de un objeto maquina virtual.

Devuelve un tipo de objeto VIObject, común a casi todos los cmdlets de PowerCLI. Comandos como Get-VMHost, Get-Cluster, Get-Datacenter, Get-Datastore, Get-Snapshot, Get-Tag, etc… devuelven este tipo de objeto, aunque cada uno de tipo diferente. Los objetos VIObject son los parámetros de entrada entre los diferentes cmdlets y permiten pipelines entre ellos.

Esta funcionalidad es una de las grande ventajas de Get-VM, y en general de los cmdlets comentados. Todo lo que voy a explicar en este articulo, es perfectamente valido para cualquiera de estos comandos (excepto propiedades especificas).

A partir de este objeto podemos obtener otra información relacionada (Get-HardDisk, Get-TagAssignment) o ejecutar acciones (Stop-VM, New-Snapshot,…).

Además de potente, resulta muy cómodo y fácil de usar.

Propiedades

Por defecto devuelve cuatro propiedades:

  • Nombre
  • Power State
  • Numero Cores de CPU
  • Memoria en GB
get-vm bi-lab001
get-vm name
get-vm name

Como todo objeto Powershell, podemos obtener alguna de las propiedades de una en una mediante «.«:

$vm.Guest
get-vm properties
get-vm properties

O obtener propiedades mediante Select

$vm |select name, guest, MemoryMB
get-vm select properties
get-vm select properties

Donde realmente esta la chicha de Get-VM es en ExtensionData, con cientos de propiedades. Algunos son tipos de datos simples (texto o numero), otros objetos o incluso arrays de cualquier tipo:

$vm.ExtensionData
get-vm ExtensionData
get-vm ExtensionData

Y que podemos obtener igual que antes, con «.» o select (ahora tenemos que usar un campo calculado y el objeto implícito del pipe $_):

get-vm Bi-Lab001 |
    select name, 
    @{Name="Tools Status"; Expression={$_.ExtensionData.Guest.ToolsRunningStatus}}
get-vm Select Campos Calculados
get-vm Select Campos Calculados

Algunas de las propiedades mas comunes y que viene bien tener localizadas, ya que se usan frecuentemente:

Tabla 1:  Propiedades mas comnues
Tabla 1: Propiedades mas comnues

Para explorar todas las propiedades, recomiendo usar Get-Member ya que además nos muestra el tipo de objeto: String, Array, decimal,…

$vm |get-member -MemberType Property
get-member
get-vm get-member

Filtros

Con Get-VM  es posible filtrar por varios parámetros que podremos usar conjuntamente:

  • Name: Nombre de la maquina. Admite comodín *
  • Id: Identificador de la maquina. Se utiliza el MoRef que son como las claves únicas de todo objeto en PowerCLI. Ej: VirtualMachine-vm-15
  • Datastore: Obtiene solo las maquinas que pertenecen al datastore. Admite comodín *
  • VirtualSwitch: Obtiene solo las maquinas que pertenecen al vSwitch. Admite comodín *
  • Tag: Obtiene solo las maquinas que tienen asignada la etiqueta.
  • Server: Obtiene solo las maquinas que pertenecen al servidor vCenter.
  • Location: Obtiene solo las maquinas de uno de estos tipos de objetos: Host, Folder, Cluster o Datacenter. A diferencia de los anteriores, en vez de un «nombre» es preciso pasarle un objeto (VIContainter) de ese tipo, mediante: Get-VMHost, Get-Folder, Get-Cluster o Get-DataCenter.

Podéis obtener mas ayuda de todos los parámetros mediante la ayuda:

get-help get-VM -Detailed
get-help get-vm
get-help get-vm

Ejemplo de parámetros admiten comodín *:

get-vm Bi-Lab*
get-vm -Datastore NFS*
get-vm comodin nombre
get-vm comodin nombre
Propiedades 7
get-vm comodin datastore

Así como pasar varios elementos la vez, ya sea con un array de nombres o separados por coma:

get-vm varias maquinas
get-vm varias maquinas
get-vm array varias maquinas
get-vm array varias maquinas

También podemos filtrar por cualquier otra propiedad del objeto, para lo que deberemos usar Where-Object de PowerShell:

  1. Primero Get-VM obtiene todos los objetos de vCenter
  2. Luego, con todos los objetos en memoria, recorre los objetos y filtra según las condiciones del comando Where.
get-vm |where { $_.Guest.ExtensionData.ToolsStatus -eq "toolsNotInstalled" }
get-vm where
get-vm where

Este método es bastante poco eficiente y muy lento, pero su uso esta muy extendido. Para mi, solo es recomendable su uso cuando tenemos pocas maquinas o bien filtradas con los parámetros.

Parámetros Comunes

Hay una serie de parámetros que son comunes a casi todos los cmdlets de Powershell y PowerCLI y que no se incluyen en las ayudas o documentos de referencia por ser heredados. Son de uso mas avanzado y menos cotidiano, pero que sin duda conviene conocer porque nos puede sacar de mas un problema. A continuación detallo los mas significativos:

  • ErrorAction: Define el comportamiento ante un error. Es importante para la captura de errores y su tratamiento (try y catch). Por ejemplo, si no no encuentre la maquina muestra un error y termina el script. Si continuase sin capturar el error, podría provocar acciones no deseadas. Posibles valores:
    • Stop: Termina el comando y muestra el error
    • Continue: Comportamiento por defecto. Continua aunque haya detectado error. Mostrara todos los errores encontrados
    • SilentlyContinue: Continua pero no muestra ningún error.
    • Ignore: Ignora los errores y no muestra nada.
    • Inquire: Pregunta que hacer
Ejemplos de Errores con cada opción del parámetro ErrorAction
Ejemplos de Errores con cada opción del parámetro ErrorAction
  • PipelineVariable: Guarda la salida en una variable. Muy útil cuando enlazamos varios pipelines encadenados, dado que $_ solo sirve para el inmediatamente anterior.
get-vm Bi-Lab001 -PipelineVariable vm |Get-HardDisk |select @{n="VM Name";e={$vm.name}}, Name
get-vm -PipelineVariable
get-vm -PipelineVariable

Y hasta aquí los aspectos básicos de Get-VM. En el siguiente articulo mostrare el rendimiento del comando en diferentes ejemplos y situaciones.

Podéis consultar aquí la referencia oficial de PowerCLI para Get-VM.

Cualquier duda o pregunta, responderé encantando en los comentarios.

3 comentarios

  1. Muy interesante. El comienzo que necesitaba para adentrarme en este mundo de una manera sencilla y por pasos. Sobre todo por ir directamente a lo práctico y utilizable.

  2. Hola. Muchas gracias por tu comentario. Los siguientes artículos de la serie de Get-VM y Get-View creo que te serán también muy útiles y prácticos.

  3. Muchas gracias por tan detallado blog, quisiera preguntarte, como obtener los parámetros de las propiedades, es decir: «$_.Guest.ExtensionData.ToolsStatus» de esta la propiedad es «Guest», pero quiero conocer cuales propiedades están en el, por ejemplo se que IPAddress hace parte de la propiedad y quedaría así «$_.Guest.IPAddress», pero hay mas, como conocer esas para poderlas usar a la hora de armar un comando selectivo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *