Lanzar comandos y scripts a tus Máquinas virtuales de Azure usando Run Command
En el post de hoy vamos a ver que es Run Command, y vamos a ver su utilidad.
Tal y como dice la documentación oficial (https://learn.microsoft.com/en-us/azure/virtual-machines/run-command-overview), nos permite ejecutar comanfos y scripts haciendo uso del Virtual Machine Agent, tanto en Windows (https://learn.microsoft.com/en-us/azure/virtual-machines/extensions/agent-windows) como en Linux (https://learn.microsoft.com/en-us/azure/virtual-machines/extensions/agent-linux).
Lo mejor de Run Command, es que no necesitamos entrar en cada una de las máquinas virtuales para ejecutar estos comandos y scripts, sino que vamos a poder ejecutar estos desde el Portal de Azure, Powershell, azcli, o directamente a través de la API Rest.
En este artículo nos vamos a centrar principalmente en como hacerlo a través de Powershell, pero voy a explicaros de manera breve como podríais hacerlo desde el Portal de Azure.
Los pasos a seguir para hacerlo desde el Portal de Azure serían:
-
Accedemos a https://portal.azure.com
-
Accedemos a la máquina virtual donde queremos ejecutar el script, en nuestro ejemplo vm-windows01. Pulsamos en Run command.
-
A continuación le damos a RunPowerShellScript.
Fijaros como en la imagen de arriba, a parte de poder lanzar un script de Powershell existen otras acciones predefinidas como Deshabilitar Windows Update, habilitar el usuario administrador etc.. Estas acciones no son más que scripts a lanzar en la VM, pero Azure te las ofrece de manera nativa sin necesidad de que tú crees el script.
- Ponemos el script a ejecutar y pulsamos en el botón Run.
-
Una vez finalizada la ejecución del script, obtengo el resultado:
Una vez explicado brevemente como realizar esto, vamos a ver un ejemplo de como hacerlo con PowerShell.
Imaginemos que yo tengo muchas máquinas virtuales Windows , de las cuales yo necesito crear un usuario administrador local en cada una de estas máquinas virtuales. Para realizar esta tarea, podría entrar al Portal de Azure y lanzar los comandos de crear este usuario administrador haciendo uso de Run Commands. También podría entrar a cada una de las máquinas por escritorio remoto y hacerlo.
Pero claro, ya os digo que a la tercera máquina virtual estaría hasta el gorro de hacerlo.
¿ Y porqué no usamos un Powershell y la potencia de Run Command ?. Pues no se diga más, pongamonos manos a la obra.
Podría hacer un script de la siguiente manera:
#Connect to azure
Connect-AzAccount
#Variables
$susbscriptionId = "[put_your_subscription]"
$newAdminUser = "[put_your_user_here]"
$plainPassword = "[put_your_password_in_plain_text_here]"
#Set subscription for script
Set-azContext -Subscription $susbscriptionId
#Get all windows VM in subscriptions
$allWindowsVMs = Get-AzVM | Where-Object { $_.StorageProfile.OsDisk.OsType -eq "Windows" }
#Script to execute in each Virtual Machine
$ScriptBlock = {
param(
[string] $user,
[string] $password
)
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
New-LocalUser -Name $user `
-Password $securePassword `
-FullName $user `
-Description "New admin user created using Run Command feature"
Add-LocalGroupMember -Group "Administrators" `
-Member $user
}
$Script = [scriptblock]::create($ScriptBlock)
foreach($windowsVm in $allWindowsVMs)
{
#Creat user admin in VM
Invoke-AzVMRunCommand -ResourceGroupName $windowsVm.ResourceGroupName `
-VMName $windowsVm.Name `
-CommandId 'RunPowerShellScript' `
-ScriptString $Script -Parameter @{'user' = "$newAdminUser" ; 'password' = "$plainPassword"}
}
En la línea 1 conectamos a Azure usando el comando Connect-AzAccount.
En la líneas de la 5 a la 7 configuramos las siguientes variables:
$susbscriptionId: Id de la suscripción donde están las máquinas virtuales.
$newAdminUser: El nombre de usuario a crear.
$plainPassword: El password del usuario a crear en texto plano.
En la línea 13 obtenemos todas las máquinas virtuales de tipo Windows de la suscripción.
Entre las líneas 16 y 33, configuramos el script que vamos a ejecutar en cada una de las máquinas virtuales. Em nuestro ejemplo es crear un usuario local y meterlos en el grupo de administradores de la máquina virtual.
Entre las líneas 35 y 44, recorremos todas las máquinas virtuales y ejecutamos el script que creamos entre las líneas 16 y 31. Para poder ejecutar este script en cada una de las máquinas virtuales usamos el comando Invoke-AzVMRunCommand, pasándole los siguientes parámetros:
- ResourceGroupName: Grupo de recursos de la máquina virtual.
- VmName: Nombre de la máquina virtual.
- ScriptString: Script a ejecutar en cada una de las máquinas virtuales.
- Parameter: Parámetros a pasar al script.
Si todo va ok, nos saldrá un mensaje como este:
Si vamos a una de las máquinas virtuales donde hemos lanzado el script, confirmaremos que efectivamente se ha creado el usuario y que está en el grupo de administradores.
Por último comentaros dos cosas:
-
La primera, es que en el Activity Log podéis ver cuando se ejecutan los scripts usando Run Command en las máquinas virtuales.
-
Como puedes ver, con Run Command puedes hacer de todo como si de un administrador de la máquina virtual se tratará. El permiso necesario es Microsoft.Compute/virtualMachines/runCommand/action, y está desde el rol de Virtual Machine Contributor hacia roles con más permisos como Contributor y Owner. Con esto os quiero decir que CUIDADO a quien dais este permiso.
Y esto es todo, hasta la próxima y gracias.