vSphere PowerCLI

Get-View Parte I: Lo no tan básico

En este articulo vamos a ver como sacar el máximo rendimiento a Get-View, que es uno de los comandos más usados, útiles y avanzados de vSphere PowerCLI.

Es parte de la serie de artículos sobre 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

Get-View nos permite obtener la información de prácticamente cualquier tipo de objeto de vCenter. Y cuando digo cualquier tipo es a cualquier objeto que tenga un Id, ya sea una máquina, carpeta, alerta, evento, …

A diferencia de Get-VM o demás cmdlets Get-Loquesea, Get-View no es tan sencillo de utilizar y requiere de más conocimientos para sacarle partido.

Para empezar no podemos obtener los datos con el nombre. No existe un parámetro por defecto como Get-VM name.

Su parámetro por defecto es el Id, que a priori no conocemos.

Veamos un ejemplo de una maquina:

get-view VirtualMachine-vm-650452
get-view 1
get-view -Id

De primeras observamos que nos muestra muchos datos y que no entendemos nada. Son todo MoRef (claves) de otros objetos. Y un MoRef no sirve de nada por sí solo. El único nombre que aparece es el propio nombre del objeto.

En el artículo anterior de Get-VM, tratamos las propiedades de ExtensionData, que para facilitar la comparativa, pongo la captura aquí también:

$vm = get-vm bi-lab001
$vm.ExtensionData
get-view select property
get-view select property

info Sorpresa!! Es el mismo tipo de objeto con las mismas propiedades!!

Ahora vemos el ejemplo de otro tipo de vista muy diferente, una vista alerta por su id:

$task = get-view -Id Task-task-18536874
$task.info
get-view -Id Task
get-view -Id Task

Parámetros

Estos son los principales parámetros que permite Get-View:

ParámetroTipoDescripción
IdString[]Id del objeto de vCenter: Puede ser de cualquier tipo de vista
VIObjectViObjectObjeto obtenido con un cmdlet Get-Loquesea (Get-VM)
FilterHashTableArray con los campos a filtrar
PropertyString[]Las propiedades que queremos obtener
SearchRootString[]Id del objeto de vCenter. Por ejemplo un cluster, datacenter, folder,…
ServerString[]Nombre del servidor de vCenter de donde traer los objetos
ViewTypeStringUn conjunto de vistas disponibles

A continuación detallo cada uno.

Id

Clave del objeto en vCenter. Que está compuesto por dos atributos: Tipo y Valor

  • Tipo: son tantos como tipos de objetos existen en vCenter
  • Valor: el MoRef en si. Un conjunto de letras que identifican el tipo, un guion y normalmente un numero (aunque también puede ser alfanumérico).
(get-view VirtualMachine-vm-650452).MoRef
get-view MoRef
get-view MoRef

La suma de ambos se conoce como el Id del objeto. Lo cierto es que entre los diferentes cmdlets no hay un criterio único entre Id y MoRef.

VIObject

Cualquier objeto obtenido con un cmdlet Get-Loquesea (Get-VM) nos retorna un VIObject, que podemos utilizar para obtener su vista.

$vm = get-vm Bi-Lab001
get-view -VIObject $vm
get-view -ViObject
get-view -ViObject

Y permite pipeline:

get-vm Bi-Lab001 |get-view
 get-view -ViObject pipeline
get-view -ViObject pipeline

ViewType

Get-View permite obtener vistas de diferentes tipos de Vistas de Objetos con el parametro ViewType

Nombre VistaDescripcion
ComputeResourceCluster / Host independientes
DatacenterDatacenters
DistributedVirtualPortgroupGrupo de puertos virtuales distribuidos
DistributedVirtualSwitchSwitches Virtuales distribuidos
FolderCarpetas
HostSystemHosts ESX
NetworkRedes
OpaqueNetworkTipos de red creadas y administradas por una entidad independiente a vSphere, por ejemplo NSX-T
ResourcePoolAgrupacion logica y herarquica de recursos. Por ejemplo: uno o varios hosts o un cluster
StoragePodPod Almacenamiento
VirtualAppColección logica de maquinas
VirtualMachineMaquinas Virtuales
VmwareDistributedVirtualSwitchSwitches Virtuales distribuidos
ClusterComputeResourceClusters

