Tutorial de PowerCLI: Gestión de Infraestructura VMware

PowerCLI de VMware se está convirtiendo en la interfaz ubicua para los administradores de virtualización de hipervisor de hardware compatible con ESXi. Aprender a administrar VMware a través de PowerShell y PowerCLI es una gran adición a su conjunto de herramientas. En este tutorial de PowerCLI, aprenderás cómo hacer precisamente eso.

En este tutorial, aprenderás:

  • los conceptos básicos de la conexión a la infraestructura de VMware con PowerCLI
  • familiarizarte con los cmdlets para trabajar con objetos de VMware
  • empoderarte con el conocimiento para explorar
  • administrar VMware aún más a través de PowerCLI

¡Vamos a ello!

Lo que necesitas tener y saber

Antes de adentrarte demasiado en este tutorial de PowerCLI, es importante asegurarse de que tú y yo estemos en la misma página. Para este artículo, voy a asumir que:

  • Tienes experiencia básica en PowerShell. No es necesario que seas un experto en PowerShell, de ninguna manera, pero cualquier familiaridad que tengas con PowerShell te será útil.
  • Tienes un host de VMware ESXi o un appliance vCenter para conectar y probar
  • Estás trabajando en una estación de trabajo Windows (O Mac / Linux)
  • Ya tienes PowerCLI instalado y estás conectado. Si no es así, consulta este artículo de instalación de PowerCLI.

I’ll be using PowerCLI v 11.4.0. I will be working from a Windows 10 workstation with Windows PowerShell 5.1, but you’re welcome to use PowerShell 6 instead as there’s feature parity for this tutorial.

Recopilar información sobre los hosts de ESXi con PowerCLI

Antes de sumergirte en la capa virtual de nuestro entorno vSphere, es una buena idea revisar la capa de hardware físico. VMware PowerCLI proporciona un cmdlet directamente para este propósito, para recopilar información detallada llamado Get-VMHost.

Mientras estás conectado a tu servidor vCenter o host ESXi, ejecuta el siguiente cmdlet.

PS51> Get-VMHost
Get-VMHost

Dado que estoy conectado a un Appliance de servidor vCenter que gestiona dos hosts ESXi separados, se me proporciona información básica sobre los hosts que están siendo gestionados. El Get-VMHost te permite revisar las capacidades de hardware de tus hosts de virtualización. Sin embargo, por defecto, Get-VMHost no devuelve toda la información que puede.

Si canalizas el cmdlet Get-VMHost a Format-List, obtendrás una salida de consola con toda la información sobre los hosts dados.

Get-VMHost | Format-List

Alternativamente, puedes ser más selectivo y solo seleccionar propiedades individuales en el objeto VMHost con el que estás trabajando, como:

PS51> Get-VMHost | format-list -Property State,LicenseKey,Version

Aprovechar esta salida más detallada proporcionará una visión aún mayor del hardware subyacente que ejecuta tus cargas de trabajo virtualizadas. Algunas de las informaciones, en particular, serían:

  • Información de validación de la licencia
  • Totales de CPU/Memoria
  • Modelo del fabricante de hardware
  • Nombre de host DNS

Después de la revisión, esto se puede compilar en un archivo CSV, quizás utilizando el Export-CSV cmdlet.

Inspeccionar VMs con PowerCLI

Vamos a sumergirnos ahora en otro tema en este tutorial de PowerCLI revisando los hosts virtuales, es revisar qué máquinas virtuales están actualmente presentes en un host ESXi dado.

El comando Get-VM es un comando útil que puedes usar para revisar la información de las MV.

PS51> Get-VMHost -Name <Host FQDN> | Get-VM

La salida de este cmdlet se verá algo así:

PS51> Get-VMHost -Name | Get-VM

La salida anterior proporciona una lista completa de estado de las MV que se están ejecutando actualmente en un host dado. Si eligieras no especificar un host individual, como he hecho anteriormente, recibirás una tabla de información para cada host subsiguiente y las MV en cada uno.

