Mit PowerShell automatisieren Ingenieure und IT-Administratoren erfolgreich verschiedene Aufgaben bei der Arbeit nicht nur mit On-Premises, sondern auch mit Cloud-Infrastrukturen, insbesondere mit Azure. Die Arbeit ĂŒber PowerShell ist in vielen FĂ€llen viel bequemer und schneller als ĂŒber das Azure-Portal. Dank der plattformĂŒbergreifenden Natur von PowerShell kann es fĂŒr jedes Betriebssystem genutzt werden.
Egal, ob Sie mit Ubuntu, Red Hat oder Windows arbeiten - PowerShell hilft Ihnen, Cloud-Ressourcen zu steuern. Mithilfe des Moduls , können beispielsweise beliebige Eigenschaften von virtuellen Maschinen festgelegt werden.
In diesem Artikel werden wir untersuchen, wie PowerShell verwendet werden kann, um die GröĂe einer VM in der Azure-Cloud zu Ă€ndern und um eine VM sowie die damit verbundenen Objekte zu löschen.

Wichtig! Vergessen Sie nicht, die HĂ€nde mit Desinfektionsmittel zu reinigen, bevor Sie mit der Arbeit beginnen:
- Sie benötigen das Modul Azure PowerShell Module â es kann mit dem Befehl aus der PowerShell Gallery heruntergeladen werden:
Install-Module Az. - Sie mĂŒssen sich in der Azure-Cloud, in der die virtuelle Maschine betrieben wird, authentifizieren, indem Sie den Befehl ausfĂŒhren:
Connect-AzAccount.
Lassen Sie uns zunĂ€chst ein Skript erstellen, das die Azure-VM in der GröĂe Ă€ndert. Ăffnen Sie VS Code und speichern Sie ein neues PowerShell-Skript mit dem Namen Resize-AzVirtualMachine.ps1 â darin werden wir im Laufe des Beispiels Code-Schnipsel hinzufĂŒgen.
Ermitteln der verfĂŒgbaren VM-GröĂen
Bevor Sie die VM-GröĂe Ă€ndern, mĂŒssen Sie herausfinden, welche zulĂ€ssigen GröĂen fĂŒr virtuelle Maschinen in der Azure-Cloud vorhanden sind. FĂŒhren Sie dazu den Befehl aus: Get-AzVMSize.
FĂŒr die virtuelle Maschine devvm01 aus der Ressourcengruppe dev fordern wir alle möglichen zulĂ€ssigen GröĂen an:
Get-AzVMSize -ResourceGroupName dev -VMName devvm01(In realen Aufgaben wĂŒrden Sie natĂŒrlich Ihre eigenen Werte fĂŒr diese Parameter angeben.) ResourceGroupName=dev und VMName=devvm01 Der Befehl gibt etwa folgendes zurĂŒck:
Dies sind alle möglichen GröĂenversionen, die fĂŒr diese virtuelle Maschine angegeben werden können.

