Présentation du Cloud Shell Azure (focus sur PowerShell !)
Lors de la dernière //BUILD, Microsoft a annoncé la sortie d’ « Azure Cloud Shell » une interface en ligne de commandes disponible directement au sein du portail Azure. Ce Shell est utilisable en Bash et PowerShell, dans cet article nous allons détailler le fonctionnement interne de ce nouveau Shell, en détaillant plus particulièrement les fonctionnalités PowerShell.
Les outils existants
Quand on utilise le cloud Microsoft Azure au quotidien, plusieurs outils sont disponibles pour créer et administrer ses ressources Azure. On distingue deux grandes catégories d’outils :
Les applications web:
Les deux premiers portails de la liste proposent des interfaces graphiques qui masquent les appels aux API de management Azure, au contraire le dernier cité est un portail technique qui expose la définition json des ressources Azure d’un abonnement.
Les outils en ligne de commande :
- Azure PowerShell
- Azure Cli (Node Js)
Les outils en lignes de commandes s’installent sur une machine cliente et doivent être mis à jour manuellement. Ils wrappent les appels aux API de management Azure, ils sont particulièrement utiles quand il est nécessaire de scripter des tâches d’administration complexes et / ou répétitives.
Le cloud Shell, un nouvel outil d’administration
Ce Shell in « browser » est un nouvel outil permettant d’administrer les ressources Azure, mais pas uniquement !
Un nouveau menu en haut à droit du portail Azure permet de l’ouvrir :
Fonctionnement
Le Shell utilise en interne Azure Container Service : Il se connecte à une machine virtuelle Azure qui va créer un conteneur. Le mode Bash se connecte à un conteneur Linux alors que le mode PowerShell se connecte à un conteneur Windows (Windows Server 2016).
L’utilisateur Azure est alors connecté à travers son cloud Shell à un conteneur distant dans lequel de nombreux outils et Framework sont préinstallés :
Conteneur Linux :
- Outils Azure : Azure CLI 1.0 et 2.0 / AzCopy / outil en ligne de commande pour Service Fabric
- Outils Linux : bash / sh / tmux / dig
- Editeurs : Vim / Nano / Emacs
- Base de données : clients MySql et PostgreSql / outils sql serveur (sqlcmd / mssql-scripter)
- Conteneurs : Docker / Helm / Kubectl
- Langages et Framework : .net (2.0) / Go (1.7) / Java (1.8) / NodeJS (6.9.4) / PowerShell (6.0) / Python (2.7 et 3.5)
- Autres : Terraform / Git / Npm
Conteneur Windows:
- Outils Azure : Azure PowerShell (version 4.4.1) et Azure CLI (2.0.20)
- Editeurs : Vim / Nano
- Base de données : outils sql serveurs (sqlcmd)
- Langages et framework : .net (4.6) / NodeJs (6.10) / PowerShell (5.1) / Python (2.7)
- Autres : Git / Npm
Conservation des données entre les sessions
Lors de la première utilisation du Shell, le portail demande l’autorisation de créer un compte de stockage*. A l’intérieur de ce dernier, un partage de fichier est monté. Ce même partage contient un blob qui fait office de disque de stockage de données. Ce disque est « monté » par les conteneurs pour être accessible depuis le Shell et permet donc de stocker durablement des fichiers, on parle alors de « Cloud Drive ».
Sous linux le « Cloud Drive » est monté dans un répertoire nommé « home » alors que sous Windows il est monté dans le répertoire C:\Users\ContainerAdministrator\CloudDrive et est accessible via une variable d’environnement nommée ($home) :
En PowerShell:
cd $home\clouddrive
En Bash:
cd home
* Le compte de stockage est nommé avec un Guid et est créé par défaut dans un groupe de ressource nommé « cloud-shell-{azureRegion} » (la région est attribuée automatiquement et la machine hébergeant le conteneur sera hébergée dans la même région, ce qui assure des performances optimales).
Un partage de fichier est créé par utilisateur de l’abonnement Azure et est nommé selon la nomenclature suivante : cs-{user}-{domain}-com-{id}. Ci-dessous une capture d’écran du groupe de ressources crée dans mon abonnement Azure :
Un des avantages majeur de ce disque partagé est qu’il est accessible entre les deux modes du Shell : Bash et Powershell ! :)
Coût
Simplement le prix du stockage. Les machines virtuelles et les conteneurs utilisés en arrière-plans sont gérés directement par Microsoft.
Les fonctionnalités PowerShell
1. Management de ressources Azure : Système de fichier et « Resource scoping »
Une fois le Shell PowerShell connecté au conteneur distant, il est par défaut placé dans un dossier lecteur nommé « Azure Drive » : (Azure : ) . Ce dernier permet de naviguer dans ses ressources Azure comme dans un système de fichier (ce système existe déjà de façon graphique dans https://resources.azure.com ! ). Les commandes Azure PowerShell étant disponibles, l’administration des ressources se fait alors rapidement et simplement.
Dans la capture d’écran suivante, je liste les abonnements disponibles via la commande dir puis je navigue dans cet abonnement comme si il s’agissait d’un système de fichiers :)
Une fois placé dans l’abonnement, il est possible de naviguer dans les ressources par groupe de ressources mais également par fournisseur de ressources.
Dans l’exemple suivant je liste tous les groupes de ressources de mon abonnement avant de me placer dans le groupe « blog-rg ». Une fois dans ce dernier, la commande dir liste non pas les ressources Azure présentes dans le groupe mais les types de ressources présentes dans le groupe. Je peux alors utiliser les commandes Azure PowerShell pour administrer mes ressources :
Dans la capture ci-dessus, on utilise la commande Get-AzureRmWebApp qui a pour objectif de lister toutes les applications web présentes dans un groupe de ressources, sa syntaxe est la suivante :
Get-AzureRmWebApp [[-ResourceGroupName] <String>] [[-Name] <String>] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
On remarque cependant qu’aucun paramètre n’est passé à la commande. Le paramètre –ResourceGroupName est automatiquement renseigné avec le nom du groupe de ressources utilisé dans le Shell, on parle alors de « Resource Group Scoping ».
L’utilisation des commandes Azure PowerShell est donc contextualisé avec l’état du Shell. Par exemple lorsque l’on navigue dans l’abonnement en utilisant les fournisseurs de ressources, la commande Get-AzureRmCommand renverra uniquement les commandes utilisables pour le fournisseur de ressources courant :
Dans l’exemple précédent je navigue dans mon abonnement en utilisant le fournisseur de ressources « WebApps » comme filtre. La commande Get-AzureRmCommand retourne alors uniquement les commandes Azure PowherShell permettant d’administrer les App Services Azure.
2. Installation de modules
L’ensemble des modules de la galerie PowerShell peuvent être installés durablement dans le Shell, ils seront accessibles pendant chaque session car ils sont installés par défaut dans le cloud drive !
3. Administration des machines virtuelles
Depuis le Shell, il est possible de *se connecter directement à une machine virtuelle Azure. Pour ce faire, il suffit de se placer au niveau de machine virtuelle dans l’arborescence PowerShell et d’utiliser la commande PowerShell Enter-AzureRmVm. Plus exactement, il faut utiliser la commande Get-Item couplée avec la commande Enter-AzureRmVm comme dans l’exemple ci-dessous :
Get-Item myVm | EnterAzureRmVm
Une fois cette commande utilisée, il est nécessaire de spécifier le nom d’utilisateur et le mot de passe permettant de se connecter à la machine virtuelle. Ne pas oublier de préfixer le nom d’utilisateur avec un \ sinon la connexion échouera ! (par exemple \tranise) :
Pour que la connexion distante fonctionne, il est nécessaire que PowerShell Remoting (WinRM) soit activé sur la machine cible. Activer cette fonctionnalité requiert deux étapes :
- Autoriser le trafic entrant vers la machine virtuelle sur le port 5985 (http) ou 5986 (https) : peut s’effectuer depuis le portail azure en ajoutant une règle d’accès entrante sur le groupe de sécurité configuré sur la vm (NSG).
- Configurer une règle de pare-feu à l’intérieur de l’OS : peut s’effectuer en se connectant en RDP sur la machine ou directement depuis le cloud Shell
De la même manière, la commande Inwoke-AzureRmVmCommand permet d’exécuter des commandes sur la machine distante !
Dans un prochain article nous verrons comment industrialiser des tâches d'administrations Azure en utilisant ce Cloud Shell PowerShell !
Happy coding :)
Commentaires