การแก้ไขและการลบ Azure VM โดยใช้ PowerShell

การใช้ PowerShell วิศวกรและผู้ดูแลระบบ IT ทำงานต่างๆ โดยอัตโนมัติได้สำเร็จเมื่อทำงานไม่เพียงแต่ในองค์กรเท่านั้น แต่ยังรวมถึงโครงสร้างพื้นฐานระบบคลาวด์ด้วย โดยเฉพาะอย่างยิ่งกับ Azure ในบางกรณี การทำงานผ่าน PowerShell จะสะดวกและรวดเร็วกว่าการทำงานผ่านพอร์ทัล Azure มาก เนื่องจากลักษณะข้ามแพลตฟอร์ม ทำให้ PowerShell สามารถใช้ได้กับระบบปฏิบัติการใดก็ได้

ไม่ว่าคุณจะใช้ Ubuntu, Red Hat หรือ Windows PowerShell สามารถช่วยคุณควบคุมทรัพยากรระบบคลาวด์ของคุณได้ การใช้โมดูล Azure PowerShellตัวอย่างเช่น คุณสามารถตั้งค่าคุณสมบัติใดๆ ของเครื่องเสมือนได้

ในบทความนี้ เราจะมาดูกันว่าคุณสามารถใช้ PowerShell เพื่อปรับขนาด VM ในระบบคลาวด์ Azure ได้อย่างไร รวมถึงลบ VM และออบเจ็กต์ที่เกี่ยวข้อง

การแก้ไขและการลบ Azure VM โดยใช้ PowerShell

ที่สำคัญ! อย่าลืมเช็ดมือด้วยเจลฆ่าเชื้อเพื่อเตรียมพร้อมทำงาน:

  • คุณจะต้องมีโมดูล โมดูล Azure PowerShell - สามารถดาวน์โหลดได้จาก PowerShell Gallery ด้วยคำสั่ง Install-Module Az.
  • คุณต้องรับรองความถูกต้องในระบบคลาวด์ Azure ที่เครื่องเสมือนทำงานอยู่โดยการรันคำสั่ง Connect-AzAccount.

ขั้นแรก มาสร้างสคริปต์ที่จะปรับขนาด Azure VM กัน มาเปิด VS Code และบันทึกสคริปต์ PowerShell ใหม่ที่เรียกว่า ปรับขนาด-AzVirtualMachine.ps1 — เราจะเพิ่มโค้ดบางส่วนลงไปตามตัวอย่างที่ดำเนินไป

เราขอขนาด VM ที่ใช้ได้

ก่อนที่คุณจะเปลี่ยนขนาด VM คุณต้องค้นหาขนาดที่ยอมรับได้สำหรับเครื่องเสมือนในระบบคลาวด์ Azure ในการทำเช่นนี้คุณต้องรันคำสั่ง Get-AzVMSize.

ดังนั้นสำหรับเครื่องเสมือน devvm01 จากกลุ่มทรัพยากร dev เราขอขนาดที่ยอมรับได้ทั้งหมดที่เป็นไปได้:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(แน่นอนว่าในปัญหาจริง ๆ แทนที่จะเป็น ชื่อกลุ่มทรัพยากร=dev и VMName=devvm01 คุณจะระบุค่าของคุณเองสำหรับพารามิเตอร์เหล่านี้)

คำสั่งจะส่งคืนสิ่งนี้:

การแก้ไขและการลบ Azure VM โดยใช้ 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 สาธารณะ
  • ดิสก์ระบบและหยดที่เก็บสถานะไว้
  • ดิสก์ข้อมูล

ดังนั้นเราจะสร้างฟังก์ชั่นและเรียกมันขึ้นมา Remove-AzrVirtualMachine - และจะลบไม่เพียงแต่ Azure VM เท่านั้น แต่ยังลบทั้งหมดที่กล่าวมาข้างต้นด้วย

เราใช้วิธีมาตรฐานและรับวัตถุของเรา (VM) ก่อนโดยใช้คำสั่ง Get-AzVm. เช่น ให้มันเป็นรถยนต์ WINSRV19 จากกลุ่มทรัพยากร MyTestVM.

มาบันทึกวัตถุนี้พร้อมกับคุณสมบัติทั้งหมดลงในตัวแปรกันดีกว่า $vm:

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

การลบคอนเทนเนอร์ด้วยไฟล์วินิจฉัยการบูต

เมื่อสร้าง VM ใน Azure ระบบจะขอให้ผู้ใช้สร้างคอนเทนเนอร์สำหรับจัดเก็บการวินิจฉัยการบูต (คอนเทนเนอร์การวินิจฉัยการบูต) ดังนั้นหากมีปัญหาในการบูทจะมีบางสิ่งที่ต้องหันไปหาการแก้ไขปัญหา อย่างไรก็ตาม เมื่อ VM ถูกลบ คอนเทนเนอร์นี้จะถูกปล่อยให้ดำรงอยู่ต่อไปโดยไร้จุดมุ่งหมายในขณะนี้ มาแก้ไขสถานการณ์นี้กัน

  1. ขั้นแรก มาดูกันว่าคอนเทนเนอร์นี้เป็นของบัญชีพื้นที่เก็บข้อมูลใด - เพื่อสิ่งนี้ เราจำเป็นต้องค้นหาคุณสมบัติ storageUri ในลำไส้ของวัตถุ DiagnosticsProfile วีเอ็มของเรา สำหรับสิ่งนี้ ฉันใช้นิพจน์ทั่วไปนี้:
    $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]

การลบ System Disk Status 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 ที่ต้องการแล้วส่งต่อไปยังคำสั่ง Delete 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]
    }
}

และตอนนี้ “เรามาถึงจุดจบที่มีความสุขแล้ว!” ตอนนี้เราจำเป็นต้องประกอบชิ้นส่วนทั้งหมดเป็นชิ้นเดียว Adam Bertram ผู้เขียนใจดีพบผู้ใช้ครึ่งทางและทำเอง นี่คือลิงค์ไปยังสคริปต์สุดท้ายที่เรียกว่า ลบ-AzrVirtualMachine.ps1:

GitHub

ฉันหวังว่าคุณจะพบเคล็ดลับที่เป็นประโยชน์เหล่านี้ในการช่วยคุณประหยัดเวลาและเงินเมื่อทำงานกับ Azure VM

ที่มา: will.com

เพิ่มความคิดเห็น