Ăndern der GröĂe der Maschine
In unserem Beispiel Ă€ndern wir die GröĂe auf die neue GröĂe
Standard_B1ls â sie steht an erster Stelle in der Liste oben. (In realen Aufgaben wĂ€hlen Sie natĂŒrlich jede gewĂŒnschte GröĂe aus.) ZunĂ€chst erhalten wir mit dem Befehl
- Get-AzVM
Informationen ĂŒber unser Objekt (virtuelle Maschine) und speichern diese in der Variablen$virtualMachine$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01:AnschlieĂend nehmen wir dieses Objekt und verwenden die Eigenschaft - .HardwareProfile.VmSize
und setzen den gewĂŒnschten neuen Wert:$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls" - Und jetzt fĂŒhren wir einfach den Befehl zum Aktualisieren der VM aus â
Update-AzVm:Update-AzVM -VM devvm01 -ResourceGroupName dev - Stellen wir sicher, dass alles erfolgreich war â dazu fragen wir erneut Informationen zu unserem Objekt an und schauen uns die Eigenschaft an
$virtualMachine.HardwareProfile:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 $virtualMachine.HardwareProfile
Wenn wir dort sehen â sie steht an erster Stelle in der Liste oben. (In realen Aufgaben wĂ€hlen Sie natĂŒrlich jede gewĂŒnschte GröĂe aus.) â dann ist alles in Ordnung, die GröĂe der Maschine wurde geĂ€ndert. Man kann weitermachen und den Erfolg ausbauen â gleich mehrere VMs resizing, indem man ein Array verwendet.
Und wie sieht es mit dem Löschen von VMs in Azure aus?
Das Löschen ist nicht so einfach und geradlinig, wie es zunÀchst scheinen mag. Denn man muss eine Reihe von Ressourcen entfernen, die mit dieser Maschine verbunden sind, darunter:
- Diagnose-Storage-Container fĂŒr Bootdiagnosen
- Netzwerkschnittstellen
- Ăffentliche IP-Adressen
- Das Systemlaufwerk und Blob, in dem sein Status gespeichert ist
- DatentrÀger (data disks)
Daher erstellen wir eine Funktion und nennen sie Remove-AzrVirtualMachine â und sie wird nicht nur die Azure-VM löschen, sondern auch alles oben Genannte.
Wir gehen den Standardweg und erhalten zunÀchst unser Objekt (VM) mit dem Befehl Get-AzVm. Zur Veranschaulichung nehmen wir die Maschine WINSRV19 aus der Ressourcengruppe MyTestVMs.
Wir speichern dieses Objekt zusammen mit all seinen Eigenschaften in einer Variablen $vm:
$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMsWir löschen den Container mit den Bootdiagnose-Dateien.
Bei der Erstellung einer VM in Azure wird dem Benutzer auch angeboten, einen Container fĂŒr die Speicherung von Bootdiagnosen zu erstellen, um im Falle von Problemen bei der boot diagnose referenzieren zu können. Beim Löschen der VM bleibt dieser Container jedoch weiterhin bestehen und fĂŒhrt seine nun sinnlose Existenz. Lassen Sie uns dieses Problem beheben.
- Zuerst finden wir heraus, zu welchem Storage-Konto dieser Container gehört â dazu mĂŒssen wir die Eigenschaft
storageUriim Inneren des ObjektsDiagnosticsProfileunserer VM ermitteln. DafĂŒr benutze ich folgendes regulĂ€res Ausdruck:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value - Jetzt mĂŒssen wir den Namen des Containers herausfinden, dafĂŒr benötigen wir die VM-ID mit dem Befehl
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) - Dann erhalten wir den Namen der Ressourcengruppe, zu der der Container gehört:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName - Und jetzt haben wir alles, was wir benötigen, um den Container mit dem Befehl zu löschen
Remove-AzStorageContainer:$saParams = @{ 'ResourceGroupName' = $diagSaRg 'Name' = $diagSa } Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force
Löschen der VM
Jetzt löschen wir die virtuelle Maschine, da wir bereits die Variable erstellt haben $vm fĂŒr das entsprechende Objekt. Nun, lassen Sie uns den Befehl ausfĂŒhren Remove-AzVm:
$null = $vm | Remove-AzVM -ForceLöschen des Netzwerkinterfaces und der öffentlichen IP-Adresse
Unsere VM hat ein (oder mehrere) Netzwerkinterfaces (NICs) â um diese aus Unnötigkeit zu löschen, gehen wir das Attribut NetworkInterfaces unseres VM-Objekts durch und löschen das NIC mit dem Befehl Remove-AzNetworkInterface. Falls mehr als ein Netzwerkinterface vorhanden ist, verwenden wir eine Schleife. AuĂerdem ĂŒberprĂŒfen wir fĂŒr jedes NIC das Attribut IpConfiguration darĂŒber, ob das Interface eine öffentliche IP-Adresse hat. Sollte eine solche vorhanden sein, löschen wir sie mit dem Befehl Remove-AzPublicIpAddress.
Hier ist ein Beispiel eines solchen Codes, bei dem wir in einer Schleife alle NICs durchgehen, sie löschen und ĂŒberprĂŒfen, ob eine öffentliche IP vorhanden ist. Wenn ja, parsen wir das Attribut PublicIpAddress, holen wir den Namen des zugehörigen Ressourcen-IDs und löschen ihn:
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
}
}
}
Löschen der Systemfestplatte
Die OS-Festplatte ist ein Blob, fĂŒr dessen Löschung es einen Befehl gibt Remove-AzStorageBlob â aber bevor wir diesen ausfĂŒhren, mĂŒssen wir die erforderlichen Werte fĂŒr seine Parameter festlegen. Dazu ist es erforderlich, den Namen des Speichercontainers zu erhalten, der die Systemfestplatte enthĂ€lt, und diesen dann diesem Befehl zusammen mit dem entsprechenden Storage-Account zu ĂŒbergeben.
$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]
Löschen des Blobs des Status der Systemfestplatte
DafĂŒr nehmen wir, wie Sie sicherlich bereits vermutet haben, den Speichercontainer, in dem sich diese Festplatte befindet, und, vorausgesetzt, dass der Blob am Ende enthĂ€lt status, ĂŒbergeben wir die entsprechenden Parameter dem Löschbefehl Remove-AzStorageBlob:
$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlobUnd schlieĂlich löschen wir die DatentrĂ€ger
An unserer VM könnten DatentrĂ€ger angehĂ€ngt geblieben sein. Wenn sie nicht mehr benötigt werden, löschen wir auch diese. Zuerst parsen wir StorageProfile unserer VM und finden die Eigenschaft Uri. Wenn mehrere DatentrĂ€ger vorhanden sind, organisieren wir eine Schleife ĂŒber URI. FĂŒr jede URI finden wir das entsprechende Speicherkonto mithilfe von Get-AzStorageAccount. Dann parsen wir die Speicher-URI, um den benötigten Blob-Namen herauszuziehen und ihn an den Löschbefehl weiterzugeben Remove-AzStorageBlob zusammen mit dem Speicherkonto. So wird das im Code aussehen:
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]
}
}
Und nun "sind wir am glĂŒcklichen Ende angekommen!" Jetzt mĂŒssen wir all diese Fragmente zu einem Ganzen zusammenfĂŒgen. Der freundliche Autor Adam Bertram hat sich den Nutzern zuliebe die MĂŒhe gemacht und das selbst erledigt. Hier ist der Link zum endgĂŒltigen Skript mit dem Titel Remove-AzrVirtualMachine.ps1:
â
Ich hoffe, diese praktischen Tipps helfen Ihnen, Kraft, Zeit und Ressourcen bei der Arbeit mit Azure VMs zu sparen.
Quelle: habr.com
