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:
- GET-VM PARTE I: LO BASICO
- GET-VM PARTE II: RENDIMIENTO
- GET-VIEW PARTE I: LO NO TAN BASICO
- GET-VIEW PARTE II: CASO PRÁCTICO
- GET-VIEW PARTE III: RENDIMIENTO
- 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

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

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

Parámetros
Estos son los principales parámetros que permite Get-View:
Parámetro | Tipo | Descripción |
Id | String[] | Id del objeto de vCenter: Puede ser de cualquier tipo de vista |
VIObject | ViObject | Objeto obtenido con un cmdlet Get-Loquesea (Get-VM) |
Filter | HashTable | Array con los campos a filtrar |
Property | String[] | Las propiedades que queremos obtener |
SearchRoot | String[] | Id del objeto de vCenter. Por ejemplo un cluster, datacenter, folder,… |
Server | String[] | Nombre del servidor de vCenter de donde traer los objetos |
ViewType | String | Un 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

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

Y permite pipeline:
get-vm Bi-Lab001 |get-view

ViewType
Get-View permite obtener vistas de diferentes tipos de Vistas de Objetos con el parametro ViewType
Nombre Vista | Descripcion |
ComputeResource | Cluster / Host independientes |
Datacenter | Datacenters |
DistributedVirtualPortgroup | Grupo de puertos virtuales distribuidos |
DistributedVirtualSwitch | Switches Virtuales distribuidos |
Folder | Carpetas |
HostSystem | Hosts ESX |
Network | Redes |
OpaqueNetwork | Tipos de red creadas y administradas por una entidad independiente a vSphere, por ejemplo NSX-T |
ResourcePool | Agrupacion logica y herarquica de recursos. Por ejemplo: uno o varios hosts o un cluster |
StoragePod | Pod Almacenamiento |
VirtualApp | Colección logica de maquinas |
VirtualMachine | Maquinas Virtuales |
VmwareDistributedVirtualSwitch | Switches Virtuales distribuidos |
ClusterComputeResource | Clusters |
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

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


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

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 Snapshots y Snapshot.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

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

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«

Para aprender mejor sobre el uso de expresiones regulares, recomiendo pasarse por alguna de estas webs especificas del tema:
- https://desarrolloweb.com/manuales/expresiones-regulares.html
- https://regex101.com/
- 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

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).

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

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.

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.

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.

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

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.