Τροποποίηση και διαγραφή Azure VM χρησιμοποιώντας το PowerShell

Χρησιμοποιώντας το PowerShell, οι μηχανικοί και οι διαχειριστές IT αυτοματοποιούν με επιτυχία διάφορες εργασίες όταν εργάζονται όχι μόνο με εσωτερική εγκατάσταση, αλλά και με υποδομές cloud, ιδιαίτερα με το Azure. Σε ορισμένες περιπτώσεις, η εργασία μέσω του PowerShell είναι πολύ πιο βολική και ταχύτερη από την εργασία μέσω της πύλης Azure. Χάρη στη διαπλατφορμική φύση του, το PowerShell μπορεί να χρησιμοποιηθεί σε οποιοδήποτε λειτουργικό σύστημα.

Είτε χρησιμοποιείτε Ubuntu, Red Hat ή Windows, το PowerShell μπορεί να σας βοηθήσει να ελέγξετε τους πόρους σας στο cloud. Χρησιμοποιώντας τη μονάδα Azure PowerShell, για παράδειγμα, μπορείτε να ορίσετε οποιεσδήποτε ιδιότητες εικονικών μηχανών.

Σε αυτό το άρθρο, θα δούμε πώς μπορείτε να χρησιμοποιήσετε το PowerShell για να αλλάξετε το μέγεθος μιας εικονικής μηχανής στο σύννεφο Azure, καθώς και να διαγράψετε μια εικονική μηχανή και τα συσχετιζόμενα αντικείμενά της.

Τροποποίηση και διαγραφή Azure VM χρησιμοποιώντας το PowerShell

Σημαντικό! Μην ξεχάσετε να σκουπίσετε τα χέρια σας με απολυμαντικό για να προετοιμαστείτε για τη δουλειά:

  • Θα χρειαστείτε μια ενότητα Μονάδα Azure PowerShell - μπορεί να γίνει λήψη από το PowerShell Gallery με την εντολή Install-Module Az.
  • Πρέπει να κάνετε έλεγχο ταυτότητας στο σύννεφο Azure όπου εκτελείται η εικονική μηχανή εκτελώντας την εντολή Connect-AzAccount.

Αρχικά, ας δημιουργήσουμε ένα σενάριο που θα αλλάξει το μέγεθος ενός Azure VM. Ας ανοίξουμε το VS Code και ας αποθηκεύσουμε ένα νέο σενάριο PowerShell που ονομάζεται Αλλαγή μεγέθους-AzVirtualMachine.ps1 — θα προσθέσουμε κομμάτια κώδικα σε αυτό καθώς προχωρά το παράδειγμα.

Ζητάμε τα διαθέσιμα μεγέθη VM

Πριν αλλάξετε το μέγεθος VM, πρέπει να μάθετε ποια είναι τα αποδεκτά μεγέθη για εικονικές μηχανές στο σύννεφο Azure. Για να γίνει αυτό πρέπει να εκτελέσετε την εντολή Get-AzVMSize.

Έτσι για την εικονική μηχανή devvm01 από την ομάδα πόρων dev Ζητάμε όλα τα πιθανά αποδεκτά μεγέθη:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(Σε πραγματικά προβλήματα, φυσικά, αντί για ResourceGroupName=dev и VMName=devvm01 θα καθορίσετε τις δικές σας τιμές για αυτές τις παραμέτρους.)

Η εντολή θα επιστρέψει κάπως έτσι:

Τροποποίηση και διαγραφή Azure VM χρησιμοποιώντας το PowerShell

Αυτές είναι όλες οι πιθανές επιλογές μεγέθους που μπορούν να οριστούν για μια δεδομένη εικονική μηχανή.

Ας αλλάξουμε το μέγεθος του αυτοκινήτου

