Med PowerShell kan ingeniÞrer og IT-administratorer effektivt automatisere ulike oppgaver nÄr de arbeider ikke bare med on-premises, men ogsÄ med skylÞsninger, spesielt med Azure. Det er i mange tilfeller mye mer praktisk og raskere Ä arbeide gjennom PowerShell enn via Azure-portalen. Takket vÊre tverrplatformkompatibiliteten kan PowerShell brukes pÄ alle OS.
Uansett om du jobber med Ubuntu, Red Hat eller Windows â PowerShell vil hjelpe deg med Ă„ kontrollere skyressursene. Ved Ă„ bruke modulen , for eksempel, kan du angi hvilke som helst egenskaper for virtuelle maskiner.
I denne artikkelen vil vi se pÄ hvordan vi kan bruke PowerShell til Ä endre stÞrrelsen pÄ en VM i Azure-skyen, samt for Ä fjerne VM-en og tilknyttede objekter.

Viktig! Ikke glem Ă„ desinfisere hendene fĂžr arbeidet:
- Du vil trenge modulen Azure PowerShell Module â den kan lastes ned fra PowerShell Gallery med kommandoen
Install-Module Az. - Du mÄ autentisere deg i Azure-skyen hvor den virtuelle maskinen kjÞrer, ved Ä kjÞre kommandoen
Connect-AzAccount.
FĂžrst lager vi et skript som endrer stĂžrrelsen pĂ„ Azure VM. Vi Ă„pner VS Code og lagrer det nye PowerShell-skriptet under navnet Resize-AzVirtualMachine.ps1 â i lĂžpet av eksempelet vil vi legge til kodebiter i det.
ForespĂžr de tilgjengelige stĂžrrelsene for VM
FÞr du endrer stÞrrelsen pÄ VM, mÄ du vite hvilke gyldige stÞrrelser som er tilgjengelige for virtuelle maskiner i Azure-skyen. For dette mÄ du kjÞre kommandoen Get-AzVMSize.
SĂ„, for den virtuelle maskinen devvm01 fra ressursgruppen dev ber vi om alle mulige gyldige stĂžrrelser:
Get-AzVMSize -ResourceGroupName dev -VMName devvm01(I virkelige oppgaver vil du naturligvis angi dine egne verdier for disse parameterne.) Commanden vil returnere omtrent denne listen: og Dette er alle mulige stÞrrelsesalternativer du kan angi for denne virtuelle maskinen. Endrer stÞrrelsen pÄ maskinen
For eksempelets skyld vil vi endre stĂžrrelsen til en ny stĂžrrelse

