Azure Automation – Arrêter et démarrer automatiquement vos machines virtuelles via les Tags

Pour ce troisième article sur Azure Automation, je vous propose de voir ensemble comment nous pouvons utiliser Automation ainsi que les Tags pour configurer l’arrêt et le démarrage automatique sur l’ensemble des machines virtuelles de votre souscription Azure en vue d’économiser votre crédit la nuit et/ou le weekend.

Le principe est très simple, nous allons utiliser les Tags qui sont disponibles sur Azure afin de rechercher un mot clé sur chacune de nos machines virtuelles. En fonction de la valeur de ce mot clé, nous réaliserons alors (ou pas) un démarrage ou un arrêt automatiquement de la machine virtuelle concernée. Et nous bouclerons sur l’ensemble de vos VM (d’un même Resource group).

Contexte

Comme d’habitude, si vous souhaitez manipuler et reproduire les étapes décrites plus bas sur votre infra de test, notez que vous aurez besoin d’une souscription de test Azure, un resource group contenant 1 ou plusieurs machines virtuelles.

Je passe sur les éventuelles configuration en termes de réseau, cela n’aura aucune incidence pour notre scénario. Et n’oubliez pas de créer votre Automation Account car je ne vais pas détailler cette partie.

Si besoin, référez-vous aux 2 précédents articles sur Azure Automation :

  1. Azure Automation – Éteindre automatiquement plusieurs VM Azure
  2. Azure Automation – Planifier l’exécution d’un script PowerShell

Pour ma part, j’ai créé 2 machines virtuelles de test appelées VM1 et VM2 (très créatif). 😉

Création des Tags

Vos 2 machines virtuelles sont provisionnées. Nous allons maintenant créer les différents Tags pour notre scénario. Pour ce faire rendez-vous dans la section Tags de chacun de vos VM.

Je vous propose d’ajouter les 2 Tags suivants :

  • autostart: yes/no
  • autoshutdown: yes/no

Avec ces 2 Tags nous aurons le comportement suivant :

  • autostart: yes permettra de démarrer automatiquement la machine virtuelle le matin si cette dernière n’est pas allumée (on va voir le code plus tard) disons par exemple à 10h du matin.
  • autoshutdown: yes permettra d’arrêter automatiquement la machine virtuelle le soir à 18h (par exemple) afin de réaliser des économies durant le soir/nuit dans le cas où vous n’utiliseriez pas cette VM.

Ainsi, vous ne serez facturé que de 8 heures de fonctionnement pour chaque VM concernée (au lieu de 24 heures – où de devoir gérer manuellement l’arrêt et le redémarrage de votre Lab). 😉

Si vous positionnez la valeur No pour les Tags précédemment mentionnés, les scripts ne s’exécuteront pas. Cela dit, vous l’aurez deviné, mais si vous ne positionnez PAS les tags, le résultat sera le même qu’avec une valeur configurée à No.

Ne mettez pas les mêmes valeurs à vos différentes VM pour tester ! 🙂

Création du script StartVMTagged

Encore une fois, je le rappelle mais je ne vais pas rentrer dans le détail de la création de votre Automation Account. Celui-ci est supposé créé.

Nous allons donc maintenant créer notre runbook workflow qui nous permettra de démarrer automatiquement nos VM le matin à 10h. Pour ce faire, je reprends la même démarche que dans ce précédent article. Créez un runbook avec le code suivant dans votre Automation Account – je l’appelle StartVMTagged

workflow StartVMTagged
{
 # Association to the Azure subscribtion
 $Conn = Get-AutomationConnection -Name AzureRunAsConnection
 Add-AzureRMAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint
 
 # Getting all the VM in the resource group concerned
 $listVM = Get-AzureRMVM -ResourcegroupName "TGI-Test"
 
 # Starting VM if Tag autostart is configured to yes
 foreach ($VM in $ListVM)
 {
 if ($vm.Tags.autostart -eq "yes")
 {
 Start-AzureRMVM -ResourceGroupName "TGI-Test" -Name $VM.Name
 Write-Output $vm.Name " has been started automatically !"
 }
else
{
Write-Output $vm.Name " NOT started (no tag configured or NO value)"
}
}
}