Si alguna vez estás resolviendo un problema y necesitas saber el número de máquinas virtuales en un host dado o tienes la necesidad de usar VMware PowerCLI para recopilar información del host ESXi, puedes usar estos cmdlets en adelante. ¡La funcionalidad de informes que tienes al alcance de tu mano está empezando a expandirse!

Inspeccionar los switches virtuales con PowerCLI

Para aquellos de nosotros encargados de configurar o administrar las redes virtuales de un clúster de vCenter, hay una amplia gama de cmdlets de red para cualquier caso de uso. Si deseas ver los switches virtuales configurados en tu entorno de vSphere, usarás lo siguiente:

PS51> Get-VirtualSwitch

Dependiendo del número de redes virtuales y switches virtuales que tengas, tu lista resultante puede ser bastante grande. En mi caso, como ves a continuación, tengo un único DSwitch que es un Distributed Virtual Switch.

En una implementación de vSphere en una empresa donde hay muchos hosts ESXi en un clúster, DSwitches simplifican la implementación de switches virtuales y grupos de puertos en una multitud de hosts con la misma configuración. Esto ahorra en el trabajo manual de crear configuraciones de red idénticas en cada host manualmente, ¡y es una excelente manera de escalar tu clúster!

Get-VirtualSwitch

Encontrar VMs Conectadas a una Red Virtual con PowerCLI

Al intentar reducir el alcance de un problema, es posible que te preguntes qué VMs están conectadas a qué redes. Para averiguarlo, puedes usar el comando Get-VirtualPortGroup. Aprendamos sobre este cmdlet en este tutorial de PowerCLI.

A port group is essentially a virtual network. To display all port groups, run Get-VirtualPortGroup without any parameters. You should then see a listing of all virtual port groups present in your vSphere environment.

Get-VirtualPortGroup

Para encontrar todas las VMs dentro de ese grupo de puertos (DPortGroup en mi caso), puedes ejecutar el script a continuación. Asegúrate de reemplazar el valor DPortGroup con el nombre de tu Grupo de Puertos Virtuales.

PS51> Get-VM | Where-Object { ($PSItem | Get-NetworkAdapter | where {$_.networkname -match "DPortgroup"})}

En esta única línea, obtenemos una lista de todas las máquinas virtuales que existen en este dispositivo vCenter y luego filtramos con el cmdlet Where-Object para obtener solo aquellas VMs con un nombre de red que coincida con nuestro Grupo de Puertos.

Getting VMs with only a specific port group

Con esta salida, podrás definir qué máquinas están conectadas y configuradas para cada red.

Cuando te pidan ubicar y analizar qué VMs están conectadas a una red específica en VMware, ahora podrás ofrecer una solución de informes PowerCLI a esta pregunta.

Obteniendo Información sobre la Versión del SO en tus VMs con PowerCLI

La mayor parte del trabajo administrativo dentro de VMware se realiza a nivel de máquina virtual. Es probable que recibas innumerables solicitudes para tareas como recuperar una lista de todos los tamaños de disco duro en las VM o obtener las versiones del sistema operativo invitado para todos tus servidores, entre otras.

Estas tareas son tediosas a gran escala. PowerCLI puede simplificarlas con algunos cmdlets importantes para agregar a tu arsenal, así que cubramos eso en este tutorial de PowerCLI.

Es posible que en algún momento te hayan preguntado: “¿Cuántos servidores Ubuntu tenemos en nuestro clúster VMware?”. Es posible que luego hayas pasado demasiado tiempo haciendo clic en vCenter buscando una respuesta. PowerCLI puede agilizar este proceso al examinar los objetos de VM en vCenter y aplicar algo de magia de PowerShell en la salida.

Echa un vistazo al siguiente script que recopila información de VM. Este fragmento utiliza el comando Get-View, del cual hablaremos un poco más adelante, pero por ahora, debes saber que es una forma avanzada de recuperar propiedades de objetos VMware. En este caso, estamos recopilando propiedades anidadas que son más fáciles de recuperar de esta manera.

