Modifi kaj forigo de Azure VMs uzante PowerShell

Uzante PowerShell, inĝenieroj kaj IT-administrantoj sukcese aŭtomatigas diversajn taskojn kiam ili laboras ne nur kun surlokaj, sed ankaŭ kun nubaj infrastrukturoj, precipe kun Azure. En iuj kazoj, labori per PowerShell estas multe pli oportuna kaj pli rapida ol labori per la Azure-portalo. Danke al ĝia transplatforma naturo, PowerShell povas esti uzata en ajna operaciumo.

Ĉu vi rulas Ubuntu, Red Hat aŭ Vindozon, PowerShell povas helpi vin kontroli viajn nubajn rimedojn. Uzante la modulon Azure PowerShell, ekzemple, vi povas agordi ajnajn ecojn de virtualaj maŝinoj.

En ĉi tiu artikolo, ni rigardos kiel vi povas uzi PowerShell por regrandigi VM en la Azure-nubo, kaj ankaŭ forigi VM kaj ĝiajn rilatajn objektojn.

Modifi kaj forigo de Azure VMs uzante PowerShell

Grava! Ne forgesu viŝi viajn manojn per sanigilo por prepari por laboro:

  • Vi bezonos modulon Azure PowerShell Modulo - ĝi povas esti elŝutita de PowerShell Gallery per la komando Install-Module Az.
  • Vi devas aŭtentikigi en la Azure-nubo, kie la virtuala maŝino funkcias, rulante la komandon Connect-AzAccount.

Unue, ni kreu skripton, kiu regrandigos Azure VM. Ni malfermu VS Code kaj konservu novan PowerShell-skripton nomitan Regrandigi-AzVirtualMachine.ps1 — ni aldonos pecojn de kodo al ĝi dum la ekzemplo progresas.

Ni petas la disponeblajn VM-grandojn

Antaŭ ol vi ŝanĝas la grandecon de VM, vi devas ekscii, kiaj estas la akcepteblaj grandecoj por virtualaj maŝinoj en la Azure-nubo. Por fari tion, vi devas ruli la komandon Get-AzVMSize.

Do por la virtuala maŝino devvm01 de rimeda grupo dev Ni petas ĉiujn eblajn akcepteblajn grandecojn:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(En realaj problemoj, kompreneble, anstataŭ ResourceGroupName=dev и VMName=devvm01 vi specifos viajn proprajn valorojn por ĉi tiuj parametroj.)

La komando resendos ion tian:

Modifi kaj forigo de Azure VMs uzante PowerShell

Ĉi tiuj estas ĉiuj eblaj grandecaj elektoj, kiujn oni povas agordi por donita virtuala maŝino.

Ni regrandigu la aŭton

Ekzemple, ni regrandigos al nova grandeco Standard_B1ls - li estas en la unua loko en la supra listo. (En realaj aplikoj, kompreneble, vi elektas kian ajn grandecon vi bezonas.)

  1. Unue uzante la komandon Get-AzVM ni ricevas informojn pri nia objekto (virtuala maŝino) stokante ĝin en variablo $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Tiam ni prenas la posedaĵon de ĉi tiu objekto .HardwareProfile.VmSize kaj starigu la deziratan novan valoron:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Kaj nun ni simple plenumas la komandon de ĝisdatigo de VM - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Ni certigas, ke ĉio iris bone - por fari tion, ni denove petas informojn pri nia objekto kaj rigardas la posedaĵon $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Se ni vidos tie Standard_B1ls - tio signifas, ke ĉio estas en ordo, la grandeco de la aŭto estis ŝanĝita. Vi povas iri plu kaj konstrui vian sukceson regrandigante plurajn VM-ojn samtempe uzante tabelon.

Kio pri forigo de VM en Azure?

Kun forigo, ne ĉio estas tiel simpla kaj simpla kiel ĝi povus ŝajni. Post ĉio, necesas forigi kelkajn rimedojn asociitajn kun ĉi tiu maŝino, inkluzive de:

  • Lanĉu diagnozajn stokadujojn
  • Retaj interfacoj
  • Publikaj IP-adresoj
  • Sistemdisko kaj blob kie ĝia stato estas stokita
  • Datumaj diskoj

Tial ni kreos funkcion kaj nomos ĝin Remove-AzrVirtualMachine - kaj ĝi forigos ne nur Azure VM, sed ankaŭ ĉion supre.

Ni iras laŭ la norma vojo kaj unue ricevas nian objekton (VM) uzante la komandon Get-AzVm. Ekzemple, ĝi estu aŭto WINSRV19 de rimeda grupo MyTestVMs.

