Apaga y enciende tus máquinas virtuales con Azure Automation y ahorra dinero

Hola muy buenas.

En el artículo de hoy vamos a hablar sobre como apagar y encender máquinas virtuales en Azure usando Azure Automation y Powershell.

Por ejemplo, en un entorno de desarrollo, staging, pruebas etc.. estaría genial apagar nuestras máquinas cuando acabáramos la jornada laboral y encenderlas cuando empezáramos nuestra jornada laboral. De esta manera, ahorraríamos dinero lo cuál siempre esta bien.

Pues dicho esto pongamos el siguiente ejemplo:

“Quiero apagar mis máquinas de mi suscripción de staging a las 20:00 de la tarde y que se enciendan a las 08:00 de la mañana, de lunes a viernes. Además quiero que los fines de semana no se enciendan, es decir que se apaguen a las 20:00 del viernes y se enciendan el lunes a las 08:00 de la mañana”

Los pasos que deberíamos hacer es:

  1. Crear un Automation Account, por ejemplo usando Terraform.

    resource "azurerm_resource_group" "this" {
      name     = "rg-autoaccount-weu"
      location = "westeurope"
    }
    
    resource "azurerm_automation_account" "this" {
      name                = "autoacc-recetasdevops-weu"
      location            = azurerm_resource_group.this.location
      resource_group_name = azurerm_resource_group.this.name
    
      sku_name = "Basic"
    
       identity {
        type = "SystemAssigned"
      }
    }
    

En este código de Terraform, creamos un automation account llamado autoacc-recetasdevops-weu. También habilitamos el system managed identity del automation account.

Para una información más completa sobre como crear un Automation Account con Terraform, ver la documentación oficial en el siguiente link:

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/automation_account

Una vez desplegado el código de Terraform, si vamos al portal de Azure veremos que efectivamente tenemos nuestro Automation Account creado:



  1. Vale ahora lo que vamos a hacer es dar permisos a nuestro Automation Account para que pueda encender y apagar máquinas virtuales. Este permiso lo voy a dar a nivel de suscripción. Lo primero que hago es ir a Suscriptions y pulso en la suscripción.



  1. Ahora vamos a Access Control (IAM) y pulsamos.



  1. Ahora pulsamos en Add role assignment.



  2. En el apartado de Job function roles seleccionamos Virtual Machine Contributor. Este es un rol que nos permitirá apagar y encender las máquinas virtuales.



  3. Pulsamos en Next.



  4. En Members, seleccionamos Managed Identity y luego en + Select Members



  1. Seleccionamos la suscripción y luego el tipo de managed identity a buscar, en nuestro caso Automation Account.


  1. Seleccionamos nuestro Managed Identity y luego pulsamos en Select.



  1. Por último pulsamos en Review + assign. Un mensaje nos saldrá confirmando que el rol ha sido asignado.



  1. Vale ahora vamos a crear un runbook para iniciar y apagar las máquinas virtuales. Lo primero que hacemos es dentro del Automation Account ir a la sección de Runbooks.


  1. Una vez dentro pulsamos en + Create a runbook.



  1. Elegimos un nombre para el Runbook. También decimos que vamos a crear un script de tipo Powershell usando la versión 7.2 de Powershell.



  1. Pulsamos en Create.



  2. En la parte de poner el script, vamos a poner el siguiente script:

    Param(
    
     [ValidateSet("Startup", "Shutdown")]
    
     [string]$VmAction
    
    )
    
    Disable-AzContextAutosave -Scope Process
    
     # Connect to Azure with system-assigned managed identity
    $AzureContext = (Connect-AzAccount -Identity).context
    
     #Set and store context
    $AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext
    
    $VirtualMachines = Get-AzVM
    
    if ($VmAction -eq "Startup")
    {
        foreach($VirtualMachine in $VirtualMachines)
        {
    
            Write-Output "Start VM $($VirtualMachine.Name)"
    
            Start-AzVM -Name $VirtualMachine.Name -ResourceGroupName $VirtualMachine.ResourceGroupName
        }
    }
    
    if ($VmAction -eq "Shutdown")
    {
        foreach($VirtualMachine in $VirtualMachines)
        {
           Write-Output "Stop VM $($VirtualMachine.Name)"
    
           Stop-AzVM -Name $VirtualMachine.Name -ResourceGroupName $VirtualMachine.ResourceGroupName -Force
        }
    }
    

    Cosas importantes en este script:

    Línea 12: Usamos la managed identity del Automation Account para hacer login.

    Línea 17: Obtenemos todas las máquinas virtuales de la suscripción.

    Líneas 19 a la 28: En caso de pasar al script el parámetro VmAction el valor Startup, recorremos todas las máquinas virtuales de la suscripción y las encendemos.

    Líneas 30 a la 38: En caso de pasar al script el parámetro VmAction el valor Shutdown, recorremos todas las máquinas virtuales de la suscripción y las apagamos.



  1. vale ya tenemos el script. Ahora pulsamos en Publish y confirmamos.


  1. Vale ya con el script creado y publicado, vamos a programar cuando queremos que se ejecute el script. Para ello, pulsamos en la sección de Schedules:


  1. Luego pulsamos en + Add a schedule.



  1. Primero vamos a programar cuando queremos iniciar las máquinas virtuales. Ponemos un nombre y decimos que se debe ejecutar a las 8 de la mañana hora de España y de manera recurrente.



  1. Ponemos la opción Recur every a 1 Week y seleccionamos todos los días menos los Sábados y Domingos. Decimos que no expire esta programación y pulsamos en Create.



  2. Ahora pulsamos en Parameters and run settings.



  3. En el valor del parámetro VMACTION ponemos como valor Startup, ya que esta programación es para poder encender las máquinas virtuales. Pulsamos en OK.



  1. Pulsamos en OK para finalizar esta programación.



  1. En el listado Schedules, deberíamos ver la programación que hemos creado avisándonos de la próxima ejecución.



  1. Ahora deberíamos crear la programación para cuando queremos que las máquinas virtuales se apaguen. Para no repetirme deberíamos realizar de nuevo los pasos 18 y 19. Una vez realizados estos pasos de nuevos, ponemos el nombre para la programación y cuando queremos que se ejecute la programación en este caso las 8 de la tarde , hora de España. Ahora ponemos que se ejecute de forma recurrente.



  1. Ponemos la opción Recur every a 1 Week y seleccionamos todos los días menos los Sábados y Domingos. Decimos que no expire esta programación y pulsamos en Create.


  1. Ahora debemos seguir el paso 22 explicado anteriormente. Después deberíamos poner como valor del parámetro VMACTION, Shutdown.



  2. Pulsamos en OK para finalizar esta programación.



  3. Y con esto ya tenemos nuestras dos programaciones finalizadas.



La verdad es que el artículo me ha quedado bastante largo (jajaja), pero la verdad me gusta de primeras explicar como hacer las cosas de manera gráfica. Porque yo creo que así queda más claro los conceptos.

Una vez ya entendido los conceptos, pues ya si me pondría en modo automatización y hacerlo usando Powershell, az cli etc….

Espero que este artículo os haya gustado.

¡Hasta la próxima!