Exécuter des scripts Powershell depuis le Cloud Shell Azure

Dans mon dernier article nous avons découvert le nouveau Cloud Shell Azure et plus particulièrement les fonctionnalités PowerShell. Dans cet article, nous allons voir comment exécuter des scripts d’administration PowerShell depuis le cloud Shell.

Comme exemple, nous utiliserons une problématique simple mais récurrente ! La suppression des groupes de ressources vides.

 

Groupe de ressources Azure, avantages et inconvénients

Les groupes de ressources Azure sont des conteneurs logiques pour les ressources Azure. Ils sont particulièrement utiles pour les raisons suivantes :

  • Gestion du cycle de vie d’un ensemble de ressources
  • Vue du coût d’un ensemble de ressources
  • Administration d’autorisations RBAC au niveau du groupe de ressources

Dès lors qu’une nouvelle ressource Azure est créée, elle doit être placée dans un nouveau groupe de ressources ! C’est pourquoi le nombre de groupes de ressources augmente vite, et la suppression de ressources provoque l’existence de groupes de ressources vides ! Ces derniers sont inutiles et plus il y a de groupes de ressources plus l’expérience de recherche se voit dégradée.

La bonne pratique consiste donc à supprimer ces groupes de ressources vides ! C’est réalisable depuis le portail Azure, mais l’opération s’annonce longue et ennuyeuse... alors que quelques lignes de scripts (Powershell ou Azure CLI) suffisent :) 

 

Le script de suppression

Voici un exemple de script Azure Powershell qui permet de supprimer les groupes de ressources vides d’un abonnement :

Il comporte 4 étapes :

  1. Authentification à l’abonnement Azure (avec la commande Login-AzureRmAccount)
  2. Liste les groupes de ressource (avec la commande Get-AzureRmResourceGroup)
  3. Vérification pour chaque groupe de ressources s'il contient des ressources
  4. Propose à l’utilisateur de supprimer les groupes vides

 

$subscriptionId = ""

# 1.Authentication
Login-AzureRmAccount -SubscriptionId $subscriptionId

$emptyRgs = New-Object System.Collections.ArrayList

# 2. List all resource groups
$rgs = Get-AzureRmResourceGroup

# 3. Check empty resource groups
foreach($rg in $rgs)
{
  $resourcesCount = (Get-AzureRmResource | where {$_.ResourceGroupName –eq $rg.ResourceGroupName}).Count
   
  if ($resourcesCount -eq 0){
      Write-Output $rg.ResourceGroupName
      $emptyRgs.Add($rg.ResourceGroupName) > $null
   }
}

#4. Ask for permission to delete resource groups
if ($emptyRgs.Count -eq 0){
    Write-Output "There is no resource group emty :)"
}else{
    $choice = ""

    while ($choice -notmatch "[y|n]"){
     $choice = read-host "Do you want to delete empty resource groups ? (Y/N)"
    }

    if ($choice -eq "y"){   
        foreach($emptyRg in $emptyRgs){
            Remove-AzureRmResourceGroup -Name $emptyRg -Force > $null  
        }
    }
}

 

En l’état le script fonctionne parfaitement ! Cependant il est nécessaire d’installer sur sa machine Azure PowerShell. Pour pallier à cette obligation nous allons utiliser le Cloud Shell Azure où Azure PowerShell est préinstallé et prêt à l’emploi.

Dans un premier temps, nous allons placer le script de suppression dans le cloud drive pour qu’il soit accessible depuis le Cloud Shell Azure. Une fois dans le cloud drive, notre script n’a plus besoin de l’étape d’authentification puisque c’est le Cloud Shell qui est responsable de l’étape d’authentification, nous pouvons donc remplacer cette première étape :

 

Première étape originelle :

Première étape originelle : 
$subscriptionId = "”

# 1.Authentication
Login-AzureRmAccount -SubscriptionId $subscriptionId

 

Nouvelle première étape :

#1. Get current Azure Context
$context = Get-AzureRmContext

Write-Output "-- Clean script is working on subscription: "

$context.Subscription.SubscriptionId

 

Cette nouvelle étape nous donne maintenant des informations sur le contexte du Cloud Shell avec la commande Get-AzureRmContext.

 

Import du script dans le cloud drive

Le cloud drive est un partage de fichier disponible entre les sessions Azure Cloud Shell. Les hôtes Windows et Linux montent ce partage de fichier comme disque local au démarrage de la session. Concrètement ce partage de fichier est une « File share » Azure présent dans un compte de stockage. Pour placer notre script dans ce partage de fichier, il suffit donc de trouver le compte de stockage en question.

Le compte de stockage est automatiquement crée par Azure, son nom est préfixé par « cs », en effectuant une recherche dans la barre de recherche du portal azure on le trouve facilement :

storageaccount.png

file share.png

Une fois dans le compte de stockage, il est nécessaire de sélectionner le partage de fichier où nous voulons ajouter notre script. Il peut exister un partage de fichier par utilisateur de l’abonnement Azure. Dans mon abonnement, il n’en existe qu’un seul (le mien !) :

fs-detail.png

Dans le partage de fichier, il est possible d’ajouter des dossiers et des fichiers. Deux dossiers sont déjà présents (.cloudconsole and .pscloudshell). Nous créons donc un dossier “manage” dans lequel nous pouvons ajouter notre script :  

up.png

clean.png

 

Exécution du script depuis le Cloud Shell:

Le script de suppression est maintenant dans le cloud drive et donc accessible depuis le Cloud Shell. Pour exécuter le script, il est nécessaire d’ouvrir le Cloud Shell avec le mode PowerShell et de se placer dans le dossier « manage » que nous avons créé précédemment en utilisant les commandes cd et dir (pour apprendre à naviguer dans le cloud Shell, je vous renvoie vers cet article) :

1.shell.png

Une fois placé dans le dossier “manage”, il suffit d’exécuter le script “clean-rgs.ps1” pour voir s’afficher tous les groupes de ressource vide de l’abonnement courant* : 

2.shell.png

Le Shell est automatiquement connecté à un abonnement par défaut que nous pouvons connaître par l’intermédiaire de la commande Get-AzureRmContext :

3.Shell.png

Pour changer l’abonnement sur lequel le Shell est “connecté” il faut combiner l’utilisation des commandes Get-AzureRmSubscription et Select-AzureRmSubscription !

Happy coding :) 

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus