Azure Automation – Planifier l’exécution d’un script PowerShell

Dans un précédent article, nous avions découvert les fonctionnalités proposées par Azure Automation et comment créer un premier script basique afin de procéder à l’arrêt automatique de toutes les machines virtuelles d’un même resource group. Je vous propose aujourd’hui de voir comment planifier l’exécution d’un script PowerShell depuis Azure Automation.

Contexte

Pour ce faire, je vais repartir de mon ancienne infra de test. Pour pouvoir faire vos tests de votre côté, vous n’avez besoin que d’une ou plusieurs machines virtuelles contenues dans un même Resource group. Dans mon cas, lorsque vous verrez du code, notez que mon resource group de test s’appellera TGI-Test et que mes 2 machines virtuelles s’appellent (très humblement) : VM1 et VM2.

Cela n’a bien évidemment aucune importance, pensez simplement à adapter votre code pour les tests et à utiliser les noms de vos ressources dans Azure. 🙂

On part également du principe que notre Azure Automation Account est déjà créé (référez-vous au précédent article si besoin).

Création d’un script de test

Un besoin que l’on retrouve souvent sur Internet est de pouvoir arrêter et démarrer un groupe de machine virtuelles automatiquement à des heures précises afin de limiter sa consommation de crédits Azure. Je vous propose donc ce scénario comme test.

Pour ce faire, rendez-vous dans votre Azure Automation Account et créez 2 nouveaux scripts PowerShell de test. A chaque fois, pensez bien à choisir PowerShell Workflow dans le menu déroulant Runbook type.

Pour le premier script ShutdownVM, j’ai le code suivant (le même que dans le précédent article) :

workflow ShutdownVM
{
# 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 all the virtual machines
foreach ($VM in $ListVM)
{
Stop-AzureRMVM -ResourceGroupName "TGI-Test" -Name $VM.Name -Force
}
}

Pour le second script, je vous propose de l’appeler StartVM et d’y mettre le code suivant :

workflow StartVM
{
# 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 all the virtual machines
foreach ($VM in $ListVM)
{
Start-AzureRMVM -ResourceGroupName "TGI-Test" -Name $VM.Name
}
}

Rien d’exceptionnel, le code est presque identique si ce n’est que nous utilisons cette fois-ci la CmdLet Start-AzureRMVM et que le paramètre -Force n’est ici pas nécessaire.

N’hésitez pas à tester vos 2 scripts manuellement et observer l’état de vos machines virtuelles de test. Une fois que vous êtes prêt, pensez également à les publier.

Planification des runbooks

Une fois à cette étape, vous disposez de vos 2 scripts qui sont testés et fonctionnels et permettent ainsi d’arrêter et démarrer vos machines virtuelles automatiquement. Il nous reste maintenant à voir comment planifier l’exécution de ces scripts.

Mes machines étant actuellement démarrées, je vais commencer par planifier le ShutdownVM en premier puis je planifierai le StartVM quelques minutes après.

Pour ce faire c’est très simple, n’oubliez pas de publier votre runbook et rendez-vous sur le premier script ShutdownVM. Dans la partie supérieure, vous verrez un bouton Schedule. La planification nécessite que vous créiez un objet schedule pour chaque runbook.

Dans la capture ci-dessus, vous pouvez voir que j’ai planifié (Auto-ShutdownVM) l’exécution de ce runbook pour une première exécution à 3:00 PM puis pour une exécution récurrente toutes les heures – indéfiniment (à adapter en fonction de votre test car l’exécution de ce script a un coût sur votre crédit Azure).

Même chose pour le démarrage automatique mais cette fois-ci j’ai appelé mon objet : Auto-StartVM. La première exécution aura lieue 30 minutes plus tard puis sera répétée toutes les heures – indéfiniment.

Une fois que vous avez créé vos objets “Schedule” n’oubliez pas de valider en les connectant. En effet, votre runbook et votre schedule doivent être “linked“.

Pour vérifier que votre script s’exécute bien, vous rendre dans la section Jobs un fois le runbook sélectionné. Vous le verrez alors passer par les status Running puis Completed.

Dans mon scénario de test, mes VM étaient déjà allumées. J’ai donc exécuté automatiquement en premier le script pour les éteindre. Puis 30 minutes plus tard, le second script a procédé à leur redémarrage automatiquement. On peut s’en assurer en regardant l’Activity Log sur l’Automation Account ou Resource group concerné…

Oui, tout s’est bien passé comme attendu. On voit bien que nos 2 machines virtuelles ont été stoppées puis démarrées automatiquement grâce à nos scripts.

Notez que même si vous indiquez un début à 3.00 PM vous verrez 3:03 ou 3:05 car cela a pris 2 minutes pour arrêter la première VM avant de démarrer l’extinction de la seconde VM (mais ce comportement est dû au côté simpliste de nos 2 scripts de test).

Evidemment, ce n’est que le début de l’aventure et vous pouvez imaginer des scénarios bien plus complexes pour Azure Automation. Cela dit, celui-ci vous permettra au moins de réaliser quelques économies sur votre consommation IaaS. 😉

Pour aller plus loin

Dans un prochain article, nous verrons comment planifier ces scripts directement en PowerShell sans passer par l’interface graphique. 🙂

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