Ndryshoni dhe fshini VM-të Azure duke përdorur PowerShell

Me PowerShell, inxhinierët dhe administratorët IT automatizojnë me sukses detyra të ndryshme jo vetëm në infrastrukturat on-premises, por edhe në ato cloud, veçanërisht me Azure. Të punosh përmes PowerShell në disa raste është shumë më e lehtë dhe më e shpejtë sesa përmes portalit të Azure. Falë përkrahjes për disa platforma, PowerShell mund të përdoret për çdo SO.

S'ka rëndësi nëse jeni duke punuar me Ubuntu, Red Hat apo Windows — PowerShell do t'ju ndihmojë të kontrolloni burimet cloud. Duke përdorur modul Azure PowerShell, për shembull, mund të caktoni çdo pronë të makinave virtuale.

Në këtë artikull, ne do të shqyrtojmë se si mund të përdorim PowerShell për të ndryshuar madhësinë e VM-ve në cloud Azure, si dhe për të fshirë VM-në dhe objektet e lidhura me të.

Ndryshoni dhe fshini VM-të Azure duke përdorur PowerShell

E rëndësishme! Mos harroni të lani duar me dezinfektues para se të filloni punën:

  • Do t'ju nevojitet moduli Azure PowerShell Module — mund ta shkarkoni nga PowerShell Gallery me komandën Install-Module Az.
  • Duhet të autentikoheni në cloud Azure ku po funksionon makina virtuale duke ekzekutuar komandën Connect-AzAccount.

Së pari, le të krijojmë një skript që ndryshon madhësinë e VM-së Azure. Hapim VS Code dhe ruajmë një skript të ri PowerShell me emrin Resize-AzVirtualMachine.ps1 — në të do të shtojmë pjesë kodi gjatë shembullit.

Kërkojmë dimensionet e disponueshme të VM

Para se të ndryshoni madhësinë e VM-së, duhet të dini se cilat janë dimensionet e lejueshme për makinat virtuale në Azure. Për këtë, duhet të ekzekutoni komandën Get-AzVMSize.

Pra, për makinën virtuale devvm01 nga grupi i burimeve dev kërkojmë të gjitha madhësitë e lejueshme:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(Në detyrat reale, natyrisht, do të specifikoni vlerat tuaja për këto parametra.) ResourceGroupName=dev dhe VMName=devvm01 Komanda do të kthejë një listë të tillë:

Këto janë të gjitha mundësitë e dimensioneve që mund të caktoni për këtë makinë virtuale.

Ndryshoni dhe fshini VM-të Azure duke përdorur PowerShell

Rrisim makinën

Rikthejm makinen

Si një shembull, ne do ta rrisim në madhësinë e re Standard_B1ls — ai është në vendin e parë në listën më sipër. (Në detyrat reale, natyrisht, ju zgjidhni çdo madhësi që ju nevojitet.)

  1. Fillimisht, me ndihmën e komandës Get-AzVM marrim informacion rreth objektit tonë (makinës virtuale), duke e ruajtur atë në një variabël $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Pastaj, për këtë objekt marrim pronën .HardwareProfile.VmSize dhe vendosim vlerën e re të nevojshme:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Dhe tani thjesht ekzekutojmë komandën për të përditësuar VM — Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Sigurohemi që gjithçka shkon mirë — për këtë, sërish kërkojmë informacionin për objektin tonë dhe shohim pronën $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Nëse aty shohim Standard_B1ls — atëherë gjithçka është në rregull, madhësia e makinës është ndryshuar. Mund të shkojmë më tej dhe të zhvillojmë suksesin — të rrisim menjëherë disa VM, duke përdorur një array.

Çfarë ndodh me fshirjen e VM në Azure?

Me fshirjen nuk është gjithçka aq e thjeshtë dhe e drejtpërdrejtë sa mund të duket. Në fakt, duhet të fshijmë një sërë burimesh që janë të lidhura me këtë makinë, përfshirë:

  • Kontejnerët e ruajtjes për diagnozën e boot-it (Boot diagnostics storage containers)
  • Interface të rrjeteve
  • Adresat IP publike
  • Disqi sistemor dhe blob, ku ruhet statusi i tij
  • Disket e të dhënave (data disks)

Prandaj, ne do të krijojmë një funksion dhe do ta quajmë Remove-AzrVirtualMachine — dhe do të fshijë jo vetëm VM në Azure, por edhe të gjitha elementet e mësipërme.

Shkruajmë rrugën standarde dhe fillimisht marrim objektin tonë (VM) duke përdorur komandën Get-AzVm. Për shembull, le të jetë kjo makinë WINSRV19 nga grupi i burimeve MyTestVMs.