PS51> Get-VM | 
      Sort-Object -Property Name |
      Get-View -Property @("Name", "Config.GuestFullName", "Guest.GuestFullName") |
      Select-Object -Property Name, @{N="Configured OS";E={$_.Config.GuestFullName}}, @{N="Running OS";E={$_.Guest.GuestFullName}}

El código anterior está recuperando una lista de máquinas virtuales a través del cmdlet Get-VM de PowerCLI, ordenando dicha lista con el cmdlet Sort-Object de PowerShell, y luego recuperando algunas de las propiedades del objeto usando el cmdlet Get-View de PowerCLI.

Ejecutar esto en mi entorno produce el siguiente resultado. Puedes ver el nombre de la VM en vCenter, el SO configurado que es cómo está configurado el hardware virtual de VMware para interpretar el sistema operativo invitado, y el SO en ejecución que representa el sistema operativo real.

Finding VMs based on various criteria

Con las VMs replicant y Scriptrunner apagadas en el clúster, no podrás ver el valor de Running OS para ellas. El sistema operativo se recopila mediante el servicio VMware Tools. Si no está disponible, PowerCLI no puede obtener la información del sistema operativo.

Creando informes CSV con PowerCLI

VMware Tools es un servicio dentro del sistema operativo para las VM de Windows y Linux que proporciona al hipervisor información adicional y capacidades administrativas. Comúnmente, esto incluirá apagado limpio, información del sistema operativo y una visualización de consola de mayor resolución de las VM.

A convenient way to report on and provide this information would be to pipe the above script into the Export-CSV  cmdlet. Export-Csv will create a CSV file with the same information you see in the console.

PS51> Get-VM | Sort-Object -Property Name | Get-View -Property @("Name", "Config.GuestFullName", "Guest.GuestFullName") |
Select -Property Name, @{N="Configured OS";E={$_.Config.GuestFullName}}, @{N="Running OS";E={$_.Guest.GuestFullName}} | Export-CSV C:\report.csv -NoTypeInformation 

Después de ejecutar el código anterior, deberías poder abrir el archivo CSV con Excel para revisar el informe.

CSV file of VM information

Inspeccionando Discos Duros Virtuales con PowerCLI

El comando Get-Harddisk es otro comando útil para conocer. El cmdlet Get-HardDisk te permite inspeccionar información sobre discos duros virtuales conectados a las VMs.

Por ejemplo, para consultar información sobre el disco duro virtual conectado a la VM exchange1, podrías ejecutar lo siguiente:

PS51> Get-VM -Name exchange1 | Get-HardDisk | Format-List
Querying information about the virtual hard disk attached to the exchange1 VMs

Alguna de esta información puede ser redundante, como la capacidad en KB vs. GB. Pero hay valor en conocer el StorageFormat (tipos de aprovisionamiento delgados/gruesos). Y conocer el nombre del archivo VMDK.

Por ejemplo, si ves un problema común y todos los discos duros de las VM residen en el mismo volumen de almacén de datos, este conocimiento puede acelerar la solución de problemas.

Inspeccionando Adaptadores de Red Virtuales con PowerCLI

Además de revisar la información del disco duro de sus máquinas virtuales, es posible que también desee verificar los adaptadores de red virtuales. Para verificar estas propiedades en una sola VM, puede utilizar el cmdlet Get-NetworkAdapter.

PS51> Get-NetworkAdapter -VM myVM

Mientras buscaba anteriormente en este puerto todas las VM que residían en la misma red, esta vez solo desea ver los adaptadores conectados a una VM específica.

Get-NetworkAdapter

Esto es útil si está solucionando problemas en VM con varios adaptadores de red conectados. Puede determinar rápidamente y de un vistazo si esos adaptadores están conectados a las redes correctas.

