Modification et suppression de machines virtuelles Azure à l'aide de PowerShell

Grâce à PowerShell, les ingénieurs et les administrateurs informatiques automatisent avec succès diverses tâches lorsqu'ils travaillent non seulement sur site, mais également avec des infrastructures cloud, en particulier avec Azure. Dans certains cas, travailler via PowerShell est beaucoup plus pratique et plus rapide que travailler via le portail Azure. Grâce à sa nature multiplateforme, PowerShell peut être utilisé sur n’importe quel système d’exploitation.

Que vous utilisiez Ubuntu, Red Hat ou Windows, PowerShell peut vous aider à contrôler vos ressources cloud. Utilisation du module Azur PowerShell, par exemple, vous pouvez définir n'importe quelle propriété des machines virtuelles.

Dans cet article, nous verrons comment utiliser PowerShell pour redimensionner une machine virtuelle dans le cloud Azure, ainsi que supprimer une machine virtuelle et ses objets associés.

Modification et suppression de machines virtuelles Azure à l'aide de PowerShell

Important! N'oubliez pas de vous essuyer les mains avec du désinfectant pour vous préparer au travail :

  • Vous aurez besoin d'un module Module Azure PowerShell - il peut être téléchargé depuis PowerShell Gallery avec la commande Install-Module Az.
  • Vous devez vous authentifier dans le cloud Azure où la machine virtuelle s'exécute en exécutant la commande Connect-AzAccount.

Commençons par créer un script qui redimensionnera une machine virtuelle Azure. Ouvrons VS Code et enregistrons un nouveau script PowerShell appelé Redimensionner-AzVirtualMachine.ps1 — nous y ajouterons des morceaux de code au fur et à mesure de la progression de l'exemple.

Nous demandons les tailles de VM disponibles

Avant de modifier la taille de la machine virtuelle, vous devez connaître les tailles acceptables pour les machines virtuelles dans le cloud Azure. Pour ce faire, vous devez exécuter la commande Get-AzVMSize.

Donc pour la machine virtuelle devvm01 du groupe de ressources dev Nous demandons toutes les tailles acceptables possibles :

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(Dans les vrais problèmes, bien sûr, au lieu de NomGroupeRessource=dev и Nom de la machine virtuelle = devvm01 vous spécifierez vos propres valeurs pour ces paramètres.)

La commande renverra quelque chose comme ceci :

Modification et suppression de machines virtuelles Azure à l'aide de PowerShell

Ce sont toutes des options de taille possibles qui peuvent être définies pour une machine virtuelle donnée.

Redimensionnons la voiture

Par exemple, nous redimensionnerons à une nouvelle taille Norme_B1ls - il est en première place sur la liste ci-dessus. (Dans les applications réelles, bien sûr, vous choisissez la taille dont vous avez besoin.)

  1. En utilisant d'abord la commande Get-AzVM nous obtenons des informations sur notre objet (machine virtuelle) en le stockant dans une variable $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Ensuite, nous prenons la propriété de cet objet .HardwareProfile.VmSize et définissez la nouvelle valeur souhaitée :
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Et maintenant, nous exécutons simplement la commande VM update - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Nous nous assurons que tout s'est bien passé - pour ce faire, nous demandons à nouveau des informations sur notre objet et examinons la propriété $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Si on y voit Norme_B1ls - ça veut dire que tout est en ordre, la taille de la voiture a été modifiée. Vous pouvez aller plus loin et bâtir sur votre réussite en redimensionnant plusieurs VM à la fois à l’aide d’un tableau.

Qu’en est-il de la suppression d’une VM dans Azure ?

Avec la suppression, tout n'est pas aussi simple et direct qu'il y paraît. Après tout, il est nécessaire de supprimer un certain nombre de ressources associées à cette machine, notamment :

  • Conteneurs de stockage des diagnostics de démarrage
  • Interfaces réseau
  • Adresses IP publiques
  • Disque système et blob où son état est stocké
  • Disques de données

Par conséquent, nous allons créer une fonction et l’appeler Remove-AzrVirtualMachine - et cela supprimera non seulement la machine virtuelle Azure, mais également tout ce qui précède.

