15/11/2024

AzurePowerShell

Comment démarrer automatiquement une VM Azure ?

I. Présentation

Dans ce tutoriel, nous allons apprendre à démarrer automatiquement les VMs Azure à partir d'Azure Automation et d'un runbook PowerShell. Grâce à cette méthode, vous pourrez configurer certaines machines virtuelles Azure pour qu'elles s'arrêtent et démarrent automatiquement, à l'heure que vous le souhaitez.

Avant tout, il faut savoir que dans Azure, lorsqu'une VM tourne elle vous coûte de l'argent. En partant de ce constat, on peut chercher à optimiser les coûts pour que la facture soit un peu moins salée à la fin du mois. Pour certaines VM, l'arrêt n'est tout simplement pas envisageable, alors que pour d'autres cela peut avoir du sens. Par exemple, des VMs de test ou de préproduction que l'on utilise seulement la journée.

Azure Automation permet d'automatiser certaines tâches, notamment en exécutant des scripts PowerShell ou Python, pour automatiser certains processus. C'est surtout cet aspect d'Azure Automation qui va nous intéresser aujourd'hui. Même si ce service est payant, si l'on regarde les tarifs de "Process Automation", on peut voir que l'on a le droit à "500 minutes" d'exécution gratuite par mois. Étant donné que le démarrage d'une VM consomme quelques secondes, cette solution semble intéressante pour optimiser ses coûts 🙂

Dans cet article où l'on va effectuer la configuration pas à pas, je vais utiliser les valeurs suivantes :

  • VM à gérer automatiquement : SRV-WSUS
  • Groupe de ressources : IT-CONNECT_VM_SRV_WSUS
  • Compte Azure Automation :  IT-Connect_Automation
  • Nom du runbook : Start-VM-7am
  • Planification : Tous_les_jours_07h00

Pour une solution sans Azure Automation, consultez ce tutoriel :

II. Configurer l'arrêt automatique d'une VM Azure

Tout d'abord, nous devons activer l'arrêt automatique sur notre machine virtuelle "SRV-WSUS". Cette option est proposée lorsque l'on crée une machine virtuelle, et on peut revenir dessus à tout moment. Pour cela, il suffit de cliquer sur la VM puis de cliquer sur "Arrêt automatique" (1), de cocher l'option "Activé" (2), de définir l'heure à laquelle la VM doit s'arrêter et choisir le fuseau horaire (3). Enfin, il faut enregistrer (4).

Arrêt automatique d'une VM Azure

L'opération doit être répétée sur l'ensemble des VMs dont vous souhaitez gérer l'arrêt et le démarrage en mode auto. C'est également possible d'effectuer la configuration via PowerShell.

La première étape est un succès : notre VM va s'arrêter tous les jours à 23h00. Maintenant, voyons comment gérer le démarrage automatiquement, et là c'est un peu plus complexe.

III. Créer un compte Azure Automation

En premier lieu, à partir du portail Azure, recherchez "Automation" afin d'accéder à Azure Automation. La première fois, il sera indispensable de créer un compte Automation, en cliquant sur le bouton "Créer".

Il faut attribuer un groupe de ressources et un nom à ce compte Automation, par exemple "IT-Connect" en ce qui me concerne. Ensuite, lancez la création.

La création s'effectue en quelques secondes.

IV. Créer un runbook PowerShell dans Automation

La ressource étant créée, nous avons accès à notre compte "Azure Automation" et aux différentes fonctionnalités. Pour démarrer automatiquement les VMs, nous allons créer un runbook qui va exécuter un script PowerShell.

Sachez également qu'il y a une solution nommée "Start/stop VMs during off-hours" qui est proposée par Microsoft sous la forme d'une "application" pour Azure Automation. Vous pouvez accéder à cette méthode via votre compte Automation, puis en cliquant sur "Start/Stop VM" dans le menu de gauche. Cette solution est liée à Azure Automation et Log Analytics, alors elle va être plus coûteuse.

Start/stop VMs during off-hours

Commençons la configuration de notre runbook PowerShell... Toujours à partir d'Azure Automation (1), cliquez sur "Runbooks" dans le menu de gauche puis sur "Créer un runbook" (3).

Nous devons nommer ce runbook, par exemple "Start-VM-7am" car nous allons démarrer les VMs ciblées à 7h du matin. Pour le "Type de runbook", prenez "Flux de travail PowerShell". Continuez.

Azure Runbook PowerShell

À la suite de la création du runbook, un éditeur de code s'affiche. C'est ici qu'il va falloir coder notre runbook PowerShell en partant de ce bloc comme point de départ :

workflow Start-VM-7am
{
< notre code doit être intégré ici >
}