Για παράδειγμα, θα αλλάξουμε το μέγεθος σε νέο μέγεθος Standard_B1ls - είναι στην πρώτη θέση στην παραπάνω λίστα. (Σε πραγματικές εφαρμογές, φυσικά, επιλέγετε όποιο μέγεθος χρειάζεστε.)

  1. Πρώτα χρησιμοποιώντας την εντολή Get-AzVM παίρνουμε πληροφορίες για το αντικείμενο μας (εικονική μηχανή) αποθηκεύοντάς το σε μια μεταβλητή $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Στη συνέχεια παίρνουμε την ιδιότητα από αυτό το αντικείμενο .HardwareProfile.VmSize και ορίστε την επιθυμητή νέα τιμή:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Και τώρα απλώς εκτελούμε την εντολή ενημέρωσης VM - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Βεβαιωνόμαστε ότι όλα πήγαν καλά - για να το κάνουμε αυτό, ζητάμε ξανά πληροφορίες για το αντικείμενο μας και κοιτάμε το ακίνητο $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Αν δούμε εκεί Standard_B1ls - αυτό σημαίνει ότι όλα είναι εντάξει, το μέγεθος του αυτοκινήτου έχει αλλάξει. Μπορείτε να προχωρήσετε περισσότερο και να αξιοποιήσετε την επιτυχία σας αλλάζοντας το μέγεθος πολλών εικονικών μηχανών ταυτόχρονα χρησιμοποιώντας έναν πίνακα.

Τι γίνεται με τη διαγραφή ενός VM στο Azure;

Με τη διαγραφή, δεν είναι όλα τόσο απλά και απλά όσο φαίνεται. Μετά από όλα, είναι απαραίτητο να αφαιρέσετε έναν αριθμό πόρων που σχετίζονται με αυτό το μηχάνημα, όπως:

  • Δοχεία αποθήκευσης διαγνωστικών εκκίνησης
  • Διεπαφές δικτύου
  • Δημόσιες διευθύνσεις IP
  • Δίσκος συστήματος και κηλίδα όπου είναι αποθηκευμένη η κατάστασή του
  • Δίσκοι δεδομένων

Επομένως, θα δημιουργήσουμε μια συνάρτηση και θα την καλέσουμε Remove-AzrVirtualMachine - και θα διαγράψει όχι μόνο το Azure VM, αλλά και όλα τα παραπάνω.

Ακολουθούμε τον τυπικό τρόπο και παίρνουμε πρώτα το αντικείμενο μας (VM) χρησιμοποιώντας την εντολή Get-AzVm. Για παράδειγμα, ας είναι αυτοκίνητο WINSRV19 από την ομάδα πόρων MyTestVMs.

Ας αποθηκεύσουμε αυτό το αντικείμενο μαζί με όλες τις ιδιότητες του σε μια μεταβλητή $vm:

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

Αφαίρεση του κοντέινερ με τα διαγνωστικά αρχεία εκκίνησης

Κατά τη δημιουργία ενός VM στο Azure, ο χρήστης καλείται επίσης να δημιουργήσει ένα κοντέινερ για την αποθήκευση διαγνωστικών εκκίνησης (κοντέινερ διαγνωστικών εκκίνησης), ώστε εάν υπάρχουν προβλήματα με την εκκίνηση, να υπάρχει κάτι στο οποίο πρέπει να απευθυνθεί για την αντιμετώπιση προβλημάτων. Ωστόσο, όταν διαγραφεί η εικονική μηχανή, αυτό το κοντέινερ αφήνεται να συνεχίσει την άσκοπη ύπαρξή του. Ας διορθώσουμε αυτή την κατάσταση.

  1. Αρχικά, ας μάθουμε σε ποιον λογαριασμό αποθήκευσης ανήκει αυτό το κοντέινερ - για αυτό πρέπει να βρούμε την ιδιοκτησία storageUri στα έγκατα του αντικειμένου DiagnosticsProfile το VM μας. Για αυτό χρησιμοποιώ την κανονική έκφραση:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Τώρα πρέπει να μάθετε το όνομα του κοντέινερ και για αυτό πρέπει να λάβετε το αναγνωριστικό VM χρησιμοποιώντας την εντολή 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. Στη συνέχεια, παίρνουμε το όνομα της ομάδας πόρων στην οποία ανήκει το κοντέινερ:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. Και τώρα έχουμε όλα όσα χρειαζόμαστε για να διαγράψουμε το κοντέινερ με την εντολή Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Αφαίρεση του VM

Τώρα ας διαγράψουμε την ίδια την εικονική μηχανή, αφού έχουμε ήδη δημιουργήσει μια μεταβλητή $vm για το αντίστοιχο αντικείμενο. Λοιπόν, ας εκτελέσουμε την εντολή Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Κατάργηση της διεπαφής δικτύου και της δημόσιας διεύθυνσης IP