Do ta ruajmë këtë objekt me të gjitha pronat e tij në një variabël $vm:

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

Pohoqim kontejnerin me skedarët e diagnostikës së ngarkesës

Kur krijoni një VM në Azure, përdoruesit u ofrohet gjithashtu të krijojnë një kontejner për ruajtjen e diagnostikës së ngarkesës (kontejneri i diagnostikës së ngarkesës), në mënyrë që në rast të problemeve me ngarkesën të ketë çfarë të konsultohet për rregullimin e tyre. Megjithatë, kur hiqet VM, ky kontejner vazhdon të ekzistojë pa qëllim. Le të rregullojmë këtë situatë.

  1. Së pari do të zbulojmë se kujt i takon ky llogari ruajtjeje — për këtë na nevojitet të gjejmë pronën storageUri në thellësitë e objektit DiagnosticsProfile të VM-së sonë. Për këtë, unë do të përdor një shprehje të rregullt të tillë:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Tani duhet të zbulojmë emrin e kontejnerit, dhe për këtë duhet të marrim ID-në e VM me komandën 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. Më pas, marrim emrin e grupit të burimeve, i cili i përket kontejnerit:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. Tani tani kemi gjithçka të nevojshme për të fshirë enën me komandën Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Po fshijmë VM

Tani do të fshijmë vetë makinën virtuale, fatmirësisht kemi krijuar tashmë një variabël $vm për objektin përkatës. Le të ekzekutojmë komandën Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Po fshijmë ndërfaqen rrjetore dhe IP-në publike

VM-ja jonë ka një (ose madje disa) ndërfaqe rrjetore (NICs) — për të fshirë ato që nuk janë më të nevojshme, do të kontrollojmë pronën NetworkInterfaces të objektit VM dhe do të fshijmë NIC me komandën Remove-AzNetworkInterface. Në rast se ka më shumë se një ndërfaqe, do të përdorim një cikël. Gjithashtu, për secilën NIC do të kontrollojmë pronën IpConfiguration për të parë nëse ndërfaqja ka një adresë IP publike. Nëse e gjejmë, do ta fshijmë me komandën Remove-AzPublicIpAddress.

Ja një shembull i tillë i kodit, ku ne shqyrtojmë të gjitha NICs në cikël, i fshijmë ato dhe kontrollojmë nëse ekziston një IP publike. Nëse ekziston, java shqyrtojmë pronën PublicIpAddress, marrimë emrin e burimit përkatës sipas ID-së dhe e fshijmë atë:


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

Fshijmë diskun sistemor

Disku i OS është një blob, për fshirjen e së cilit ka një komandë Remove-AzStorageBlob — por para se ta ekzekutojmë, do të duhet të caktojmë vlerat e nevojshme për parametrat e saj. Për këtë, do të nevojitet të marrim emrin e kontejnerit të storage-it që përmban diskun sistemor, dhe pastaj ta japim atë këtë komandë së bashku me llogarinë përkatëse të storage-it.

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

Fshijmë Blob-in e statusit të diskut sistemor

Për këtë, siç e keni menduar, marrim kontejnerin e storage-it ku ruhet ky disk, dhe, duke supozuar se blob-i në fund përmban status, i kalojmë parametrat për komandën e fshirjes Remove-AzStorageBlob:

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

Dhe, në fund, fshijmë disqet e të dhënave

VM-ja jonë mund të kishte disqe të dhënash që ishin bashkangjitur. Nëse nuk ka nevojë për to, le t'i fshijmë gjithashtu. Së pari do të analizojmë StorageProfile të VM-së tonë dhe do të gjejmë pronën Uri. Nëse ka disa disqe, do të organizojmë një cikël mbi URI. Për çdo URI do të gjejmë llogarinë përkatëse të ruajtjes përmes Get-AzStorageAccount. Atëherë do të analizojmë URI-në e ruajtjes për të nxjerrë emrin e nevojshëm të blob-it dhe t'ia kalojmë komandës për fshirje Remove-AzStorageBlob bashkë me llogarinë e ruajtjes. Ja si do të duket në kod:

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

Dhe ja se “ne arritëm në fundin e lumtur!” Tani nga këto fragmente duhet të mbledhim një të tërë. Autori i mirë Adam Bertram i është përgjigjur përdoruesve dhe e bëri vetë. Ja linku për skriptin përfundimtar të quajtur Remove-AzrVirtualMachine.ps1:

GitHub

Shpresoj se këto këshilla praktike do t'ju ndihmojnë të kurseni energjinë, kohën dhe burimet gjatë punës me Azure VMs.

Burimi: habr.com

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster