Maina un izdzēŔ Azure VM, izmantojot PowerShell

Ar PowerShell palīdzību inženieri un IT administratori veiksmīgi automatizē dažādas uzdevumus, strādājot ne tikai ar on-premises, bet arī ar mākoņu infrastruktūrām, konkrēti, ar Azure. Strādāt caur PowerShell daudzkārt ir ērtāk un ātrāk nekā caur Azure portālu. Pateicoties PowerShell multiplatformmai, to var izmantot jebkurā OS.

Nav svarÄ«gi, vai strādājat ar Ubuntu, Red Hat vai Windows — PowerShell palÄ«dzēs kontrolēt mākoņu resursus. Izmantojot moduli Azure PowerShell, piemēram, varat noteikt jebkuras Ä«paŔības virtuālajām maŔīnām.

Šajā rakstā mēs apskatīsim, kā var izmantot PowerShell, lai mainītu VM izmēru Azure mākoņos, kā arī lai dzēstu VM un ar to saistītos objektus.

Maina un izdzēŔ Azure VM, izmantojot PowerShell

Svarīgi! Neaizmirstiet notīrīt rokas ar dezinfekcijas līdzekli un sagatavoties darbam:

  • Jums bÅ«s nepiecieÅ”ams modulis Azure PowerShell Module — to var lejupielādēt no PowerShell Gallery, izmantojot komandu Install-Module Az.
  • Ir jāautentificējas Azure mākoņos, kur darbojas virtuālā maŔīna, izpildot komandu Connect-AzAccount.

Vispirms izveidosim skriptu, kas maina Azure VM izmēru. Atvērsim VS Code un saglabāsim jaunu PowerShell skriptu ar nosaukumu Resize-AzVirtualMachine.ps1 — tajā mēs paÅ”a piemēra gaitā pievienosim koda gabalus.

Paužam pieejamos VM izmērus.

Pirms maināt VM izmēru, ir jānoskaidro, kādi ir pieejamie izmēri virtuālajām maŔīnām Azure mākoņos. To var izdarÄ«t, izpildot komandu Get-AzVMSize.

Tātad, virtuālajai maŔīnai devvm01 no resursu grupas dev prasām visus iespējamās izmērus:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(Reālos uzdevumos, protams, vietā ResourceGroupName=dev un VMName=devvm01 jÅ«s norādÄ«sit savas vērtÄ«bas Å”iem parametriem.)

Komanda atgriezīs aptuveni Ŕādu sarakstu:

Maina un izdzēŔ Azure VM, izmantojot PowerShell

Tas ir viss iespējamais izmēru varianti, kurus var norādÄ«t Å”ai virtuālajai maŔīnai.

Mainām maŔīnas izmēru

Piemēram, mēs mainÄ«sim uz jauno izmēru Standard_B1ls — tas ir pirmajā vietā sarakstā augstāk. (Reālos uzdevumos, protams, jÅ«s izvēlaties jebkuru vajadzÄ«go izmēru.)

  1. Vispirms ar komandu Get-AzVM iegūstam informāciju par mūsu objektu (virtuālo maŔīnu), saglabājot to mainīgajā $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Pēc tam no Ŕī objekta ņemam Ä«paŔību .HardwareProfile.VmSize un iestādām vajadzÄ«go jauno vērtÄ«bu:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Un tagad vienkārÅ”i izpildām VM atjaunoÅ”anas komandu — Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Pārliecināmies, ka viss ir izdevies — tam mēs atkal pieprasām informāciju par mÅ«su objektu un aplÅ«kojam Ä«paÅ”umu $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Ja tur redzam Standard_B1ls — tad viss kārtÄ«bā, maŔīnas izmērs ir mainÄ«ts. Varam doties tālāk un turpināt veiksmÄ«gi — pārsayzēt vairākas VM, izmantojot masÄ«vu.

Bet kā ir ar VM dzēŔanu Azure?

Ar dzēŔanu nav tik vienkārÅ”i un acÄ«mredzami, kā varētu Ŕķist. Galu galā ir jādara jādzēŔ arÄ« vairāki resursi, kas saistÄ«ti ar Å”o maŔīnu, tostarp:

  • Boot diagnostics storage containers
  • Network interfaces
  • Publiskie IP adreses
  • Sistēmas disks un blob, kur tiek glabāta tā statuss
  • Dati diski (data disks)

Tāpēc mēs izveidosim funkciju un nosauksim to par Remove-AzrVirtualMachine — un tā dzēsÄ«s ne tikai Azure VM, bet arÄ« visus iepriekÅ” minētos.

Iet pa standarta ceļu un vispirms iegÅ«stam mÅ«su objektu (VM) ar komandu Get-AzVm. Piemēram, lai tā bÅ«tu maŔīna WINSRV19 no resursu grupas MyTestVMs.

Saglabāsim Ŕo objektu kopā ar visām tā īpaŔībām mainīgajā $vm:

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