Ejecución de scripts de PowerShell en VM con Invoke-VMScript

Usando el cmdlet Invoke-VMScript, también puede ejecutar código PowerShell directamente dentro de la VM; no es necesaria conectividad de red. Si alguna vez ha utilizado PowerShell Direct dentro de un entorno Hyper-V, esta será una experiencia similar.

En lugar de crear una sesión de PowerShell Remoting o usar el cmdlet Invoke-Command a través de la red, el cmdlet Invoke-VMScript puede enviar comandos directamente a la VM sin la conectividad normal de WinRM o SSH.

Como ejemplo, tal vez desee realizar una simple lista de directorios en una VM llamada exchange1. Para hacerlo, pasaría dir C:\ como valor para el parámetro ScriptText, como se muestra a continuación.

PS51> Invoke-VMScript -VM exchange1 -ScriptText "dir C:\"

Los resultados son como si hubieras ejecutado los comandos desde la consola de la VM misma. Invoke-VMScript luego transmite toda la salida del comando que se ejecutó en la VM.

Invoke-VMScript

Aunque este es un ejemplo básico, puedes complicarlo tanto como desees. Este cmdlet de PowerCLI te permite especificar tipos de lotes, PowerShell o Bash dentro del parámetro ScriptText.

También puedes avanzar más. A continuación, puedes ver cómo usar Invoke-VMScript para ejecutar código PowerShell usando una variable $script separada para el parámetro ScriptText. Esto nos permite crear una entrada de script más personalizada para que la VM la procese.

PS51> $script = 'Get-Disk'

$guestCredential = Get-Credential

Invoke-VMScript -ScriptText $script -VM VM -GuestCredential $guestCredential  -ScriptType Powershell

El valor del parámetro ScriptText necesita ser una cadena. Por eso, la variable $script tiene comillas simples como necesidad.

Tal vez también hayas notado el uso del parámetro GuestCredential. Este parámetro se utiliza para autenticarse en el sistema operativo de la VM. Es especialmente útil si deseas ejecutar el script como una cuenta diferente.

Tu script en acción debería dar como resultado una salida similar a la siguiente.

Running a script on a VM with Invoke-VMScript

El resultado de este script nos proporciona la información del disco de la VM. Basándonos en eso, deberías saber que es una VM remota debido al nombre amigable de la unidad, VMware Virtual Disk.

Avanzando con Get-View

Puede que hayas visto que algunas de las cmdlets básicas devuelven una propiedad llamada ExtensionData. Puedes encontrar esta propiedad al enviar muchas cmdlets de PowerCLI al cmdlet Get-Member de PowerShell. Si te preguntabas qué era eso, ahora es tu oportunidad de descubrirlo.

El siguiente paso en esta empresa es entender el cmdlet Get-View. VMware PowerCLI utiliza muchas consultas diferentes a la máquina virtual para proporcionar la salida bonita y sencilla de Get-VM. Pero hay mucho bajo el capó que solo es accesible usando el cmdlet Get-View.

Es probable que veas muchos scripts que usan este cmdlet. Te convendría pasar un tiempo acostumbrándote a ver este cmdlet en acción. Para familiarizarte, utiliza el cmdlet Get-View para obtener información sobre una máquina virtual (exchange1 en este ejemplo).

Puedes ver que las opciones de Filter de este cmdlet requieren el uso de una hashtable de PowerShell y no valores de cadena individuales. ¡Ten cuidado al construir tus propios scripts únicos!

PS51> Get-View -ViewType VirtualMachine -Filter @{"Name" = "myVMName"}

El resultado del comando anterior es una gran cantidad de información de configuración anidada y opciones de método para tomar acciones contra la VM o obtener propiedades del objeto.

Get-View

Si usas el mismo script anterior y envías la salida a una variable, puedes inspeccionar esas opciones anidadas con la notación de punto. Aquí puedes ver y recuperar toda esa información adicional del sistema operativo invitado, que tal vez quieras informar a través de PowerCLI.

