Run command en Azure VMs con PowerShell

Azure ofrece nuevas funcionalidades todo el tiempo, por lo que no es raro estar utilizando el portal y ver una nueva opción o feature lista para usar. Revisando dentro del blade de las VMs encontré una opción llamada Run Command dentro de las opciones de la sección “Operations”. No recordaba haber visto esa opción antes, por lo que le hice clic y me sorprendió lo que obtuve…

Si bien existen varios caminos para ejecutar comandos o scripts en Azure, dependen de lo que se necesite implementar. Se pueden utilizar Runbooks con Azure Automation, scripts de Desire State Configuration (DSC), Azure DevOps pipelines y otras There are several ways to run commands and scripts on Azure VMs depending on the design you need to implement. You can use runbooks, Desired State Configuration (DSC) scripts, Azure DevOps pipelines, and many other third-party solutions for this. There’s also a pretty simple standalone solution to execute commands on Azure VMs, which is a built-in feature in Azure Portal and is also usable through PowerShell.

Run command

Una lista con una variedad de opciones que permite, de forma sencilla y ágil, realizar ciertas tareas de gestión de recursos o resolución de problemas sin salir de la consola de Azure.

Indudablemente una de las opciones existentes es ejecutar un script de PowerShell, pero también se encuentra disponible la ejecución de los clásicos comandos de cmd. Adicional a lo anterior tenemos algunos “shorcuts”, como lo es la ejecución del comando ipconfig /all o la habilitación del usuario administrador.

Ejecutar PowerShell desde el portal

Para ejecutar PowerShell basta seleccionar la opción RunPowerShellScript y escribir el código dentro del recuadro. Luego seleccionar el botón Run y analizar la salida. Para el ejemplo vamos a escribir una consulta seleccionando los 10 servicios en ejecución que más consumen CPU:

Get-Process Run Command

Obteniendo como resultado la siguiente salida:

Ejemplo de salida de Run Command

Para los que gustan de contar con más detalles, la versión que utiliza esta funcionalidad es la 5.1 edición “Desktop”. Es decir que no utiliza la versión Core :(

Restricciones

Si bien tiene muchos usos prácticos, también es cierto que existen limitaciones:

  • La salida tiene un límite de hasta 4096 bytes
  • Demora alerdedor de unos 20 segundos ejecutar el script
  • Únicamente se puede ejecutar uno a la vez
  • No está soportado el modo interactivo (prompt)
  • No se puede cancelar una ejecución
  • El tiempo máximo que un script puede correr es 90 minutos, luego genera un time out
  • Los scripts se ejecutan como System (se puede comprobar ejecutando whoami)
  • La VM necesita tener conectividad para retornar el resultado de la ejecución (básicamente tiene que tener conectividad a las IPs públicas de Azure por el puerto 443)

Utilizar Azure CLI y Azure PowerShell

También podemos realizar lo mismo que el portal sin salir de nuestra sesión en Azure CLI o Azure PowerShell, gracias a los siguientes ejemplos:

Azure CLI

  az vm run-command invoke --resource-group test --name linux-runcommand --scripts "sudo touch /newFile.txt" --command-id RunShellScript

Más información en la documentación oficial: az vm run-command

Azure PowerShell

  Invoke-AzVMRunCommand -ResourceGroupName test -VMName win-runcommand -CommandId RunPowerShellScript -ScriptPath ./run-command.ps1

Seguridad

La funcionalidad Run Command permite limitar el acceso a ésta funcionalidad. Para poder hacer uso de la misma es necesario contar con el siguiente nivel de permiso:

Microsoft.Compute/virtualMachines/runCommand/action

El cual ya viene incluído en el rol Virtual Machine Contributor (u otros roles con mayores privilegios).

Vale la pena recordar que es posible crear roles custom en donde es posible asignar este privilegio en particular para tener un mayor control en los recursos.

Happy scripting!

Comments