Med PowerShell kan ingenjörer och IT-administratörer framgÄngsrikt automatisera olika uppgifter i arbetet med bÄde lokala och molninfrastrukturer, sÀrskilt med Azure. Att arbeta via PowerShell Àr i mÄnga fall bÄde enklare och snabbare Àn via Azure-portalen. Tack vare PowerShell:s plattformsoberoende kan det anvÀndas för alla operativsystem.
Oavsett om du arbetar med Ubuntu, Red Hat eller Windows â PowerShell hjĂ€lper till att kontrollera molnresurser. Genom att anvĂ€nda modulen kan du till exempel stĂ€lla in alla egenskaper för virtuella maskiner.
I den hÀr artikeln gÄr vi igenom hur man anvÀnder PowerShell för att Àndra storleken pÄ en VM i molnet Azure samt för att ta bort en VM och associerade objekt.

Viktigt! Glöm inte att desinfektera hÀnderna innan du börjar arbeta:
- Du behöver modulen Azure PowerShell Module â den kan laddas ner frĂ„n PowerShell Gallery med kommandot
Install-Module Az. - Du mÄste autentisera dig i molnet Azure dÀr den virtuella maskinen körs genom att köra kommandot
Connect-AzAccount.
Först skapar vi ett skript som Ă€ndrar storleken pĂ„ Azure VM. Vi öppnar VS Code och sparar ett nytt PowerShell-skript med namnet Resize-AzVirtualMachine.ps1 â i det kommer vi under exempelns gĂ„ng att lĂ€gga till kodstycken.
FrÄga de tillgÀngliga storlekarna för VM
Innan du byter storlek pÄ VM:n mÄste du ta reda pÄ vilka storlekar som Àr tillÄtna för virtuella maskiner i molnet Azure. 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 frÄgar vi om alla möjliga tillÄtna storlekar:
Get-AzVMSize -ResourceGroupName dev -VMName devvm01(I verkliga uppgifter kommer du naturligtvis att ange dina egna vÀrden för dessa parametrar i stÀllet för ResourceGroupName=dev och VMName=devvm01 ).
Kommandot kommer att returnera ungefÀr följande lista:

