Automatisez vos connexions à Azure
Introduction
Si tout comme moi vous passez votre temps à jongler entre les tenants Azure de vos différents clients et à switcher de souscription en souscription, si comme moi vous êtes devenu allergique à la commande Add-AzureRmAccount alors cette commande va tout changer !
Il s’agit de la commande Import-AzureRmContext, celle ci charge les informations d’authentification à partir d’un fichier pour définir l’environnement et le contexte Azure via un fichier JSON que vous aurez au préalable créé via la commande Save-AzureRmContext et ainsi vous permettra d’automatiser vos connexions à Azure de manière simple !
Détails
Voyons voir comment cela fonctionne dans la pratique :
1 |
PS C:\Scripts> Save-AzureRmContext -Profile (Add-AzureRmAccount) -Path "D:\Azure\Profiles\GENEZIIS.json" |
On entre nos credentials :
On vérifie le contexte via la commande Get-AzureRmContext :
1 2 3 4 5 6 7 |
PS C:\Scripts> Get-AzureRmContext Name : [yoann.guillo@geneziis.com] Account : yoann.guillo@geneziis.com SubscriptionName : GENEZIIS TenantId : 1234567-xxxx-xxxx-xxxx-123456789abc Environment : AzureCloud |
Nous venons donc d’exporter nos informations d’identification relative à la souscription “GENEZIIS” sous “D:\Azure\Profiles\GENEZIIS.json”
Désormais on va pouvoir fermer la session PowerShell actuelle puis jouer la commande suivante afin de réimporter nos informations d’authentification sans avoir à ré-entrer nos credentials :
1 2 3 4 5 6 7 |
PS C:\Scripts> Import-AzureRmContext -Path "D:\Azure\Profiles\GENEZIIS.json" Account : yoann.guillo@geneziis.com SubscriptionName : GENEZIIS SubscriptionId : 1234567-xxxx-xxxx-xxxx-123456789abc TenantId : 1234567-xxxx-xxxx-xxxx-123456789abc Environment : AzureCloud |
Mise en oeuvre
Maintenant comment faire encore plus rapide ?
C’est simple on va se créer une fonction que l’on va charger au sein de notre profil PowerShell afin de l’appeler via la simple commande “azure”
Pour cela j’utilise les fonctions suivantes qui me permettent de :
- Lister l’ensemble des fichiers JSON représentants mes différents profils de connexion au sein d’un path que j’aurai spécifié
- Charger un de ces fichiers JSON
- Lister l’ensemble des souscriptions auxquels j’ai accès via ces credentials
- Checker si les informations d’identification ont expirées
- Renouveler les informations d’identification si expiré
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
Function New-ARMProfile { [CmdletBinding()] Param ( [parameter(Mandatory=$true)] [ValidateScript({Test-Path $_ -PathType ‘€™})] [String] $Path, [parameter(Mandatory=$true)] [String] $ProfileName ) Try { #Connect to Azure Login-AzureRmAccount | Out-Null #Save profile Save-AzureRmContext -Path $Path\$ProfileName.json } Catch { Write-Host -ForegroundColor Red ("-"*(($(((Get-Host).UI.RawUI).BufferSize).Width)-1)) Write-Host -ForegroundColor Red "Script file : $($_.InvocationInfo.ScriptName)" Write-Host -ForegroundColor Red "Line : `[$($_.InvocationInfo.ScriptLineNumber)`] $($_.InvocationInfo.Line)" -NoNewline Write-Host -ForegroundColor Red "Command : $($_.InvocationInfo.MyCommand)" Write-Host -ForegroundColor Red ("-"*(($(((Get-Host).UI.RawUI).BufferSize).Width)-1)) Write-Host -ForegroundColor Red "Error Details : $($_)" Write-Host -ForegroundColor Red ("-"*(($(((Get-Host).UI.RawUI).BufferSize).Width)-1)) } } Function Select-ARMProfile { [CmdletBinding()] Param ( [parameter(Mandatory=$true)] [ValidateScript({Test-Path $_ -PathType ‘€™})] [String] $Path ) Try { $ErrorActionPreference = "Stop" #Get the json files $Items = Get-ChildItem -Path $Path -Filter '*.json' -File #If empty, ask to create a new one If (!$Items) { Write-Host -ForegroundColor Red "Any profile found in the path $Path !" Do { Write-Host -ForegroundColor Red "Would you like to create a profile ? Y/N" $RenewToken = Read-Host } While ($RenewToken -notmatch "[YN]") #Create a new profile If ($RenewToken -match "Y") { #Enter a profile name $ProfileName = Read-Host -Prompt "Enter a profile name" #Create a new profile New-ARMProfile -Path $Path -ProfileName $ProfileName #Import it Import-ARMProfile -Path $Path #Check the context loaded $Context = Get-AzureRmContext #Display the context Write-Host "Connected on" $Context.Subscription.Name "with" $Context.Account.Id -ForegroundColor Green } Else { Write-Host -ForegroundColor Red "Please provide a path with valid profile !" Return } } Else { #Display all files in a Grid view $Item = $Items.basename | Out-GridView -OutputMode Single #Select profile to load $File = Get-ChildItem -Path $Path | Where-Object -Property BaseName -eq $Item #Load the selected profile Import-AzureRmContext -Path $File.FullName | Out-Null Write-Host "Successfully logged in using saved profile: $Item" -ForegroundColor Green          #List all subscriptions associated to our profile $Subscription = Get-AzureRmSubscription | Out-GridView -OutputMode Single Select-AzureRmSubscription -SubscriptionName $Subscription.Name | Out-Null #Check if credentials are still valid Try { $Result = Find-AzureRmResource -ResourceType Microsoft -ErrorAction Stop } Catch [System.ArgumentException] { #If not, ask to renew the profile If ($_.Exception.Message -eq "Your Azure credentials have not been set up or have expired, please run Add-AzureAccount to set up your Azure credentials.") { Do { Write-Host -ForegroundColor Red "Token expired, would you like to renew this token ? Y/N" $RenewToken = Read-Host } While ($RenewToken -notmatch "[YN]") If ($RenewToken -match "Y") { New-ARMProfile -Path $Path -ProfileName $Item Import-ARMProfile -Path $Path } Else { Write-Host -ForegroundColor Red "Token expired, please regenerate your profile !" Return } } Else { Write-Host $_.Exception.Message } } #Check the context loaded $Context = Get-AzureRmContext #Display the context Write-Host "Connected on" $Context.Subscription.Name "with" $Context.Account.Id -ForegroundColor Green } } Catch { Write-Host -ForegroundColor Red ("-"*(($(((Get-Host).UI.RawUI).BufferSize).Width)-1)) Write-Host -ForegroundColor Red "Script file : $($_.InvocationInfo.ScriptName)" Write-Host -ForegroundColor Red "Line : `[$($_.InvocationInfo.ScriptLineNumber)`] $($_.InvocationInfo.Line)" -NoNewline Write-Host -ForegroundColor Red "Command : $($_.InvocationInfo.MyCommand)" Write-Host -ForegroundColor Red ("-"*(($(((Get-Host).UI.RawUI).BufferSize).Width)-1)) Write-Host -ForegroundColor Red "Error Details : $($_)" Write-Host -ForegroundColor Red ("-"*(($(((Get-Host).UI.RawUI).BufferSize).Width)-1)) } } |
On va vérifier où se trouve notre profil PowerShell :
1 2 3 |
PS C:\Scripts> $PROFILE.CurrentUserAllHosts D:\OneDrive\Documents\WindowsPowerShell\profile.ps1 |
On va créer un dossier “AzureProfile” qui servira à héberger nos profils Azure (fichiers JSON) à la racine de notre profil PowerShell (ici : “D:\OneDrive\Documents\WindowsPowerShell\”) :
Puis on va déposer notre fonction dans le répertoire modules :
On va ensuite modifier notre profil afin de faire appel à notre fonction via un simple alias “Azure”
Pour cela on édite notre profile.ps1 :
1 2 3 |
Import-Module "$psscriptroot\Modules\Select-ARMProfile.psm1" | Out-Null Function Azure {Select-ARMProfile -Path "$psscriptroot\AzureProfile"} |
Conclusion
Désormais il ne nous reste plus qu’à entrer “azure” au sein d’une console PowerShell pour automatiquement appeler notre fonction de chargement automatique de notre profil !