Το VM μας έχει ακόμα μία (ή και πολλές) διεπαφές δικτύου (NIC) - για να τις αφαιρέσουμε ως περιττές, ας περάσουμε από την ιδιοκτησία NetworkInterfaces αντικείμενο VM μας και διαγράψτε το NIC με την εντολή Remove-AzNetworkInterface. Σε περίπτωση που υπάρχουν περισσότερες από μία διεπαφές δικτύου, χρησιμοποιούμε βρόχο. Ταυτόχρονα, για κάθε NIC θα ελέγχουμε το ακίνητο IpConfiguration για να προσδιορίσετε εάν η διεπαφή έχει δημόσια διεύθυνση IP. Αν βρεθεί ένα, θα το αφαιρέσουμε με την εντολή Remove-AzPublicIpAddress.

Ακολουθεί ένα παράδειγμα τέτοιου κώδικα, όπου εξετάζουμε όλα τα NIC σε ένα βρόχο, τα διαγράφουμε και ελέγχουμε αν υπάρχει δημόσια IP. Εάν υπάρχει, τότε αναλύστε την ιδιότητα PublicIpAddress, βρείτε το όνομα του αντίστοιχου πόρου ανά αναγνωριστικό και διαγράψτε τον:


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

Αφαίρεση του δίσκου συστήματος

Ο δίσκος του λειτουργικού συστήματος είναι ένα blob, για το οποίο υπάρχει εντολή διαγραφής του Remove-AzStorageBlob - αλλά πριν την εκτελέσετε, θα χρειαστεί να ορίσετε τις απαιτούμενες τιμές για τις παραμέτρους του. Για να το κάνετε αυτό, συγκεκριμένα, πρέπει να λάβετε το όνομα του κοντέινερ αποθήκευσης που περιέχει το δίσκο συστήματος και, στη συνέχεια, να το περάσετε σε αυτήν την εντολή μαζί με τον αντίστοιχο λογαριασμό αποθήκευσης.

$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]

Αφαίρεση της σημαδίδας κατάστασης δίσκου συστήματος

Για να το κάνουμε αυτό, όπως πιθανώς ήδη μαντέψατε, παίρνουμε το δοχείο αποθήκευσης στο οποίο είναι αποθηκευμένος αυτός ο δίσκος και, υπονοώντας ότι η μάζα στο τέλος περιέχει status, περάστε τις αντίστοιχες παραμέτρους στην εντολή delete Remove-AzStorageBlob:

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

Και τέλος, αφαιρούμε τους δίσκους δεδομένων

Το VM μας θα μπορούσε να έχει ακόμα δίσκους με δεδομένα που ήταν συνδεδεμένα σε αυτό. Εάν δεν χρειάζονται, θα τα διαγράψουμε και αυτά. Ας το αναλύσουμε πρώτα StorageProfile το VM μας και βρείτε το ακίνητο Uri. Εάν υπάρχουν πολλοί δίσκοι, οργανώνουμε έναν κύκλο σύμφωνα με URI. Για κάθε URI, θα βρούμε τον αντίστοιχο λογαριασμό αποθήκευσης χρησιμοποιώντας Get-AzStorageAccount. Στη συνέχεια, αναλύστε το URI αποθήκευσης για να εξαγάγετε το επιθυμητό όνομα blob και περάστε το στην εντολή delete Remove-AzStorageBlob μαζί με έναν αποθηκευτικό λογαριασμό. Έτσι θα φαίνεται στον κώδικα:

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

Και τώρα "φτάσαμε στο αίσιο τέλος!" Τώρα πρέπει να συγκεντρώσουμε ένα ενιαίο σύνολο από όλα αυτά τα θραύσματα. Ο ευγενικός συγγραφέας Adam Bertram συνάντησε τους χρήστες στα μισά του δρόμου και το έκανε μόνος του. Εδώ είναι ένας σύνδεσμος προς το τελικό σενάριο που ονομάζεται Remove-AzrVirtualMachine.ps1:

GitHub

Ελπίζω να βρείτε αυτές τις πρακτικές συμβουλές χρήσιμες για να εξοικονομήσετε κόπο, χρόνο και χρήμα όταν εργάζεστε με Azure VM.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο