Avec PowerShell, les ingénieurs et les administrateurs IT automatisent avec succès diverses tâches non seulement avec des infrastructures sur site, mais aussi avec des infrastructures cloud, notamment avec Azure. Travailler à travers PowerShell est dans certains cas beaucoup plus pratique et rapide que via le portail Azure. Grâce à la compatibilité multiplateforme, PowerShell peut être utilisé sur n'importe quel système d'exploitation.
Peu importe que vous travailliez avec Ubuntu, Red Hat ou Windows, PowerShell vous aidera à gérer les ressources cloud. En utilisant le module , par exemple, vous pouvez définir n'importe quelles propriétés des machines virtuelles.
Dans cet article, nous allons examiner comment utiliser PowerShell pour redimensionner une VM dans le cloud Azure, ainsi que pour supprimer une VM et les objets associés.

Attention ! N'oubliez pas de vous désinfecter les mains avant de commencer à travailler :
- Vous aurez besoin du module Azure PowerShell Module — que vous pouvez télécharger depuis PowerShell Gallery avec la commande
Install-Module Az. - Vous devez vous authentifier dans le cloud Azure où la machine virtuelle est exécutée, en exécutant la commande
Connect-AzAccount.
Pour commencer, créons un script qui redimensionne une VM Azure. Ouvrez VS Code et enregistrez un nouveau script PowerShell sous le nom Resize-AzVirtualMachine.ps1 — nous allons y ajouter des morceaux de code au cours de cet exemple.
Demandons les tailles de VM disponibles.
Avant de redimensionner la VM, il faut connaître les tailles autorisées pour les machines virtuelles dans le cloud Azure. Pour cela, exécutez la commande Get-AzVMSize.
Ainsi, pour la machine virtuelle devvm01 dans le groupe de ressources dev nous demandons toutes les tailles autorisées :
Get-AzVMSize -ResourceGroupName dev -VMName devvm01(Dans des tâches réelles, bien sûr, à la place de ResourceGroupName=dev et VMName=devvm01 vous spécifierez vos propres valeurs pour ces paramètres.)
La commande renverra une liste comme celle-ci :