info En Powershell, en todos los cmdlets, al escribir el parámetro podemos dar tabulador y automáticamente va pasando por las opciones. No hace falta saberse todas de memoria.

Ya hemos visto antes un ejemplo de una maquina y ahora vemos un ejemplo de cluster:

Get-View -ViewType ClusterComputeResource
get-view -ViewType
get-view -ViewType

Property

¿Si solo necesitamos unas pocas propiedades, para que traer cientos y cientos de datos?

Este parámetro nos permite especificar los nombres de las propiedades que queremos que retorne y así generar una consulta mucho más eficiente y rápida.

El objeto devuelto, tiene las mismas propiedades que sin el parámetro Property, pero solo contienen datos los especificados:

$vm = get-view VirtualMachine-vm-650452 -property Name, Guest.ToolsVersion
$vm
$vm.guest
get-view 8
get-view -property
get-view -property values
get-view -property values

Si queremos seleccionar muchas propiedades, para no tener una línea infinita, una forma elegante es generar un array:

$propiedades = @(
    "name"; 
    "parent"; 
    "Guest.ToolsVersion"; 
    "Guest.ToolsVersionStatus"; 
    "Guest.ToolsStatus"
)
$vm = get-view -ViewType VirtualMachine -property $propiedades 
get-view array propiedades
get-view array propiedades

Podemos elegir cualquier propiedad, pero con una condición: La propiedad debe existir en TODOS los objetos consultados.

Puede parecer una obviedad pero no lo es. No todos los objetos del mismo tipo tienen las mismas propiedades.

Por ejemplo, quiero obtener el nombre de los snapshots por cada máquina:

$vm = get-view -ViewType VirtualMachine -Property Name, Snapshot.RootSnapshotList.Name

Las maquinas que no tenga snapshots, no tendrá ningún subobjeto dentro de la propiedad SnapshotsSnapshot.RootSnapshotList.Name no existe. Entonces pedir esa propiedad a todas las maquinas genera una excepción y no retornara nada.

$vm = get-view -ViewType VirtualMachine -Property Name, Snapshot.RootSnapshotList.Name
get-view error propiedades
get-view error propiedades

Para mi este un inconveniente importante que produce bastantes dolores de cabeza, que debería ser revisado en futuras versiones de PowerCLI.

Si alguno de los objetos no contiene esa propiedad debería devolver un error, que pueda ser omitido con el parámetro –ErrorAction, pero que si retorne los datos de los objetos que tengan el dato.

Server

Si tenemos varios vCenter conectados o en modo Enhanced Linked Mode, podremos especificar de cual o cuales queremos obtener los datos. Se puede pasar un servidor o varios (o un array).

$vm = get-view -ViewType VirtualMachine -Server vcenter1.vsphere.local, vcenter2.vsphere.local
get-view -server
get-view -server

SearchRoot

Permite filtrar por ciertos tipos de contenedores. En el caso de una maquina puede ser por datacenter, cluster, host, folder, etc…

El parámetro tiene que ser un string con el Id del objeto.

Por ejemplo en caso de ser un cluster: «ClusterComputeResource-domain-c517428«

$vm = get-view -ViewType VirtualMachine -SearchRoot (get-cluster "CLUSTER1").Id

Filter

Y llegamos al quizás más importante de todos los parámetros. Este nos permite filtrar los resultados que serán devueltos.

A diferencia de Get-Loquesea (xej Get-VM) el filtrado se hace en el servidor, la BBDD de vCenter, y solo retorna los que cumplan la condición.

Precisa que generemos un hashtable (array asociativo de key = value) con cada condición.

$vm = get-view -ViewType VirtualMachine -filter @{name = "Bi-Lab001"}

