Azure Automation: apagar/encender VMs ASM y ARM por resource group

Si, la verdad es que he estado unos días preparando varios scripts para Azure Automation y no quiero pasar la oportunidad de compartilos contigo. Ayer publiqué uno que te permite eliminar todos aquellos resource groups que están vacíos, hoy he publicado uno con el que puedes apagar/encender todas las máquinas virtuales, ARM y ASM, pasándo como parámetro el nombre de un resource group.

Por si no lo sabías, dentro de un resource group es posible tener máquinas tanto ARM como ASM y la forma de tratarlas es diferente, en cuanto a los comandos de PowerShell a utilizar.

ASM and ARM VMs in the same Resource Group
ASM and ARM VMs in the same Resource Group

Para solventar este escenario he creado el siguiente script:

workflow Shutdown-Start-VMs-By-Resource-Group
{
Param
    (   
        [Parameter(Mandatory=$true)]
        [String]
        $AzureResourceGroup,
[Parameter(Mandatory=$true)]
        [Boolean]
$Shutdown
    )

#The name of the Automation Credential Asset this runbook will use to authenticate to Azure.
    $CredentialAssetName = "DefaultAzureCredential";

#Get the credential with the above name from the Automation Asset store
    $Cred = Get-AutomationPSCredential -Name $CredentialAssetName
    if(!$Cred) {
        Throw "Could not find an Automation Credential Asset named '${CredentialAssetName}'. Make sure you have created one in this Automation Account."
    }

    #Connect to your Azure Account   
Add-AzureRmAccount -Credential $Cred
Add-AzureAccount -Credential $Cred

if($Shutdown -eq $true){
Write-Output "Stopping VMs in '$($AzureResourceGroup)' resource group";
}
else{
Write-Output "Starting VMs in '$($AzureResourceGroup)' resource group";
}

#ARM VMs
Write-Output "ARM VMs:";
  
Get-AzureRmVM -ResourceGroupName $AzureResourceGroup | ForEach-Object {

if($Shutdown -eq $true){

Write-Output "Stopping '$($_.Name)' ...";
Stop-AzureRmVM -ResourceGroupName $AzureResourceGroup -Name $_.Name -Force;
}
else{
Write-Output "Starting '$($_.Name)' ...";
Start-AzureRmVM -ResourceGroupName $AzureResourceGroup -Name $_.Name;
}
};



#ASM VMs
Write-Output "ASM VMs:";

Get-AzureRmResource | where { $_.ResourceGroupName -match $AzureResourceGroup -and $_.ResourceType -eq "Microsoft.ClassicCompute/VirtualMachines"} | ForEach-Object {

$vmName = $_.Name;
if($Shutdown -eq $true){

Get-AzureVM | where {$_.Name -eq $vmName} | ForEach-Object {
Write-Output "The machine '$($_.Name)' is $($_.PowerState)";

if($_.PowerState -eq "Started"){
Write-Output "Stopping '$($_.Name)' ...";
Stop-AzureVM -ServiceName $_.ServiceName -Name $_.Name -Force;
}
}
}
else{

Get-AzureVM | where {$_.Name -eq $vmName} | ForEach-Object {
Write-Output "The machine '$($_.Name)' is $($_.PowerState)";

if($_.PowerState -eq "Stopped"){
Write-Output "Starting '$($_.Name)' ...";
Start-AzureVM -ServiceName $_.ServiceName -Name $_.Name;
}
}
}
};
}

Para poder lanzar este script es necesario importar la última versión del módulo AzureResourceManager como se explica en este post.

En el caso de las máquinas ARM deberás utilizar el comando Stop-AzureRmVM y Start-AzureRmVM y para las máquinas creadas en el modelo clásico (ASM) se manejan con los comandos Stop-AzureVM y Start-AzureVM. Como puedes ver en la siguiente imagen, en el lado izquierdo puedes indicar el resource group y true o false en el parámetro Shudown, para iniciar o apagar las máquinas. En el caso de true se pararán las máquinas dentro del resource group.

Test - Shutdown-Start-VMs-By-Resource-Group script
Test – Shutdown-Start-VMs-By-Resource-Group script

Si seleccionas false hará que tanto las máquinas ASM como ARM se arranquen.

Test - Shutdown-Start-VMs-By-Resource-Group -Start
Test – Shutdown-Start-VMs-By-Resource-Group -Start

Por último puedes crear dos programaciones diferentes, una para el encendido y otra para el apagado de las máquinas, a través del apartado Schedules dentro del runbook, modificando a true o false el valor del parámetro $Shutdown y la hora de inicio de cada programación.

Azure Automation - Schedules
Azure Automation – Schedules

Si prefieres no tener que crear el script desde cero, al igual que el anterior, lo he publicado en la galería para que esté disponible para todo el mundo.

Azure Automation - Browse Gallery - Shutdown-Start VMs

¡Saludos!