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 configurations 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 :
- Azure Automation – Éteindre automatiquement plusieurs VM Azure
- 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 de ces derniers – sans avoir à modifier/adapter le code de vos scripts. 😉
Merci pour ce script, est-il possible de ne pas arrêter automatiquement la VM si par exemple j’ai un logiciel qui tourne sur cette VM (on peut dire que si office est lancé, on n’arrête pas la VM, j’ai juste pris office comme exemple)
Techniquement, c’est tout à fait faisable. Mais je n’ai pas traiter ce besoin sur ce blog. Il faudra chercher ailleurs. https://docs.microsoft.com/fr-fr/azure/virtual-machines/windows/run-command