PS51> $VM = Get-View -ViewType VirtualMachine -Filter @{"Name" = "myVMName"}
PS51> $VM.Guest
Using Get-View with the Filter Parameter

Quizás te gustaría seleccionar una sola propiedad. Si es así, podrías ejecutar lo siguiente para reducir a un valor individual.

PS51> $VM.Guest.GuestFullName

Hay muchas opciones de Get-View para todo tipo de objetos de VMware. Siéntase libre de explorar todas estas opciones y revisar este artículo informativo de VMware que profundiza en este potente cmdlet.

VMware Code Capture: Aprenda de sus clics

Si desea aprovechar PowerCLI pero prefiere no construir código escribiendo, Code Capture en vCenter está aquí para usted. Code Capture es una nueva herramienta para desarrolladores que actúa de manera similar al Centro Administrativo de Directorio Activo. Vamos a cubrir Code Capture en este tutorial de PowerCLI.

Esta herramienta registra todas las acciones que realiza dentro de la GUI. Luego transforma todas esas acciones y le proporciona scripts de PowerCLI.

De forma predeterminada, Code Capture no está activado. Para activarlo, abra su appliance de vCenter y vaya a  Menú –> Centro de Desarrolladores como se muestra a continuación.

Navigating to the Developer Center menu item in vSphere

Una vez en la pestaña Centro de Desarrolladores, active la opción Activar Code Capture.

Enabling code capture

Cuando habilite Code Capture, verá un botón Grabar rojo en el encabezado de su vCenter. Una vez habilitado, siempre que desee que se registre una acción y se convierta en salida de PowerCLI, debe grabar la actividad de la GUI presionando el botón grabar.

Code capture enabled indicator

El botón rojo grabar aparecerá junto a la sección de usuario conectado de vCenter para que ahora pueda grabar en cualquier momento.

Para demostrar Code Capture, sigue el asistente de creación de Nueva Máquina Virtual.

  1. Haz clic en el botón Grabar para comenzar a grabar. Esto hará que el botón rojo Grabar comience a parpadear.
  2. Haz clic derecho en tu host de VMware y Crea una Nueva Máquina Virtual. Sigue el asistente resultante para crear una nueva máquina virtual con los valores predeterminados.
  3. Una vez creada la máquina virtual, haz clic en el botón de grabación para detener la grabación.

Es posible que la salida resultante sea un poco más detallada de lo esperado. La salida incluso incluye todas las acciones de navegación por la interfaz gráfica antes de crear la VM. Pero deberías ver una sección que comienza con CreateVM_Task en los comentarios. Aquí es donde comienza el código para crear una VM.

A continuación se muestra una parte de la salida de CreateVM_Task del proceso del Asistente de Nueva VM en la interfaz gráfica a través de Code Capture:

Developer Center generated code

Esta salida puede resultar un poco abrumadora, pero te muestra directamente la cantidad de opciones de configuración disponibles para tus máquinas virtuales. Dependiendo de tus necesidades, ahora tienes el poder de realizar ajustes en tus propios scripts y personalizarlos a tu gusto.

La utilidad Code Capture no se limita solo a la creación de VM. También puede generar código para cambios de red, pequeñas modificaciones de VM o cambios de configuración de host. Al poder revisar la salida de PowerCLI de las acciones de la GUI, puedes acortar tu camino hacia la implementación de la infraestructura como código.

Resumen del Tutorial de PowerCLI.

En este artículo, has cubierto mucho terreno. ¡Buen trabajo! Espero que hayas notado el poder que PowerCLI aporta a la gestión de la infraestructura de VMware.

Hay muchos cmdlets en PowerCLI para una amplia gama de bases de productos, pero solo cubrimos algunos aquí. ¡Asegúrate de estar atento a este blog para más artículos sobre esta herramienta impresionante!

Lectura adicional

Source:
https://adamtheautomator.com/powercli-tutorial/