Тағир додан ва нест кардани VMs Azure бо истифода аз PowerShell

Бо истифода аз PowerShell, муҳандисон ва маъмурони IT вазифаҳои гуногунро ҳангоми кор на танҳо бо дохили бино, балки бо инфрасохтори абрӣ, алахусус бо Azure бомуваффақият автоматӣ мекунанд. Дар баъзе ҳолатҳо, кор тавассути PowerShell назар ба кор тавассути портали Azure хеле қулайтар ва тезтар аст. Бо шарофати табиати кросс-платформаи худ, PowerShell метавонад дар ҳама гуна системаи амалиётӣ истифода шавад.

Новобаста аз он ки шумо Ubuntu, Red Hat ё Windows-ро идора мекунед, PowerShell метавонад ба шумо кӯмак кунад, ки захираҳои абрии худро идора кунед. Истифодаи модул Azure PowerShell, масалан, шумо метавонед ҳама гуна хосиятҳои мошинҳои виртуалиро таъин кунед.

Дар ин мақола, мо дида мебароем, ки чӣ тавр шумо метавонед PowerShell-ро барои тағир додани андозаи VM дар абри Azure истифода баред ва инчунин VM ва объектҳои алоқаманди онро нест кунед.

Тағир додан ва нест кардани VMs Azure бо истифода аз PowerShell

Муҳимтарин! Фаромӯш накунед, ки дастҳои худро бо антисептик тоза кунед, то ба кор омода шавед:

  • Ба шумо модул лозим мешавад Модули Azure PowerShell - онро аз Галереяи PowerShell бо фармон зеркашӣ кардан мумкин аст Install-Module Az.
  • Шумо бояд дар абри Azure аутентификатсия кунед, ки мошини виртуалӣ тавассути иҷро кардани фармон кор мекунад Connect-AzAccount.

Аввалан, биёед скрипте созем, ки андозаи Azure VM-ро тағир диҳад. Биёед VS Code-ро кушоем ва скрипти нави PowerShell-ро захира кунем Resize-AzVirtualMachine.ps1 — мо дар баробари пешрафти мисол ба он порчахои код илова мекунем.

Мо андозаи дастраси VM-ро талаб мекунем

Пеш аз тағир додани андозаи VM, шумо бояд фаҳмед, ки андозаҳои қобили қабул барои мошинҳои виртуалӣ дар абри Azure чӣ гунаанд. Барои ин шумо бояд фармонро иҷро кунед Get-AzVMSize.

Ҳамин тавр, барои мошини виртуалӣ devm01 аз гурӯҳи захираҳо д Мо ҳама андозаи имконпазирро талаб мекунем:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(Дар мушкилоти воқеӣ, албатта, ба ҷои ResourceGroupName=dev и VMName=devvm01 шумо арзишҳои худро барои ин параметрҳо муайян мекунед.)

Фармон чизе монанди ин бармегардонад:

Тағир додан ва нест кардани VMs Azure бо истифода аз PowerShell

Инҳо ҳама вариантҳои андозаи имконпазир мебошанд, ки метавонанд барои як мошини маҷозӣ муқаррар карда шаванд.

Биёед андозаи мошинро тағир диҳем

Масалан, мо андозаи худро ба андозаи нав тағир медиҳем Стандарт_B1ls — вай дар руйхати боло дар чои якум аст. (Дар замимаҳои воқеӣ, албатта, шумо ҳар андозаеро, ки ба шумо лозим аст, интихоб мекунед.)

  1. Аввалан бо истифода аз фармон Get-AzVM мо дар бораи объекти худ (мошини виртуалӣ) маълумотро тавассути нигоҳ доштани он дар тағирёбанда мегирем $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Пас аз ин объект моликиятро мегирем .HardwareProfile.VmSize ва арзиши нави дилхоҳро таъин кунед:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Ва ҳоло мо танҳо фармони навсозии VM -ро иҷро мекунем - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Мо боварӣ ҳосил мекунем, ки ҳама чиз хуб буд - барои ин, мо боз дар бораи объекти худ маълумот дархост мекунем ва ба амвол назар мекунем $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Агар дар он чо бубинем Стандарт_B1ls — ин маънои онро дорад, ки ҳама чиз дуруст аст, андозаи мошин иваз карда шудааст. Шумо метавонед бо тағир додани андозаи якчанд VM-ҳо дар як вақт бо истифода аз массив минбаъд рафта, муваффақияти худро мустаҳкам кунед.

Дар бораи нест кардани VM дар Azure чӣ гуфтан мумкин аст?

Бо ҳазф кардан, на ҳама чиз он қадар содда ва содда аст, ки ба назар мерасад. Дар ниҳоят, як қатор захираҳои марбут ба ин мошинро нест кардан лозим аст, аз ҷумла:

  • Контейнерҳои нигаҳдории ташхиси пурборкунанда
  • Интерфейсҳои шабакавӣ
  • Суроғаҳои IP умумӣ
  • Диски система ва blob, ки ҳолати он нигоҳ дошта мешавад
  • Дискҳои маълумот

Аз ин рӯ, мо функсия эҷод мекунем ва онро даъват мекунем Remove-AzrVirtualMachine - ва он на танҳо Azure VM, балки ҳамаи чизҳои дар боло зикршударо нест мекунад.

Мо бо роҳи стандартӣ меравем ва аввал бо истифода аз фармон объекти худро (VM) мегирем Get-AzVm. Масалан, бигзор он мошин бошад WINSRV19 аз гурӯҳи захираҳо MyTestVMs.

Биёед ин объектро бо тамоми хосиятҳои он ба тағирёбанда захира кунем $vm:

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

