Introduction aux groupes de management Azure
Lors du dernier évènement Microsoft Ignite, deux nouveaux services Azure ont été annoncés : Azure Management Group et Azure BluePrint. Dans cet article, nous allons découvrir comment les groupes de management vont faciliter l’administration des abonnements Azure et comment ce service est lié à Azure BluePrint.
Qu’est-ce qu’un groupe de management ?
Un groupe de management est conteneur d’abonnements Azure. L’objectif de ces groupes est d’organiser les abonnements Azure sous la forme d’un arbre hiérarchique. Tous les types d’abonnements (Enterprise Agreement, Pay-as-you-go, MSDN…) peuvent être placés dans un groupe.
Les rôles RBAC et les policies peuvent être définis au niveau du groupe de management, ainsi l’ensemble des abonnements du groupe hérite de ces derniers. Actuellement, on peut administrer ces groupes depuis le portail Azure, mais également avec Azure Powershell.
Groupe "root"
Un groupe de management parent (« root ») est créé par défaut au niveau de tenant Azure. Il contient d’ailleurs l’identifiant du tenant dans son nom « Tenant root group (AzureTenantId) ». Ce dernier ne peut pas être déplacé, ni supprimé. Les administrateurs globaux ont la possibilité de définir des rôles RBAC et des policies au niveau du groupe root.
Comment ces groupes vont-ils nous aider ?
Travailler au quotidien avec de nombreux abonnements Azure peut rapidement devenir chronophage. Il n’est pas rare que plusieurs abonnements partagent la même configuration, notamment au niveau des rôles RBAC et des policies. La mise à jour d’un role ou d’une policy doit donc être répliquée sur l’ensemble des abonnements impactés, c’est une tâche plutôt longue et pénible en utilisant le portail Azure, l'utilisation d'un ou plusieurs scripts peut cependant faire gagner du temps. Les groupes de management encore plus !
Ils permettent :
- De préconfigurer les rôles RBAC et les policies au niveau du groupe. Ces derniers seront appliqués sur les abonnements du groupe.
- D’avoir une vue du cout global d’un groupe (fonctionne uniquement pour les abonnements EA en preview)
Exemple concret
J’ai l’habitude d’ajouter un code (par exemple un trigame) dans le nom des abonnements Azure qui ont un lien entre eux. Cela permet de facilement identifier les abonnements qui partagent les mêmes caractéristiques, notamment en termes de droits d’accès RBAC et de policies.
Dans mon exemple, je travaille avec 5 abonnements qui contiennent le mot « box » :
- ***box 1 (data)
- ***box 2 (web)
- ***box 3 (search)
- ***box 4 (auth data)
- ***box 5 (mail, build)
Ces abonnements sont utilisés par les mêmes utilisateurs, et des restrictions au niveau des ressources Azure (policies) sont définies pour restreindre les ressources Azure déployables dans chaque abonnement : certains abonnements contiennent uniquement des ressources web et d’autres des ressources Data.
Puisqu’ils contiennent tous le mot « box » dans leur nom, nous pouvons créer un script qui va ajouter chaque abonnement dans un groupe de management commun.
Le module Powershell AzureRm.ManagementGroup est actuellement en Preview, nous pouvons le télécharger avec la ligne de commande suivante :
Install-Module -Name AzureRM.ManagementGroups –AllowPrerelease
Le script ci-dessous va s’exécuter en effectuant les étapes suivantes :
- Authentification à Azure
- Récupération d’une liste des abonnements Azure
- Recherche des abonnements possédant le mot clef “box”
- Création d’un groupe de management Azure
- Ajout des abonnements concernés dans le nouveau groupe de management
Login-AzureRmAccount $nameKey = "box" $groupKey = "box" $subscriptions = Get-AzureRmSubscription $subscriptionsToGather = $subscriptions | Where-Object {$_.Name -like "*" + $nameKey + "*"} if ($subscriptionsToGather.Count -gt 0){ Write-Host $($subscriptionsToGather.Count) "subscriptions are going to be moved in a management group named " $nameKey $azRmMG = New-AzureRmManagementGroup -GroupName $groupKey -DisplayName $nameKey foreach($sub in $subscriptionsToGather){ Write-Host $($sub.Name) " is being moved..." New-AzureRmManagementGroupSubscription -GroupName $azRmMG.Name -SubscriptionId $sub.Id } }
Dans le script, on remarque qu’un groupe de management est défini par un « GroupName » et un « DisplayName ». Le « groupName » correspond à l’identifiant du groupe, ce dernier doit être unique, il n’est pas modifiable et ne peut pas contenir d’espaces.
Nous utilisons deux cmdlets mis à disposition par le module AzureRM.Management :
- New-AzureRmManagementGroup : Permet de créer un groupe de management en spécifiant un identifiant unique (« groupName ») et un nom d’affichage (« DisplayName »).
- New-AzureRmManagementGroupSubscription : Permet de placer un abonnement Azure dans un groupe de management en spécifiant l’identifiant de l’abonnement et le nom du groupe cible.
Voici une capture d’écran du groupe de management créé avec le script :
Aller plus loin dans l’administration des abonnements avec Azure BluePrint
Les groupes de management Azure sont particulièrement pratiques pour définir des roles RBACS et les policies à un niveau supérieur de celui des abonnements. Cependant, ils ne nous permettent pas de créer automatiquement des ressources Azure dans leurs abonnements enfants. Pour cela, il existe maintenant un service nommé Azure BluePrint. Ce service permet de définir dans un package un ensemble d’artéfacts de configuration applicables sur les abonnements enfants d’un groupe de management. Ce package d’artefact est stocké et versionné au niveau du groupe de management.
Un package “Blueprint” peut contenir les types d’artéfacts suivants :
- RBAC roles
- Azure Policies
- Resource Groups
- ARM templates
Azure Management Groups et Azure BluePrint sont des services « liés » car c’est au niveau du groupe de management que l’on va pouvoir définir une bibliothèque de packages Blueprint. Malheureusement, il n’existe pas encore de package Powershell pour jouer avec les packages BluePrint. Pour les plus courageux, il est possible d’attaquer les API Rest ! Afin de ne pas répéter la documentation je vous laisse la découvrir par vous-même !
Happy coding :)
Commentaires