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:

  1. Accedemos a https://portal.azure.com

  2. Accedemos a la máquina virtual donde queremos ejecutar el script, en nuestro ejemplo vm-windows01. Pulsamos en Run command.

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



  1. Ponemos el script a ejecutar y pulsamos en el botón Run.


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