Хориҷ кардани контейнер бо файлҳои ташхиси пурборкунанда

Ҳангоми сохтани VM дар Azure, аз корбар инчунин хоҳиш карда мешавад, ки барои нигоҳдории ташхиси пурборкунанда (контейнери ташхиси пурборкунанда) як контейнер эҷод кунад, то ки агар мушкилот дар боркунӣ вуҷуд дошта бошад, барои бартараф кардани мушкилот чизе лозим аст. Аммо, вақте ки VM нест карда мешавад, ин контейнер боқӣ мемонад, то мавҷудияти ҳоло бемаънои худро идома диҳад. Биёед ин вазъиятро ислоҳ кунем.

  1. Аввалан, биёед бифаҳмем, ки ин контейнер ба кадом ҳисоби нигаҳдорӣ тааллуқ дорад - барои ин мо бояд амволро пайдо кунем storageUri дар рудаи объект DiagnosticsProfile VM-и мо. Барои ин ман ин ибораи муқаррариро истифода мебарам:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Акнун шумо бояд номи контейнерро фаҳмед ва барои ин шумо бояд бо истифода аз фармон VM ID-ро гиред 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. Баъдан, мо номи гурӯҳи захираҳоро мегирем, ки контейнер ба он тааллуқ дорад:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. Ва ҳоло мо ҳама чизеро дорем, ки бо фармони худ контейнерро нест кунем Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Хориҷ кардани VM

Акнун биёед худи мошини виртуалиро нест кунем, зеро мо аллакай тағирёбанда эҷод кардаем $vm барои объекти дахлдор. Хуб, биёед фармонро иҷро кунем Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Хориҷ кардани интерфейси шабака ва суроғаи IP умумӣ

VM-и мо ҳоло ҳам як (ё ҳатто якчанд) интерфейси шабакавӣ (NIC) дорад - барои нест кардани онҳо ҳамчун нолозим, биёед аз моликият гузаред NetworkInterfaces объекти VM мо ва нест кардани NIC бо фармон Remove-AzNetworkInterface. Дар сурати зиёда аз як интерфейси шабакавӣ, мо ҳалқаро истифода мебарем. Дар баробари ин, барои ҳар як NIC мо амволро тафтиш мекунем IpConfiguration барои муайян кардани он, ки интерфейс суроғаи IP-и оммавӣ дорад. Агар яке ёфт шавад, мо онро бо фармон хориҷ мекунем Remove-AzPublicIpAddress.

Ин аст мисоли маҳз чунин код, ки дар он мо ҳамаи NIC-ҳоро дар як давр дида мебароем, онҳоро нест мекунем ва тафтиш мекунем, ки оё IP-и ҷамъиятӣ вуҷуд дорад. Агар мавҷуд бошад, пас амволро таҳлил кунед PublicIpAddress, номи манбаи мувофиқро аз рӯи ID пайдо кунед ва онро нест кунед:


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

Хориҷ кардани диски система

Диски ОС блок аст, ки барои он фармони нест кардани он мавҷуд аст Remove-AzStorageBlob - аммо пеш аз иҷрои он, шумо бояд арзишҳои заруриро барои параметрҳои он муқаррар кунед. Барои ин, аз ҷумла, шумо бояд номи контейнери нигаҳдории дорои диски системаро гиред ва сипас онро дар якҷоягӣ бо ҳисоби нигаҳдории мувофиқ ба ин фармон гузаронед.

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

Хориҷ кардани Blob ҳолати диски система

Барои ин, тавре ки шумо аллакай тахмин кардаед, мо контейнери нигоҳдории онро мегирем, ки дар он ин диск нигоҳ дошта мешавад ва ин маънои онро дорад, ки blob дар охири он мавҷуд аст. status, параметрҳои мувофиқро ба фармони нест кардан гузаронед Remove-AzStorageBlob:

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

Ва ниҳоят, мо дискҳои маълумотро хориҷ мекунем

VM-и мо ҳоло ҳам метавонист дискҳое дошта бошад, ки ба он маълумот замима карда шудаанд. Агар онҳо лозим набошанд, мо онҳоро низ нест мекунем. Биёед аввал онро таҳлил кунем StorageProfile VM-и мо ва пайдо кардани амвол Uri. Агар якчанд диск мавҷуд бошад, мо давраро мувофиқи он ташкил мекунем URI. Барои ҳар як URI, мо бо истифода аз ҳисоби нигаҳдории мувофиқ пайдо хоҳем кард Get-AzStorageAccount. Сипас URI-и нигаҳдорӣ таҳлил кунед, то номи дилхоҳи blob-ро истихроҷ кунед ва онро ба фармони нест кунед Remove-AzStorageBlob дар якҷоягӣ бо ҳисоби нигоҳдорӣ. Ин аст он чизе ки дар код чунин хоҳад буд:

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

Ва ҳоло "мо ба анҷоми хушбахтона расидем!" Ҳоло ба мо лозим аст, ки аз ҳамаи ин порчаҳо як ягона ҷамъ кунем. Муаллифи меҳрубон Адам Бертрам бо корбарон дар нисфи роҳ вохӯрд ва ин корро худаш анҷом дод. Дар ин ҷо як истиноди скрипти ниҳоӣ номида мешавад Remove-AzrVirtualMachine.ps1:

GitHub

Ман умедворам, ки шумо ин маслиҳатҳои амалиро барои сарфаи саъю кӯшиш, вақт ва пул ҳангоми кор бо Azure VMs муфид хоҳед ёфт.

Манбаъ: will.com

Илова Эзоҳ