Detta Àr alla möjliga storlekar som kan anges för denna virtuella maskin.
Ăndra storlek pĂ„ maskinen
Som exempel kommer vi att Ă€ndra storlek till den nya storleken Standard_B1ls â den ligger först pĂ„ listan ovan. (I verkliga uppgifter kommer du naturligtvis att vĂ€lja vilken storlek som helst du behöver.)
- Först fÄr vi information om vÄrt objekt (den virtuella maskinen) med kommandot
Get-AzVMoch sparar den i variabeln$virtualMachine:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 - DÀrefter hÀmtar vi egenskapen för detta objekt
.HardwareProfile.VmSizeoch anger det nya vĂ€rdet:$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls" - Och nu utför vi helt enkelt kommandot för att uppdatera VM:n â
Update-AzVm:Update-AzVM -VM devvm01 -ResourceGroupName dev - Vi verifierar att allt har gÄtt bra - för detta frÄgar vi Äterigen om informationen om vÄrt objekt och tittar pÄ egenskapen
$virtualMachine.HardwareProfile:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 $virtualMachine.HardwareProfile
Om vi ser dĂ€r Standard_B1ls â betyder det att allt Ă€r i ordning, maskinstorleken har Ă€ndrats. Vi kan gĂ„ vidare och fortsĂ€tta framgĂ„ngen - Ă€ndra storlek pĂ„ flera VMer pĂ„ en gĂ„ng genom att anvĂ€nda en array.
Men vad sÀgs om att ta bort VMs i Azure?
Att ta bort Àr inte sÄ enkelt och rakt pÄ som det kan verka. Du mÄste ta bort flera resurser som Àr kopplade till denna maskin, inklusive:
- LagringsbehÄllare för bootdiagnostik
- NÀtverksgrÀnssnitt
- Publika 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 den kommer att ta bort inte bara Azure VM, utan Ă€ven allt ovanstĂ„ende.
Vi gÄr den standardvÀgen och börjar med att hÀmta vÄrt objekt (VM) med kommandot Get-AzVm. För exemplet lÄt oss sÀga att detta Àr maskinen WINSRV19 frÄn resursgruppen MyTestVMs.
Vi sparar detta objekt med alla dess egenskaper i en variabel $vm:
$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMsVi tar bort behÄllaren med bootdiagnostikfiler
Vid skapande av VM i Azure erbjuds anvÀndaren ocksÄ att skapa en behÄllare för lagring av bootdiagnostik, för att ha nÄgot att vÀnda sig till för felsökning vid uppstartsproblem. Men nÀr VM tas bort, kvarstÄr denna behÄllare och fortsÀtter sin nu meningslösa existens. LÄt oss rÀtta till detta.
- Först tar vi reda pÄ vilken lagringskonto denna behÄllare tillhör - för detta mÄste vi leta upp egenskapen
storageUriinuti objektetDiagnosticsProfileav vÄr VM. För detta anvÀnder jag ett sÄdant reguljÀrt uttryck:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value - Nu behöver vi fÄ reda pÄ namnet pÄ behÄllaren, och för detta behöver vi fÄ VM ID 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 som behövs för att ta bort containern med kommandot
Remove-AzStorageContainer:$saParams = @{ 'ResourceGroupName' = $diagSaRg 'Name' = $diagSa } Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force
Tar bort VM
Nu tar vi bort den virtuella maskinen, eftersom vi redan har skapat en variabel $vm för den motsvarande objektet. LÄt oss köra kommandot Remove-AzVm:
$null = $vm | Remove-AzVM -ForceTar bort nÀtverksgrÀnssnittet och den offentliga IP-adressen
VĂ„r VM har minst ett (eller flera) nĂ€tverksgrĂ€nssnitt (NICs) â för att ta bort dem som inte lĂ€ngre behövs, gĂ„r vi igenom egenskapen NetworkInterfaces hos vĂ„rt VM-objekt och tar bort NIC med kommandot Remove-AzNetworkInterface. Om det finns fler Ă€n ett nĂ€tverksgrĂ€nssnitt anvĂ€nder vi en loop. Samtidigt kontrollerar vi varje NIC:s egenskap IpConfiguration för att se om grĂ€nssnittet har en offentlig IP-adress. Om en sĂ„dan upptĂ€cks tar vi bort den med kommandot Remove-AzPublicIpAddress.
HÀr Àr ett exempel pÄ sÄdana kod, dÀr vi i en loop gÄr igenom alla NICs, tar bort dem och kontrollerar om det finns en offentlig IP. Om det finns, extraherar vi egenskapen PublicIpAddress, hÀmtar namnet pÄ motsvarande resurs via ID och tar bort den:
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
}
}
}
Tar bort systemdisken
Disken för operativsystemet Ă€r ett blob, och för att ta bort det finns det ett kommando Remove-AzStorageBlob â men innan vi kan köra det mĂ„ste vi ange de nödvĂ€ndiga vĂ€rdena för dess parametrar. För detta mĂ„ste vi bland annat hĂ€mta namnet pĂ„ lagringscontainern som innehĂ„ller systemdisken, och sedan vidarebefordra det till kommandot tillsammans med det motsvarande lagringskontot.
$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]
Tar bort blob-statusen för systemdisken
För detta, som du kanske redan har gissat, tar vi lagringscontainern dÀr denna disk finns, och antaget att blobben i slutet innehÄller status, vidarebefordrar vi motsvarande parametrar till borttagningskommandot Remove-AzStorageBlob:
$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlobOch slutligen, tar vi bort datadiskarna
VÄr VM kan ha kvar datadiskar som var kopplade till den. Om de inte Àr nödvÀndiga, lÄt oss ta bort dem ocksÄ. LÄt oss börja med att parsa StorageProfile vÄr VM och hitta egenskapen Uri. Om det finns flera diskars, organiserar vi en slinga för URI. För varje URI, kommer vi att hitta motsvarande lagringskonto med hjÀlp av Get-AzStorageAccount. Sedan parser vi storage URI för att hÀmta namnet pÄ blobben och överföra det till borttagningskommandot Remove-AzStorageBlob tillsammans med lagringskontot. 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 vi har "nÄtt det lyckliga slutet!" Nu mÄste vi sÀtta ihop alla dessa bitar till en helhet. Den vÀnliga författaren Adam Bertram har tagit sig tid att göra detta sjÀlv. HÀr Àr lÀnken till det slutliga skriptet med namnet Remove-AzrVirtualMachine.ps1:
â
Jag hoppas att dessa praktiska tips kommer att vara till hjÀlp för att spara kraft, tid och resurser nÀr man arbetar med Azure VMs.
KĂ€lla: habr.com
