使用 PowerShell 更改和刪除 Azure VM

使用 PowerShell,工程師和 IT 管理員不僅在本地工作,而且在使用雲端基礎架構(尤其是 Azure)時成功地自動化了各種任務。 在某些情況下,透過 PowerShell 進行工作比透過 Azure 入口網站進行工作更方便且快速。 由於其跨平台特性,PowerShell 可以在任何作業系統上使用。

無論您使用的是 Ubuntu、Red Hat 還是 Windows,PowerShell 都可以幫助您控制雲端資源。 使用模組 Azure PowerShell例如,您可以設定虛擬機器的任何屬性。

在本文中,我們將了解如何使用 PowerShell 調整 Azure 雲端中 VM 的大小以及刪除 VM 及其關聯物件。

使用 PowerShell 更改和刪除 Azure VM

重要的信息! 不要忘記用消毒劑擦拭雙手以準備工作:

  • 你將需要一個模組 Azure PowerShell 模組 - 可以使用以下命令從 PowerShell Gallery 下載 Install-Module Az.
  • 您需要透過執行以下命令在執行虛擬機器的 Azure 雲端中進行身份驗證 Connect-AzAccount.

首先,讓我們建立一個用於調整 Azure VM 大小的腳本。 讓我們打開 VS Code 並保存一個名為的新 PowerShell 腳本 調整大小-AzVirtualMachine.ps1 - 隨著範例的進展,我們將向其中添加程式碼片段。

我們請求可用的 VM 大小

在更改 VM 大小之前,需要了解 Azure 雲端中虛擬機器可接受的大小。 為此,您需要運行命令 Get-AzVMSize.

那麼對於虛擬機 devvm01 來自資源組 開發 我們要求所有可能可接受的尺寸:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(當然,在實際問題中,而不是 資源組名稱=dev и 虛擬機器名稱=devvm01 您將為這些參數指定您自己的值。)

該命令將返回如下​​內容:

使用 PowerShell 更改和刪除 Azure VM

這些都是可以為給定虛擬機器設定的所有可能的大小選項。

讓我們調整一下汽車的大小

例如,我們將調整大小到新的大小 標準_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 - 這意味著一切都井然有序,汽車的尺寸已經改變。 您可以使用陣列一次調整多個虛擬機器的大小,從而更進一步並取得成功。

在 Azure 中刪除 VM 怎麼樣?

透過刪除,並非所有事情都像看起來那麼簡單和直接。 畢竟,需要刪除與該機器相關的許多資源,包括:

  • 啟動診斷儲存容器
  • 網絡接口
  • 公有IP位址
  • 系統磁碟和儲存其狀態的 blob
  • 資料磁碟

因此,我們將創建一個函數並調用它 Remove-AzrVirtualMachine - 它不僅會刪除 Azure VM,還會刪除上述所有內容。

我們採用標準方式,首先使用命令來取得我們的物件(VM) Get-AzVm。 例如,假設它是一輛汽車 WINSRV19 來自資源組 我的測試虛擬機.

讓我們將該物件及其所有屬性保存到一個變數中 $vm:

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

刪除帶有啟動診斷檔案的容器

在Azure中建立VM時,也要求使用者建立用於儲存啟動診斷的容器(啟動診斷容器),以便在啟動出現問題時可以求助於故障排除。 但是,當虛擬機器被刪除時,該容器將繼續其現在毫無目的的存在。 讓我們解決這個問題。

  1. 首先,讓我們找出該容器屬於哪個儲存帳戶 - 為此我們需要找到屬性 storageUri 在物體的內部 DiagnosticsProfile 我們的虛擬機器。 為此,我使用這個正規表示式:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. 現在您需要找出容器的名稱,為此您需要使用以下命令來取得虛擬機器 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 為對應的物件。 好吧,讓我們運行命令 Remove-AzVm:

$null = $vm | Remove-AzVM -Force

刪除網路介面和公用 IP 位址

我們的虛擬機器仍然有一個(甚至多個)網路介面(NIC) - 為了刪除不必要的它們,讓我們檢查一下屬性 NetworkInterfaces 我們的 VM 物件並使用命令刪除 NIC Remove-AzNetworkInterface。 如果有多個網路接口,我們使用循環。 同時,對於每個NIC我們都會檢查屬性 IpConfiguration 判斷介面是否有公網IP位址。 如果找到,我們將使用以下命令將其刪除 Remove-AzPublicIpAddress.

以下是此類程式碼的範例,我們循環查看所有網路卡,將其刪除,然後檢查是否有公用 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
        }
    }
}

取出系統磁碟

OS磁碟是一個blob,有一個指令可以刪除它 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

最後,我們刪除資料磁碟

我們的虛擬機器仍然可以擁有附加了資料的磁碟。 如果不需要,我們也會將其刪除。 我們先來解析一下 StorageProfile 我們的虛擬機器並找到該屬性 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]
    }
}

現在“我們已經達到了幸福的結局!” 現在我們需要將所有這些碎片組裝成一個整體。 好心的作者Adam Bertram半路遇見了用戶,自己也做了。 這是最終腳本的鏈接,名為 刪除-AzrVirtualMachine.ps1:

GitHub上

我希望這些實用技巧有助於您在使用 Azure VM 時節省精力、時間和金錢。

來源: www.habr.com

添加評論