DzēŔam boot diagnostic failu kontu

Izveidojot VM Azure, lietotājam tiek piedāvāta arÄ« iespēja izveidot boot diagnostics container, lai, ja ar boot ir problēmas, bÅ«tu ko izmantot problēmu risināŔanā. Taču, dzēŔot VM, Å”is konteiners paliek, joprojām pastāvot bezdarbÄ«bā. Labosim Å”o situāciju.

  1. Vispirms noskaidrosim, kuram storage kontam pieder Å”is konteiners — tam mēs meklēsim Ä«paŔību storageUri mÅ«su VM objekta iekÅ”ienē. DiagnosticsProfile Lai to izdarÄ«tu, es izmantoÅ”u Ŕādu regulāro izteiksmi:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value
  2. Tagad jāsaprot konteinera nosaukums, un tam vajag iegūt VM ID, izmantojot komandu 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. Tālāk iegūstam resursu grupas nosaukumu, kurai pieder konteiners:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. Un tagad mums ir viss nepiecieÅ”amais, lai dzēstu konteineru ar komandu Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

DzēŔam VM

Tagad izdzēsÄ«sim paÅ”u virtuālo maŔīnu, laimÄ«gā kārtā mēs jau esam izveidojuÅ”i mainÄ«go $vm attiecÄ«gajam objektam. Nu tad palaidÄ«sim komandu Remove-AzVm:

$null = $vm | Remove-AzVM -Force

DzēŔam tÄ«kla interfeisu un publisko IP adresi

MÅ«su VM ir palikuÅ”i viens (vai pat vairāki) tÄ«kla interfeisi (NICs) — lai tos dzēstu, jo tie vairs nav nepiecieÅ”ami, mēs pārskatÄ«sim Ä«paŔību NetworkInterfaces mÅ«su VM objektā un dzēŔam NIC ar komandu Remove-AzNetworkInterface. GadÄ«jumā, ja tÄ«kla interfeisu ir vairāk nekā viens, izmantojam ciklu. Turklāt katram NIC pārbaudām Ä«paŔību IpConfiguration vai interfeisam ir publiskā IP adrese. Ja tāda tiek atrasta, mēs to dzēsÄ«sim ar komandu Remove-AzPublicIpAddress.

Å eit ir piemērs tādam kodam, kurā mēs ciklā izskatām visus NICs, tos dzēŔam, pārbaudām, vai ir publiska IP adrese. Ja tāda ir, tad analizējam Ä«paŔību PublicIpAddress, iegÅ«stam pēc ID attiecÄ«gā resursa nosaukumu un to dzēŔam:


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

DzēŔam sistēmas disku

OS disks ir blobs, kuru dzēŔanai ir komanda Remove-AzStorageBlob — taču pirms tās izpildes jānorāda nepiecieÅ”amie parametru vērtÄ«bas. Tādēļ ir jāiegÅ«st nosaukums storāža konteineram, kurā ir sistēmas disks, un tikai tad to nodot Å”ai komandai kopā ar atbilstoÅ”o storāža kontu.

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

DzēŔam sistēmas diska statusa Blob

Lai to izdarÄ«tu, kā jÅ«s jau, iespējams, nojauÅ”at, mēs ņemam storāža konteineru, kurā tiek glabāts Å”is disks, un, pieņemot, ka blobs beigās satur status, nododam attiecÄ«gos parametrus dzēŔanas komandai Remove-AzStorageBlob:

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

Un, visbeidzot, izdzēsīsim datu diskus

MÅ«su VM varēja palikt datu diski, kas tika pievienoti tam. Ja tie nav nepiecieÅ”ami, izdzēsÄ«sim arÄ« tos. Sākumā analizēsim StorageProfile mÅ«su VM un atradÄ«sim Ä«paŔību Uri. Ja disku ir vairāk, organizēsim ciklu pēc URI. Ikvienam URI atradÄ«sim atbilstoÅ”o glabāŔanas kontu, izmantojot Get-AzStorageAccount. Pēc tam analizēsim glabāŔanas URI, lai izceltu nepiecieÅ”amo blob vārdu un nodotu to dzēŔanas komandai Remove-AzStorageBlob kopā ar glabāŔanas kontu. LÅ«k, kā tas izskatÄ«sies 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]
    }
}

Un nu "mēs esam nonākuÅ”i lÄ«dz laimÄ«gajam iznākumam!" Tagad no visiem Å”iem fragmentiem jāizveido viens vesels. Labais autors Ādams Bertrams atviegloja lietotājiem un izdarÄ«ja to pats. LÅ«k, links uz gala skriptu ar nosaukumu Remove-AzrVirtualMachine.ps1:

→ GitHub

Ceru, ka Å”ie praktiskie padomi noderēs, lai ietaupÄ«tu spēkus, laiku un lÄ«dzekļus, strādājot ar Azure VM.

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster