Comment démarrer et arrêter une VM Azure avec PowerShell ?

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 :

Exemple d'un tag sur une VM Azure

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.

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

Nombre de posts de cet auteur : 5579.Voir tous les posts

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.