PowerCLI one-liners: Máquinas virtuales sin VMware Tools

Si hay algo que caracteriza a PowerShell (y PowerCLI) es la capacidad de realizar acciones aparentemente complejas en otros lenguajes de programación/scripting utilizando muy pocos carácteres. Es por ello que iniciamos la sección “PowerCLI one-liners” en la que iremos viendo utilidades de todo tipo con algo en común: que se pueden ejecutar en una sola línea. En la primera entrega vamos a ver como a listar máquinas virtuales sin VMware Tools.

Listar máquinas virtuales sin VMware Tools, algo no tan fácil si no sabes dónde mirar

Si tenemos algo de experiencia utilizando PowerCLI se nos puede pasar por la cabeza lo más obvio: ¿máquinas virtuales sin VMware Tools? Fácil, listo las VMs con Get-VM y a partir de ahí me las apaño para buscar alguna propiedad que indique si están instaladas. El gran problema de ésto es que no existe dicha propiedad, por lo que tendremos que tirar de Get-View para la tarea (o de la propiedad ExtensionData que realmente accede a un objeto con las propiedades de Get-View desde Get-VM).

Get-View es un CMDlet que nos devuelve un objeto “vSphere .Net View” al contrario que Get-VM que nos devuelve un objeto “PowerShell VIObject”. Para esta entrada la diferencia que nos interesa es que con Get-View sacámos un objeto con 147 métodos y propiedades, y con Get-VM sacámos un objeto con “sólo” 41, y de entre esos 147 métodos y propiedades de Get-View está el estado de las VMware Tools.

Ahora sí, listando máquinas virtuales sin VMware Tools con un one-liner

Después de esta pequeña intro sobre la diferencia entre Get-View y Get-VM vamos a lo que toca, éste es el one-liner y la descomposición del mismo:

Get-View -ViewType VirtualMachine | Select-Object Name, @{ Name="VersionTools"; Expression={$_.config.tools.toolsVersion}} | Where-Object {$_.VersionTools -eq 0}
  • Get-View -ViewType VirtualMachine: Listamos todas las VM’s de nuestro Datacenter.
  • Select-Object Name, @{ Name=”VersionTools”; Expression={$_.config.tools.toolsVersion}}: Seleccionamos la propiedad “Name” y una propiedad a la que llamamos “VersionTools” con el número de versión de las VMware Tools.
  • Where-Object {$_.VersionTools -eq 0}: Filtramos sólo las VM’s que tengan versión “0”, es decir, que no tienen las tools instaladas.

Después de ejecutarlo deberíamos ver algo similar a esto:

Máquinas virtuales sin VMware Tools

Una tarea muy sencilla que podemos programar y con la que obtendremos más control sobre nuestra infraestructura.

Deja un comentario