Ce sont toutes les tailles possibles qui peuvent être définies pour cette machine virtuelle.
Redimensionnons la machine.
Pour cet exemple, nous allons redimensionner vers une nouvelle taille Standard_B1ls — qui est en première position dans la liste ci-dessus. (Dans des tâches réelles, bien sûr, vous choisirez n'importe quelle taille dont vous avez besoin.)
- Tout d'abord, à l'aide de la commande
Get-AzVMnous obtenons des informations sur notre objet (la machine virtuelle), en les sauvegardant dans une variable$virtualMachine:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 - Ensuite, nous prenons la propriété de cet objet
.HardwareProfile.VmSizeet définissons la nouvelle valeur souhaitée :$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls" - Et maintenant, il suffit d'exécuter la commande de mise à jour de la VM —
Update-AzVm:Update-AzVM -VM devvm01 -ResourceGroupName dev - Nous nous assurons que tout s'est bien passé — pour cela, nous demandons à nouveau des informations sur notre objet et regardons la propriété
$virtualMachine.HardwareProfile:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 $virtualMachine.HardwareProfile
Si nous voyons cela Standard_B1ls — cela signifie que tout est en ordre, la taille de la machine a été modifiée. Nous pouvons aller plus loin et prolonger le succès — redimensionner plusieurs VM à la fois en utilisant un tableau.
Et qu'en est-il de la suppression des VM dans Azure ?
La suppression n'est pas aussi simple et directe qu'il peut sembler. En effet, il faut aussi supprimer plusieurs ressources associées à cette machine, notamment :
- Les conteneurs de stockage pour le diagnostic de démarrage (Boot diagnostics storage containers)
- Interfaces réseau
- Les adresses IP publiques
- Le disque système et le blob où son statut est stocké
- Les disques de données (data disks)
C'est pourquoi nous allons créer une fonction que nous appellerons Remove-AzrVirtualMachine — et elle supprimera non seulement la VM Azure, mais aussi tout ce qui a été mentionné ci-dessus.
Nous suivons la voie standard et obtenons d'abord notre objet (VM) avec la commande Get-AzVm. Prenons par exemple cette machine WINSRV19 dans le groupe de ressources MyTestVMs.
Nous allons sauvegarder cet objet avec toutes ses propriétés dans une variable $vm:
$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMsNous supprimons le conteneur avec les fichiers de diagnostic de démarrage
Lors de la création de la VM dans Azure, l'utilisateur est également invité à créer un conteneur pour le stockage de diagnostics de démarrage afin de pouvoir l'utiliser pour le dépannage en cas de problèmes de démarrage. Cependant, lors de la suppression de la VM, ce conteneur reste pour continuer son existence désormais sans but. Corrigeons cette situation.
- Tout d'abord, découvrons à quel compte de stockage appartient ce conteneur — pour cela, nous devons trouver la propriété
storageUridans les entrailles de l'objetDiagnosticsProfilede notre VM. Pour cela, j'utilise la regex suivante :$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value - Maintenant, nous devons connaître le nom du conteneur, et pour cela, nous devons obtenir l'ID de la VM à l'aide de la commande
Get-AzResource:if ($vm.Name.Length -gt 9) { $i = 9 } else { $i = $vm.Name.Length - 1 } $azResourceParams = @{ 'ResourceName' = WINSRV 'ResourceType' = 'Microsoft.Compute\/virtualMachines' 'ResourceGroupName' = MyTestVMs } $vmResource = Get-AzResource @azResourceParams $vmId = $vmResource.Properties.VmId $diagContainerName = ('bootdiagnostics-{0}-{1}' -f $vm.Name.ToLower().Substring(0, $i), $vmId) - Ensuite, nous obtenons le nom du groupe de ressources auquel appartient le conteneur :
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName - Et maintenant, nous avons tout ce qu'il faut pour supprimer le conteneur avec la commande
Remove-AzStorageContainer:$saParams = @{ 'ResourceGroupName' = $diagSaRg 'Name' = $diagSa } Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force
Supprimons la VM
Nous allons maintenant supprimer la machine virtuelle elle-même, car nous avons déjà créé une variable $vm pour l'objet correspondant. Allons-y, exécutons la commande Remove-AzVm:
$null = $vm | Remove-AzVM -ForceSupprimons l'interface réseau et l'adresse IP publique
Notre VM a une (ou plusieurs) interfaces réseau (NICs) — pour les supprimer, parcourons la propriété NetworkInterfaces de notre objet VM et supprimons le NIC avec la commande Remove-AzNetworkInterface. Au cas où il y aurait plusieurs interfaces réseau, nous utiliserons une boucle. En même temps, pour chaque NIC, vérifions la propriété IpConfiguration pour voir s'il y a une adresse IP publique. Si c'est le cas, nous la supprimerons avec la commande Remove-AzPublicIpAddress.
Voici un exemple de code où nous parcourons toutes les NICs, les supprimons et vérifions s'il existe une adresse IP publique. Si c'est le cas, nous analysons la propriété PublicIpAddress, récupérons le nom de la ressource correspondante par ID et la supprimerons :
foreach($nicUri in $vm.NetworkProfile.NetworkInterfaces.Id) {
$nic = Get-AzNetworkInterface -ResourceGroupName $vm.ResourceGroupName -Name $nicUri.Split('\/')[-1]
Remove-AzNetworkInterface -Name $nic.Name -ResourceGroupName $vm.ResourceGroupName -Force
foreach($ipConfig in $nic.IpConfigurations) {
if($ipConfig.PublicIpAddress -ne $null) {
Remove-AzPublicIpAddress -ResourceGroupName $vm.ResourceGroupName -Name $ipConfig.PublicIpAddress.Id.Split('\/')[-1] -Force
}
}
}
Supprimons le disque système
Le disque OS est un blob, pour le supprimer, il y a une commande Remove-AzStorageBlob — mais avant d'exécuter celle-ci, il faudra définir les valeurs requises pour ses paramètres. En particulier, il faut obtenir le nom du conteneur de stockage contenant le disque système, puis le transmettre à cette commande avec le compte de stockage correspondant.
$osDiskUri = $vm.StorageProfile.OSDisk.Vhd.Uri
$osDiskContainerName = $osDiskUri.Split('\/')[-2]
$osDiskStorageAcct = Get-AzStorageAccount | where { $_.StorageAccountName -eq $osDiskUri.Split('\/')[2].Split('.')[0] }
$osDiskStorageAcct | Remove-AzStorageBlob -Container $osDiskContainerName -Blob $osDiskUri.Split('\/')[-1]
Supprimons le blob de statut du disque système
Pour cela, comme vous l'avez probablement deviné, nous prenons le conteneur de stockage où se trouve ce disque et, en supposant que le blob se termine par statut, nous passons les paramètres correspondants à la commande de suppression Remove-AzStorageBlob:
$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlobEt enfin, supprimons les disques de données
Notre VM pouvait avoir des disques de données qui y étaient attachés. S'ils ne sont pas nécessaires, supprimons-les aussi. Commençons par analyser StorageProfile de notre VM et trouvons la propriété Uri. S'il y a plusieurs disques, organisons une boucle sur URI. Pour chaque URI, trouvons le compte de stockage correspondant avec Get-AzStorageAccount. Ensuite, analysons l'URI de stockage pour extraire le nom du blob nécessaire et le transmettre à la commande de suppression Remove-AzStorageBlob avec le compte de stockage. Voici à quoi cela ressemblera dans le code :
if ($vm.DataDiskNames.Count -gt 0) {
foreach ($uri in $vm.StorageProfile.DataDisks.Vhd.Uri) {
$dataDiskStorageAcct = Get-AzStorageAccount -Name $uri.Split('\/')[2].Split('.')[0]
$dataDiskStorageAcct | Remove-AzStorageBlob -Container $uri.Split('\/')[-2] -Blob $uri.Split('\/')[-1]
}
}
Et voilà, nous sommes arrivés au « happy end ! » Maintenant, nous devons rassembler tout cela en un tout cohérent. Le bon auteur Adam Bertram a pris l'initiative d'aider les utilisateurs et l'a fait lui-même. Voici un lien vers le script final appelé Remove-AzrVirtualMachine.ps1:
→
J'espère que ces conseils pratiques vous aideront à économiser de l'énergie, du temps et des ressources lorsque vous travaillez avec les VM Azure.
Source : habr.com