$filter = @{
    name = "Bi-Lab001"
}
$vm = get-view -ViewType VirtualMachine -filter $filter
Funcionalidades
  • Operador: El filtro solo permite el operador = .
    • No hay opción a No igual.
  • Conector: Se pueden añadir todos los filtros que se quieran, pero se ha de tener en cuenta que siempre serán con operador AND: Cumple condición 1 y condición 2
    • No es posible un OR: Que cumplan condición 1 o condición 2.
  • Expresiones: El literal que pongamos entre « será evaluado siempre como una expresión regular (REGEX), lo cual es increíblemente potente, pero complejo para no iniciados. Algunos ejemplos:
    • name = «Bi-Lab0«: Es como un like «*Bi-Lab0*«, por lo que nos podrá devolver más de una maquina
    • name = «^Bi-Lab001$«: Es como un = «Bi-Lab001«, solo nos devuelve la búsqueda EXACTA.
    • name = «VM-[WL]IN«: Nos devuelve todas las maquinas que contengan en el nombre «VM-LIN» o «VM-WIN«
    • name = «^((?!Bi-Lab).)*$»: Nos devuelve las maquinas que NO contengan en el nombre «Bi-Lab«
Tabla Trucos regexr.com
Tabla Trucos regexr.com

info Para aprender mejor sobre el uso de expresiones regulares, recomiendo pasarse por alguna de estas webs especificas del tema:

  1. https://desarrolloweb.com/manuales/expresiones-regulares.html
  2. https://regex101.com/
  3. https://regexr.com/

Otro ejemplo de más de un filtro en el array:

$filter = @{
    name = "Bi-Lab00";
    'summary.runtime.powerstate' = "PoweredOn"
}
$vm = get-view -ViewType VirtualMachine -filter $filter
get-view -filter
get-view -filter

Parámetros Comunes

Igual que explique en el primer artículo: Get-VM Parte I: Lo básico, hay una serie de parámetros que son comunes a casi todos los cmdlets de Powershell y PowerCLI. Esta vez solo los enumero. Si necesitáis mas información, consultar el articulo citado.

  • ErrorAction
  • PipelineVariable
  • Verbose
  • Debug

Como conclusión de este apartado, si aplicamos varios parámetros conjuntamente tenemos una herramienta muy potente y extremadamente rápida.

Propiedades

Get-View retorna un objeto de tipo vista con cientos de propiedades.

Este tipo de objeto vista no permite ser usado con otros cmdlets como si permite los objetos VIObject que devuelve un Get-Loquesea (xej Get-VM).

get-view pipeline a get-loquesea
get-view pipeline a get-loquesea

Aunque podemos usar el cmdlet Get-VIObjectByVIView para obtener el objeto VIObject:

$vmview = get-view -ViewType VirtualMachine -filter @{name = "^Bi-Lab001$"}
$vm = $vmview |Get-VIObjectByVIView
 Get-VIObjectByVIView
Get-VIObjectByVIView

Todas las vistas comparten varias propiedades y siempre vienen por defecto. No es necesario especificarlas.

Algunas son especialmente importantes:

Name

Nombre del objeto, tal cual lo conocemos y vemos en vCenter.

MoRef

Lo que explicado de la propiedad Id en el apartado anterior, es la clave del objeto.

get-view MoRef
get-view MoRef

Client

Información del vCenter que ha devuelto el objeto y de nuestra sesión desde PowerCLI.

Muy útil para extraer el nombre del vCenter.

get-view Client
get-view Clientget-view Client

Parent

Esta la he dejado la última ya que no existe siempre, aunque si en la mayoría. Contiene el MoRef del padre, que es de diferente tipo por cada vista y objeto, y que nos permitirá obtener datos muy útiles: host, cluster, etc…

Otras propiedades

El resto de propiedades, particulares a tipo de objeto, podemos obtenerlas navegando con «.» o Select, como acabamos de ver en la captura de MoRef y Client.

get-view select properties
get-view select properties

Recuerdo una vez más lo útil que resulta Get-Member:

$vm = get-view -ViewType VirtualMachine -filter @{name = "^Bi-Lab001$"}
$vm |get-member -MemberType Properties
get-view get-member
get-view get-member

Para no alargar demasiado este artículo, aquí termino. Seguiré en el próximo con un ejemplo practico de uso de Get-View.

Podéis consultar aquí la referencia oficial de PowerCLI.

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

Deja un comentario

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