使用 PowerShell,工程師和 IT 管理員不僅在本地工作,而且在使用雲端基礎架構(尤其是 Azure)時成功地自動化了各種任務。 在某些情況下,透過 PowerShell 進行工作比透過 Azure 入口網站進行工作更方便且快速。 由於其跨平台特性,PowerShell 可以在任何作業系統上使用。
無論您使用的是 Ubuntu、Red Hat 還是 Windows,PowerShell 都可以幫助您控制雲端資源。 使用模組
在本文中,我們將了解如何使用 PowerShell 調整 Azure 雲端中 VM 的大小以及刪除 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 您將為這些參數指定您自己的值。)
該命令將返回如下內容:
這些都是可以為給定虛擬機器設定的所有可能的大小選項。
讓我們調整一下汽車的大小
例如,我們將調整大小到新的大小 標準_B1ls - 他在上面的名單上名列第一。 (當然,在實際應用中,您可以選擇所需的任何尺寸。)
- 首先使用命令
Get-AzVM
我們透過將物件(虛擬機器)儲存在變數中來獲取有關該物件(虛擬機器)的信息$virtualMachine
:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
- 然後我們從這個物件中取得屬性
.HardwareProfile.VmSize
並設定所需的新值:$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
- 現在我們只需執行 VM 更新指令 -
Update-AzVm
:Update-AzVM -VM devvm01 -ResourceGroupName dev
- 我們確保一切順利 - 為此,我們再次請求有關我們物件的資訊並查看屬性
$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時,也要求使用者建立用於儲存啟動診斷的容器(啟動診斷容器),以便在啟動出現問題時可以求助於故障排除。 但是,當虛擬機器被刪除時,該容器將繼續其現在毫無目的的存在。 讓我們解決這個問題。
- 首先,讓我們找出該容器屬於哪個儲存帳戶 - 為此我們需要找到屬性
storageUri
在物體的內部DiagnosticsProfile
我們的虛擬機器。 為此,我使用這個正規表示式:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
- 現在您需要找出容器的名稱,為此您需要使用以下命令來取得虛擬機器 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)
- 接下來,我們取得容器所屬資源組的名稱:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
- 現在我們已經擁有了使用命令刪除容器所需的一切
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:
→
我希望這些實用技巧有助於您在使用 Azure VM 時節省精力、時間和金錢。
來源: www.habr.com