Ni konservu ĉi tiun objekton kune kun ĉiuj ĝiaj trajtoj en variablon $vm:

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

Forigante la ujon kun lanĉaj diagnozaj dosieroj

Kreante VM en Azure, la uzanto ankaŭ estas petata krei ujon por stoki ekfunkciigi diagnozojn (bootdiagnozo-ujo), tiel ke se estas problemoj kun ekŝargo, estas io al kiu turni sin por solvi problemojn. Tamen, kiam la VM estas forigita, ĉi tiu ujo restas por daŭrigi sian nun sencelan ekziston. Ni riparu ĉi tiun situacion.

  1. Unue, ni eksciu, al kiu konserva konto apartenas ĉi tiu ujo - por tio ni devas trovi la posedaĵon storageUri en la intestoj de la objekto DiagnosticsProfile nia VM. Por tio mi uzas ĉi tiun regulan esprimon:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Nun vi devas eltrovi la nomon de la ujo, kaj por tio vi devas akiri la VM-ID per la komando 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. Poste, ni ricevas la nomon de la rimeda grupo al kiu apartenas la ujo:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. Kaj nun ni havas ĉion, kion ni bezonas por forigi la ujon per la komando Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Forigante la VM

Nun ni forigu la virtualan maŝinon mem, ĉar ni jam kreis variablon $vm por la responda objekto. Nu, ni rulu la komandon Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Forigante la retan interfacon kaj publikan IP-adreson

Nia VM ankoraŭ havas unu (aŭ eĉ plurajn) retajn interfacojn (NIC) - por forigi ilin kiel nenecesajn, ni trarigardu la posedaĵon. NetworkInterfaces nian VM-objekton kaj forigu la NIC per la komando Remove-AzNetworkInterface. Se ekzistas pli ol unu reto-interfaco, ni uzas buklon. Samtempe, por ĉiu NIC ni kontrolos la posedaĵon IpConfiguration por determini ĉu la interfaco havas publikan IP-adreson. Se oni trovos, ni forigos ĝin per la komando Remove-AzPublicIpAddress.

Jen ekzemplo de tia kodo, kie ni trarigardas ĉiujn NIC-ojn en buklo, forigas ilin kaj kontrolas ĉu ekzistas publika IP. Se ekzistas, tiam analizu la posedaĵon PublicIpAddress, trovu la nomon de la responda rimedo per ID kaj forigu ĝin:


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

Forigante la sisteman diskon

La OS-disko estas blob, por kiu estas komando por forigi ĝin Remove-AzStorageBlob - sed antaŭ ol ekzekuti ĝin, vi devos agordi la postulatajn valorojn por ĝiaj parametroj. Por fari tion, precipe, vi devas ricevi la nomon de la stokadujo enhavanta la sisteman diskon, kaj poste transdoni ĝin al ĉi tiu komando kune kun la responda stoka konto.

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

Forigante la Sistema Disk-Stato Blob

Por fari tion, kiel vi verŝajne jam divenis, ni prenas la konservujon en kiu ĉi tiu disko estas stokita, kaj, implicante, ke la blob ĉe la fino enhavas status, transdonu la respondajn parametrojn al la forigita komando Remove-AzStorageBlob:

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

Kaj fine, ni forigas la datumdiskojn

Nia VM ankoraŭ povus havi diskojn kun datumoj alkroĉitaj al ĝi. Se ili ne estas bezonataj, ni ankaŭ forigos ilin. Ni unue analizu ĝin StorageProfile nian VM kaj trovu la posedaĵon Uri. Se estas pluraj diskoj, ni organizas ciklon laŭ URI. Por ĉiu URI, ni trovos la respondan stokan konton uzante Get-AzStorageAccount. Tiam analizu la stokan URI por ĉerpi la deziratan blobnomon kaj transdonu ĝin al la foriga komando Remove-AzStorageBlob kune kun konserva konto. Jen kiel ĝi aspektus en kodo:

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

Kaj nun "ni atingis la feliĉan finon!" Nun ni devas kunmeti ununuran tuton el ĉiuj ĉi fragmentoj. La afabla aŭtoro Adam Bertram renkontis la uzantojn duonvoje kaj faris ĝin mem. Jen ligo al la fina skripto nomita Forigi-AzrVirtualMachine.ps1:

GitHub

Mi esperas, ke vi trovos ĉi tiujn praktikajn konsiletojn utilaj por ŝpari al vi penadon, tempon kaj monon kiam vi laboras kun Azure VMs.

fonto: www.habr.com

Aldoni komenton