Med hjälp av PowerShell automatiserar ingenjörer och IT-administratörer framgångsrikt olika uppgifter när de arbetar inte bara med lokalt utan också med molninfrastruktur, särskilt med Azure. I vissa fall är det mycket bekvämare och snabbare att arbeta genom PowerShell än att arbeta genom Azure-portalen. Tack vare dess plattformsoberoende karaktär kan PowerShell användas på alla operativsystem.
Oavsett om du kör Ubuntu, Red Hat eller Windows kan PowerShell hjälpa dig att kontrollera dina molnresurser. Använda modulen
I den här artikeln kommer vi att titta på hur du kan använda PowerShell för att ändra storlek på en virtuell dator i Azure-molnet, samt ta bort en virtuell dator och dess associerade objekt.
Viktigt! Glöm inte att torka händerna med desinfektionsmedel för att förbereda dig för arbetet:
- Du behöver en modul Azure PowerShell-modul - det kan laddas ner från PowerShell Gallery med kommandot
Install-Module Az
. - Du måste autentisera i Azure-molnet där den virtuella maskinen körs genom att köra kommandot
Connect-AzAccount
.
Låt oss först skapa ett skript som kommer att ändra storlek på en virtuell Azure-dator. Låt oss öppna VS Code och spara ett nytt PowerShell-skript som heter Resize-AzVirtualMachine.ps1 — vi kommer att lägga till bitar av kod till det allt eftersom exemplet fortskrider.
Vi begär de tillgängliga VM-storlekarna
Innan du ändrar VM-storleken måste du ta reda på vilka storlekar som är acceptabla för virtuella datorer i Azure-molnet. För att göra detta måste du köra kommandot Get-AzVMSize
.
Så för den virtuella maskinen devvm01 från resursgruppen dev Vi begär alla möjliga acceptabla storlekar:
Get-AzVMSize -ResourceGroupName dev -VMName devvm01
(I verkliga problem, naturligtvis, istället för ResourceGroupName=dev и VMName=devvm01 du kommer att ange dina egna värden för dessa parametrar.)
Kommandot kommer att returnera något så här:
Dessa är alla möjliga storleksalternativ som kan ställas in för en given virtuell maskin.
Låt oss ändra storlek på bilen
Till exempel kommer vi att ändra storlek till en ny storlek Standard_B1ls – han ligger på första plats på listan ovan. (I verkliga applikationer väljer du självklart vilken storlek du behöver.)
- Använd först kommandot
Get-AzVM
vi får information om vårt objekt (virtuell maskin) genom att lagra det i en variabel$virtualMachine
:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
- Sedan tar vi egendomen från detta objekt
.HardwareProfile.VmSize
och ställ in önskat nya värde:$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
- Och nu kör vi helt enkelt VM-uppdateringskommandot -
Update-AzVm
:Update-AzVM -VM devvm01 -ResourceGroupName dev
- Vi ser till att allt gick bra - för att göra detta begär vi återigen information om vårt objekt och tittar på fastigheten
$virtualMachine.HardwareProfile
:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 $virtualMachine.HardwareProfile
Om vi ser där Standard_B1ls – det betyder att allt är i sin ordning, storleken på bilen har ändrats. Du kan gå längre och bygga vidare på din framgång genom att ändra storlek på flera virtuella datorer samtidigt med hjälp av en array.
Vad sägs om att ta bort en virtuell dator i Azure?
Med radering är inte allt så enkelt och okomplicerat som det kan verka. När allt kommer omkring är det nödvändigt att ta bort ett antal resurser som är associerade med den här maskinen, inklusive:
- Förvaringsbehållare för startdiagnostik
- Nätverksgränssnitt
- Offentliga IP-adresser
- Systemdisk och blob där dess status lagras
- Datadiskar
Därför kommer vi att skapa en funktion och kalla den Remove-AzrVirtualMachine
- och det kommer att radera inte bara Azure VM, utan också allt ovanstående.
Vi går standardvägen och hämtar först vårt objekt (VM) med kommandot Get-AzVm
. Låt det till exempel vara en bil WINSRV19 från resursgruppen MyTestVMs.
Låt oss spara detta objekt tillsammans med alla dess egenskaper i en variabel $vm
:
$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMs
Ta bort behållaren med startdiagnostikfiler
När man skapar en virtuell dator i Azure ombeds användaren också att skapa en behållare för lagring av startdiagnostik (bootdiagnostikbehållare), så att om det uppstår problem med uppstart finns det något att vända sig till för felsökning. Men när den virtuella datorn raderas lämnas denna behållare för att fortsätta sin nu ändamålslösa existens. Låt oss fixa den här situationen.
- Låt oss först ta reda på vilket lagringskonto denna behållare tillhör - för detta måste vi hitta fastigheten
storageUri
i föremålets tarmDiagnosticsProfile
vår VM. För detta använder jag det här reguljära uttrycket:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
- Nu måste du ta reda på namnet på behållaren, och för detta måste du få VM-ID:t med kommandot
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)
- Därefter får vi namnet på resursgruppen som behållaren tillhör:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
- Och nu har vi allt vi behöver för att ta bort behållaren med kommandot
Remove-AzStorageContainer
:$saParams = @{ 'ResourceGroupName' = $diagSaRg 'Name' = $diagSa } Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force
Ta bort den virtuella datorn
Låt oss nu ta bort själva den virtuella maskinen, eftersom vi redan har skapat en variabel $vm
för motsvarande objekt. Nåväl, låt oss köra kommandot Remove-AzVm
:
$null = $vm | Remove-AzVM -Force
Ta bort nätverksgränssnittet och den offentliga IP-adressen
Vår virtuella dator har fortfarande ett (eller till och med flera) nätverksgränssnitt (NIC) - för att ta bort dem som onödiga, låt oss gå igenom egenskapen NetworkInterfaces
vårt VM-objekt och ta bort NIC med kommandot Remove-AzNetworkInterface
. Om det finns mer än ett nätverksgränssnitt använder vi en loop. Samtidigt kommer vi att kontrollera fastigheten för varje NIC IpConfiguration
för att avgöra om gränssnittet har en offentlig IP-adress. Om en hittas tar vi bort den med kommandot Remove-AzPublicIpAddress
.
Här är ett exempel på just sådan kod, där vi tittar igenom alla NIC i en slinga, tar bort dem och kontrollerar om det finns en publik IP. Om det finns, analysera sedan egenskapen PublicIpAddress
, hitta namnet på motsvarande resurs efter ID och radera det:
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
}
}
}
Ta bort systemdisken
OS-disken är en blob, för vilken det finns ett kommando för att ta bort den Remove-AzStorageBlob
- men innan du kör det måste du ställa in de nödvändiga värdena för dess parametrar. För att göra detta måste du i synnerhet få namnet på lagringsbehållaren som innehåller systemdisken och sedan skicka det till det här kommandot tillsammans med motsvarande lagringskonto.
$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]
Ta bort System Disk Status Blob
För att göra detta, som du antagligen redan gissat, tar vi lagringsbehållaren i vilken den här skivan är lagrad, och antyder att klumpen i slutet innehåller status
, skicka motsvarande parametrar till kommandot delete Remove-AzStorageBlob
:
$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlob
Och slutligen tar vi bort datadiskarna
Vår virtuella dator kunde fortfarande ha diskar med data som var anslutna till den. Om de inte behövs tar vi bort dem också. Låt oss analysera det först StorageProfile
vår VM och hitta fastigheten Uri
. Om det är flera diskar organiserar vi en cykel enl URI
. För varje URI hittar vi motsvarande lagringskonto med hjälp av Get-AzStorageAccount
. Analysera sedan lagrings-URI för att extrahera det önskade blobnamnet och skicka det till raderingskommandot Remove-AzStorageBlob
tillsammans med ett lagringskonto. Så här skulle det se ut i koden:
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]
}
}
Och nu "vi har nått det lyckliga slutet!" Nu måste vi sätta ihop en enda helhet från alla dessa fragment. Den snälle författaren Adam Bertram träffade användarna halvvägs och gjorde det själv. Här är en länk till det sista manuset som heter Remove-AzrVirtualMachine.ps1:
→
Jag hoppas att du tycker att dessa praktiska tips är användbara för att spara ansträngning, tid och pengar när du arbetar med virtuella Azure-datorer.
Källa: will.com