Comment démarrer et arrêter une VM Azure avec PowerShell ?
Sommaire
I. Présentation
Dans ce tutoriel, nous allons voir qu'il est possible d'arrêter ou de démarrer une VM Azure avec PowerShell. Pour diverses raisons, on peut avoir besoin d'agir sur l'état d'une VM Azure à partir d'un script PowerShell, ce qui peut être le cas lorsque l'on cherche à réaliser des économies.
En effet, sur Azure, il faut payer lorsqu'une machine virtuelle tourne, alors si on l'arrête la nuit, on peut envisager de réaliser quelques économies. Même si cela ne s'applique pas à tous les types de machine, car certains services doivent tourner H24, ce n'est pas forcément le cas des VM de test.
Dans cet article, je vais simplement vous expliquer comment réaliser ces actions manuellement avec PowerShell, sans exploiter un autre service Azure. Dans un second article, nous verrons comment démarrer automatiquement les machines virtuelles chaque jour, à une heure spécifique, via PowerShell et Azure Automation.
II. Les modules Az.Accounts et Az.Compute
Pour établir une connexion à Azure puis agir sur les serveurs virtuels, nous avons besoin de deux modules PowerShell : Az.Accounts et Az.Compute.
Pour installer le module Az.Accounts :
Install-Module -Name Az.Accounts
Pour installer le module Az.Compute :
Install-Module -Name Az.Compute
III. Connexion au tenant Azure avec PowerShell
Pour agir sur le Cloud Azure avec PowerShell, nous devons établir une connexion avec le cmdlet Connect-AzAccount du module Az.Accounts :
$CredAzure = Get-Credential Connect-AzAccount -Credential $CredAzure
Si vous souhaitez plus d'informations sur les différentes méthodes de connexion, vous pouvez lire ce tutoriel :
IV. Arrêter une VM Azure avec Powershell
Tout d'abord, sachez que vous pouvez obtenir l'état d'une machine virtuelle avec cette commande :
Get-AzVM -Name "SRV-WSUS" -Status
Cela permettra de voir si elle est démarrée ou arrêtée, mais aussi de récupérer le nom du groupe de ressource (nous en aurons besoin plus tard).
Si l'on part du principe qu'elle est démarrée et que l'on souhaite l'arrêtée, on va utiliser le cmdlet "Stop-AzVM". Pour utiliser ce cmdlet, nous devons préciser plusieurs paramètres :
- -ResourceGroupName : nom du groupe de ressource de la VM
- -Name : nom de la VM
- -Force : arrêter la VM sans demander la confirmation
- -StayProvisioned : arrêter la VM tout en réservant les ressources (pour être sûr de pouvoir la démarrer ultérieurement)
Ce qui donne :
Stop-AzVM -ResourceGroupName "IT-CONNECT_VM_SRV_WSUS" -Name "SRV-WSUS" -Force -StayProvisioned
En regardant la sortie dans la console, vous pouvez savoir si l'opération a fonctionnée ou non :
OperationId : f8b64a38-yyyy-zzzz-8ba9-xxxxxxxx
Status : Succeeded
StartTime : 4/11/2022 9:42:57 AM
EndTime : 4/11/2022 9:43:28 AM
Error :
Maintenant, on pourrait s'appuyer sur les tags (étiquettes) pour cibler plusieurs machines virtuelles. Personnellement, je trouve les tags particulièrement pratiques, car cela facilite le ciblage, notamment quand on utilise PowerShell. J'utilise sur mes VMs une étiquette nommée "Type" qui peut prendre deux valeurs : "Serveurs" ou "PC", afin de différencier mes VM "Serveurs" de mes VM qui sont des PC virtualisés.
Note : on peut imaginer créer des tags correspondants à des heures d'extinctions, et se baser sur cette valeur pour éteindre les VMs au bon moment.
Par exemple :
Ainsi, on peut récupérer la liste des VM à arrêter en se basant sur une valeur spécifique pour le Tag. Pour récupérer la liste des VMs avec l'étiquette "Type = PC", on peut faire :
$VMtoStop = Get-AzVM | Where-Object {$_.Tags.Type -eq "PC"}
Il ne reste plus qu'à créer une boucle Foreach qui va parcourir la variable $VMtoStop et arrêter l'ensemble des machines :
Foreach($VM in $VMtoStop){ Stop-AzVM -ResourceGroupName $VM.ResourceGroupName -Name $VM.Name -Force -StayProvisioned }
Ceci est un exemple avec un filtre basé sur un tag, mais il y a bien sûr d'autres filtres possibles (nom, groupe de ressource, localisation, etc.).
V. Démarrer une VM Azure avec PowerShell
Nous venons de voir comment arrêter une VM Azure avec PowerShell. Désormais, nous allons voir comment démarrer une VM Azure avec PowerShell via le cmdlet Start-AzVM. Son utilisation est également très simple puisqu'il suffit de préciser le nom du groupe de ressource et le nom de la VM en elle-même. Ces deux paramètres sont obligatoires.
Voici un exemple pour démarrer un ordinateur virtuel nommé "SRV-WSUS" du groupe de ressource "IT-CONNECT_VM_SRV_WSUS" :
Start-AzVM -ResourceGroupName "IT-CONNECT_VM_SRV_WSUS" -Name "SRV-WSUS"
Là encore, en nous inspirant de l'exemple précédent basé sur la valeur d'une étiquette, nous pourrions démarrer uniquement certaines machines virtuelles.