Notez que dans ce script, on ne teste aucune condition particulière du style : ma VM était déjà démarrée, ou si le tag avait une autre valeur que yes/no

Si la VM concernée dispose du tag autostart avec la valeur yes alors on démarre automatiquement la VM concernée – dans le cas contraire on ne fait rien (mais on trace l’informations dans les logs d’exécution du runbook).

Vous pouvez tester votre script dans le Test Pane (dans le menu tout en haut).

Et si vous allez vérifié l’état de vos VM vous verrez que la VM disposant du Tag autostart a été correctement démarrée – vous pourrez voir une action de Start dans l’Activity Log générée par votre Automation Account.

Création du script StopVMTagged

Même démarche pour ce second script StopVMTagged. Comme vous le voyez, il est très simple en PowerShell de récupérer la liste des tags ou bien même de rechercher les valeurs associées à ces Tags. Le code est presque identique.


workflow StopVMTagged
{
# Association to the Azure subscribtion
$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Add-AzureRMAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint

# Getting all the VM in the resource group concerned
$listVM = Get-AzureRMVM -ResourcegroupName "TGI-Test"

# Stopping VM if Tag autoshutdown is configured to yes
foreach ($VM in $ListVM)
{
if ($vm.Tags.autoshutdown -eq "yes")
{
Stop-AzureRMVM -ResourceGroupName "TGI-Test" -Name $VM.Name -Force
Write-Output $vm.Name " has been stopped automatically !"
}

else
{
Write-Output $vm.Name " NOT stopped (no tag configured or NO value)"
}
}
}

N’oubliez pas de tester votre script dans le Test Pane. Et vérifiez qu’en fonction du statut précédent de vos 2 machines, de la configuration des tags que l’exécution du script a bien conduit au résultat attendu.

Dans mon cas, j’avais manuellement démarré mes 2 VM mais seule la première dispose du tag correctement configuré pour être arrêtée automatiquement. Le résultat est cohérent au vue des logs (et je peux confirmer encore depuis l’Activity Log du Resource group).

Planification des 2 scripts

Nous disposons à présent de 2 scripts qui nous permettent d’éteindre ou d’allumer automatiquement les machines virtuelles d’un même Resource group disposant de Tags spécifiques. Mais il y a pas mal d’améliorations qui sont encore possibles : on pourrait par exemple ne pas se concentrer que sur un seul Resource Group ou même stocker dans les Tags une plage horaire de fonctionnement… N’oubliez simplement pas que l’exécution de scripts dans Azure Automation implique également des coûts au niveau de votre facture (plus faibles que le fonctionnement d’une VM toute la journée bien sûr).

Il nous reste maintenant à planifier ces 2 scripts. Il vous suffit de créer 2 objets Schedule et les associer à chaque runbook PowerShell.

Le StartVMTagged sera donc planifié pour une exécution chaque matin à 10h et procédera au redémarrage des VM disposant du Tag nécessaire (autostart avec pour valeur yes).

Tandis que le script StopVMTagged sera quant à lui planifier pour une exécution le soir à 19h et permettra de stopper les VM qui disposent du tag autoshutdown avec pour valeur yes.

Vos machines virtuelles seront – disposant de la configuration adéquat au niveau des tags – seront donc désormais stoppées le soir à 19h puis démarrées le matin à 10h – et cela automatiquement. 🙂

Pour aller plus loin

Bien entendu, il est possible d’aller beaucoup plus loin : vous pourriez par exemple gérer les weekends en ne démarrant pas les machines durant le weekend pour économiser encore un peu d’argent…

L’intérêt d’utiliser les Tags et que vous pouvez également ajouter ou suspendre l’arrêt ou le démarrage automatique en modifiant simplement la valeur des ces derniers – sans avoir à modifier/adapter le code de vos scripts. 😉

PartagezShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInEmail this to someone