Standard_B1ls
â den er den fĂžrste i listen ovenfor. (I virkelige oppgaver velger du naturligvis hvilken som helst stĂžrrelse som passer for dine behov.)
FÞrst bruker vi kommandoen Get-AzVM for Ä hente informasjon om vÄrt objekt (den virtuelle maskinen), og lagrer det i variabelen
- $virtualMachine
$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01Deretter tar vi dette objektets egenskap.HardwareProfile.VmSize:og setter det nĂždvendige nye verdien: - $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
Og nĂ„ kjĂžrer vi bare oppdateringskommandoen for VM âUpdate-AzVm$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls" - Og no utfĂžrer vi bare VM-oppdateringskommandoen â
Update-AzVm:Oppdater-AzVM -VM devvm01 -ResourceGroupName dev - Vi forsikrer oss om at alt har gĂ„tt bra â for dette ber vi igjen om informasjon om objektet vĂ„rt og ser pĂ„ egenskapen
$virtualMachine.HardwareProfile:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 $virtualMachine.HardwareProfile
Hvis vi ser det der Get-AzVM â betyr det at alt er i orden, maskinstĂžrrelsen er endret. Vi kan gĂ„ videre og ta det et steg videre â resize flere VM-er samtidig ved Ă„ bruke en matrise.
Hva med Ă„ slette VM i Azure?
Det er ikke sÄ enkelt Ä slette som det kan se ut. Man mÄ nemlig slette flere ressurser knyttet til denne maskinen, inkludert:
- Diagnostikk-lagringsbeholdere (Boot diagnostics storage containers)
- Nettverksgrensesnitt
- Offentlige IP-adresser
- Systemdisk og blob, hvor statusen er lagret
- Datadisker (data disks)
Derfor vil vi lage en funksjon og kalle den Remove-AzrVirtualMachine â og den vil slette ikke bare Azure VM, men ogsĂ„ alle de nevnte ressursene.
Vi gÄr den vanlige veien og henter fÞrst objektet vÄrt (VM) med kommandoen Get-AzVm. For eksemplet skal vi bruke maskinen WINSRV19 fra ressursgruppen MyTestVMs.
Vi lagrer dette objektet sammen med alle egenskapene i en variabel $vm:
$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMsVi sletter beholderen for filene til oppstartdiagnostikk
NÄr man oppretter en VM i Azure, blir brukeren ogsÄ bedt om Ä opprette en beholder for oppstartdiagnostikk, slik at hvis det oppstÄr problemer med oppstart, har man noe Ä gÄ tilbake til for feilsÞking. Ved sletting av VM forblir denne beholderen der og fortsetter sitt nÄ meningslÞse eksistens. La oss rette opp i dette.
- FĂžrst finner vi ut hvilken lagringskonto denne beholderen tilhĂžrer â for dette mĂ„ vi finne egenskapen
storageUrii dypet av objektetDiagnosticsProfiletil vÄr VM. For dette bruker jeg et slikt regulÊrt uttrykk:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value - NÄ mÄ vi finne ut navnet pÄ beholderen, og for dette mÄ vi fÄ VM-ID med kommandoen
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) - Deretter fÄr vi navnet pÄ ressursgruppen som beholderen tilhÞrer:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName - Og nÄ har vi alt vi trenger for Ä fjerne containeren med kommandoen
Remove-AzStorageContainer:$saParams = @{ 'ResourceGroupName' = $diagSaRg 'Name' = $diagSa } Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force
Fjerner VM
NĂ„ skal vi fjerne selve den virtuelle maskinen, heldigvis har vi allerede opprettet en variabel $vm for det aktuelle objektet. La oss kjĂžre kommandoen Remove-AzVm:
$null = $vm | Remove-AzVM -ForceFjerner nettverksgrensesnittet og offentlig IP-adresse
VĂ„r VM har en (eller flere) nettverksgrensesnitt (NICs) â for Ă„ fjerne dem som ikke lenger er nĂždvendige, gĂ„r vi gjennom egenskapen NetworkInterfaces til vĂ„rt VM-objekt og fjerner NIC med kommandoen Remove-AzNetworkInterface. I tilfelle det er mer enn ett nettverksgrensesnitt, bruker vi en lĂžkke. For hvert NIC skal vi ogsĂ„ sjekke egenskapen IpConfiguration for Ă„ se om grensesnittet har en offentlig IP-adresse. Hvis det finnes, fjerner vi den med kommandoen Remove-AzPublicIpAddress.
Her er et eksempel pÄ slik kode, hvor vi i en lÞkke gÄr gjennom alle NICs, fjerner dem og sjekker om det er en offentlig IP. Hvis det er, henter vi egenskapen PublicIpAddress, henter navnet pÄ den aktuelle ressursen ved hjelp av ID og fjerner 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
}
}
}
Fjerner systemdisken
OS-disken er en blob, som har en kommando for Ă„ fjerne, Remove-AzStorageBlob â men fĂžr vi kan utfĂžre den, mĂ„ vi angi de nĂždvendige verdiene for parametrene. For dette mĂ„ vi blant annet hente navnet pĂ„ lagringscontaineren som inneholder systemdisken, og deretter sende dette til kommandoen sammen med den relevante lagringskontoen.
$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]
Fjerner Blob-statusen til systemdisken
For dette, som du sikkert allerede har gjettet, tar vi lagringscontaineren som inneholder denne disken, og antar at bloben til slutt inneholder status, og sender de relevante parameterne til fjerningskommandoen Remove-AzStorageBlob:
$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlobOg til slutt fjerner vi dataene fra diskene
Det kan vÊre at vÄr VM hadde dataene knyttet til den. Hvis vi ikke har behov for dem, kan vi ogsÄ fjerne dem. FÞrst parser vi StorageProfile til vÄr VM og finner egenskapen Uri. Hvis det er flere disker, organiserer vi en lÞkke for URI. For hver URI finner vi den tilhÞrende lagringskontoen ved hjelp av Get-AzStorageAccount. Deretter parser vi storage URI for Ä trekke ut det nÞdvendige navnet pÄ blob og sende det til slettekommandoen Remove-AzStorageBlob sammen med lagringskontoen. Slik vil dette 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]
}
}
Og nÄ har "vi nÄdd den lykkelige slutten!" NÄ mÄ vi samle alle disse fragmentene til en helhet. Den gode forfatteren Adam Bertram har gÄtt i mÞte med brukerne og gjort dette selv. Her er lenken til det endelige skriptet kalt Remove-AzrVirtualMachine.ps1:
â
Jeg hÄper at disse praktiske tipsene vil vÊre til nytte for deg, slik at du kan spare krefter, tid og ressurser nÄr du arbeider med Azure VMs.
Kilde: habr.com