Nous suivons la voie standard et récupérons d'abord notre objet (VM) à l'aide de la commande Get-AzVm. Par exemple, que ce soit une voiture GAGNERV19 du groupe de ressources MesVM de test.

Sauvons cet objet avec toutes ses propriétés dans une variable $vm:

$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMs

Suppression du conteneur avec les fichiers de diagnostic de démarrage

Lors de la création d'une machine virtuelle dans Azure, l'utilisateur est également invité à créer un conteneur pour stocker les diagnostics de démarrage (conteneur de diagnostics de démarrage), de sorte qu'en cas de problèmes de démarrage, il y ait quelque chose vers lequel se tourner pour le dépannage. Cependant, lorsque la VM est supprimée, ce conteneur continue son existence désormais inutile. Réparons cette situation.

  1. Tout d'abord, découvrons à quel compte de stockage appartient ce conteneur - pour cela, nous devons trouver la propriété storageUri dans les entrailles de l'objet DiagnosticsProfile notre VM. Pour cela j'utilise cette expression régulière :
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Vous devez maintenant connaître le nom du conteneur, et pour cela, vous devez 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)
    
  3. Ensuite, nous obtenons le nom du groupe de ressources auquel appartient le conteneur :
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. Et maintenant nous avons tout ce dont nous avons besoin 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

Supprimer la VM

Supprimons maintenant la machine virtuelle elle-même, puisque nous avons déjà créé une variable $vm pour l'objet correspondant. Eh bien, exécutons la commande Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Suppression de l'interface réseau et de l'adresse IP publique

Notre VM possède toujours une (voire plusieurs) interfaces réseau (NIC) - pour les supprimer car inutiles, passons en revue la propriété NetworkInterfaces notre objet VM et supprimez la carte réseau avec la commande Remove-AzNetworkInterface. S'il existe plusieurs interfaces réseau, nous utilisons une boucle. En même temps, pour chaque NIC, nous vérifierons la propriété IpConfiguration pour déterminer si l'interface possède une adresse IP publique. Si on en trouve un, nous le supprimerons avec la commande Remove-AzPublicIpAddress.

Voici un exemple d'un tel code, dans lequel nous examinons toutes les cartes réseau en boucle, les supprimons et vérifions s'il existe une adresse IP publique. Si tel est le cas, analysez la propriété PublicIpAddress, recherchez le nom de la ressource correspondante par ID et supprimez-la :


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
        }
    }
}

Retrait du disque système

Le disque du système d'exploitation est un blob, pour lequel il existe une commande pour le supprimer Remove-AzStorageBlob - mais avant de l'exécuter, vous devrez définir les valeurs requises pour ses paramètres. Pour ce faire, vous devez notamment 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]

Suppression du blob d'état du disque système

Pour ce faire, comme vous l'avez probablement déjà deviné, nous prenons le conteneur de stockage dans lequel ce disque est stocké et, ce qui implique que le blob à la fin contient status, passez les paramètres correspondants à la commande delete Remove-AzStorageBlob:

$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlob

Et enfin, on supprime les disques de données

Notre VM pourrait toujours avoir des disques avec des données qui y étaient attachées. S'ils ne sont pas nécessaires, nous les supprimerons également. Analysons-le d'abord StorageProfile notre VM et trouver la propriété Uri. S'il y a plusieurs disques, on organise un cycle selon URI. Pour chaque URI, nous trouverons le compte de stockage correspondant en utilisant Get-AzStorageAccount. Analysez ensuite l'URI de stockage pour extraire le nom du blob souhaité et transmettez-le à la commande delete Remove-AzStorageBlob avec un compte de stockage. Voici à quoi cela ressemblerait 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 maintenant « nous avons atteint la fin heureuse ! » Il nous faut maintenant assembler un tout unique à partir de tous ces fragments. L'aimable auteur Adam Bertram a rencontré les utilisateurs à mi-chemin et l'a fait lui-même. Voici un lien vers le script final appelé Supprimer-AzrVirtualMachine.ps1:

GitHub

J’espère que ces conseils pratiques vous seront utiles pour économiser des efforts, du temps et de l’argent lorsque vous travaillez avec des machines virtuelles Azure.

Source: habr.com

Ajouter un commentaire