Voici le code à inclure (et ensuite je vous l'explique) :

workflow Start-VM-7am
{
    # Obtenir les informations du compte Azure Automation
    $ConnexionAz = Get-AutomationConnection -Name 'AzureRunAsConnection'

    # Ajouter le compte à la session en cours
    Add-AzureRMAccount -ServicePrincipal -Tenant $ConnexionAz.TenantID -ApplicationId $ConnexionAz.ApplicationId -CertificateThumbprint $ConnexionAz.CertificateThumbprint

    # Récupérer la liste des machines virtuelles à démarrer
    $VmAz = Get-AzureRMVM

    # Démarrer chaque VM
    $VmAz | Start-AzureRMVM
}

En image, cela donne :

La première étape consiste à récupérer les informations de connexion à Azure Automation via "Get-AutomationConnection", puis d'ajouter les informations du compte à la session en cours via Add-AzureRMAccount et notre variable $ConnexionAz.

Pour la suite, c'est-à-dire la cmd "Get-AzureRMVM" c'est pour récupérer la liste des machines virtuelles à démarrer et stocker cette liste dans une variable nommée $VmAz. Dans mon exemple, je récupère la liste de toutes les VMs, donc je vais démarrer toutes les VMs. Autrement dit, vous allez probablement vouloir faire autrement, en faisant un filtre sur un tag, par exemple.

Pour cela, il faudra ajuster cette ligne :

$VmAz = Get-AzureRMVM | Where-Object {$_.Tags.EtatVM -eq "Test"}

Dans l'exemple ci-dessus, je récupère uniquement les VMs dont le tag "EtatVM" est égal à "Test". A vous d'adapter selon vos tags. Pour cibler une VM spécifique, il faut préciser son nom et le groupe de ressources associé à cette VM. Voici un exemple avec "SRV-WSUS" :

$VmAz = Get-AzureRMVM -ResourceGroupName "IT-CONNECT_VM_SRV_WSUS" -Name "SRV-WSUS"

Une fois que la liste des VM est récupérée, on démarre chaque VM grâce à la commande Start-AzureRMVM puis le tour est joué ! En fin de compte, quand votre bout de code est prêt (tout en sachant qu'il est modifiable à tout moment), cliquez sur "Enregistrer" et "Publier".

Vous pouvez également cliquer sur "Volet de test" afin de tester votre runbook ! Attention, cela va réellement exécuter le script et démarrer les machines virtuelles.

Si la valeur "Terminée" s'affiche, c'est tout bon !Enfin, si vous obtenez une erreur et que vous voyez le texte "Run Login-AzureAccount to login", suivez l'étape suivante pour corriger le problème.

V. J'obtiens l'erreur "Run Login-AzureAccount to login" : que faire ?

Avant tout, sachez que cette partie du tutoriel s'adresse seulement à ceux qui ont rencontré l'erreur ci-dessous lors du test.

Run Login-AzureAccount to login

Pour corriger cette erreur, il faut accéder à la section "Comptes d'identification" (1) d'Azure Automation, puis créer un "Compte d'identification Azure" (2).

Run Login-AzureAccount to login

Une fois cette opération effectuée, ce compte Azure Automation sera capable de s'authentifier sur Azure et d'agir sur les ressources. Vous pouvez réexécuter votre test pour valider que cela fonctionne !

VI. Planifier l'exécution du runbook

La dernière étape consiste à créer une planification et à l'affecter à notre Runbook PowerShell. Pour créer une nouvelle planification à partir d'Azure Automation, nous devons cliquer sur "Planifications" (1) puis "Ajouter une planification" (2).

Azure Automation - Créer une planification

Nous pouvons nommer cette planification "Tous_les_jours_07h00" et définir la configuration suivante :

  • Démarrages : sélectionnez le lendemain et indiquez "07:00" (ou un autre horaire)
  • Fuseau horaire : France - Central European Time
  • Récurrence : périodique, tous les 1 jour
  • Définir l'expiration : "non" car cette planification doit s'exécuter tous les jours, pour toute la vie 🙂

Cliquez sur "Créer" pour valider.

Nous n'avons plus qu'à lier la planification avec le runbook "Start-VM-7am". Cliquez sur le runbook dans Azure Automation puis sur "Lier à une planification".

Choisissez l'objet "Tous_les_jours_07h00" qui correspond à la planification que nous venons de créer et validez.

La planification est bien liée à notre runbook ! Il est à noter que l'on peut ajouter plusieurs planifications à un même runbook, mais dans cet exemple ce n'est pas utile.

La configuration est terminée ! Ainsi, la machine virtuelle va s'arrêter à 23h00 et démarrer à 07h00, automatiquement, tous les jours !

author avatar
Florian BURNEL Co-founder of IT-Connect
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.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

2 commentaires sur “Comment démarrer automatiquement une VM Azure ?

  • Merci pour le tuto. Je vois demain si cela a fontionne

    Répondre
  • Bonjour,

    Super vos Tutos, je rencontre une modifications dans Azure concernant ce dernier Tutos, le compte d’identification a été remplacé par l’identité managée, savez vous si cette identité managée est facturée ? Si elle ne l’est pas savez vous par ou je dois passer pour la création ? j’ai tenté de suivre la procédure fournis par Microsoft mais cette dernière n’est pas très intuitive.

    Merci d’avance
    Bonne journée

    Répondre

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.