PowerShell kullanarak Azure VM'lerini değiştirme ve silme

Mühendisler ve BT yöneticileri, PowerShell'i kullanarak yalnızca şirket içi değil aynı zamanda bulut altyapıları, özellikle de Azure ile çalışırken çeşitli görevleri başarıyla otomatikleştiriyor. Bazı durumlarda PowerShell üzerinden çalışmak Azure portalı üzerinden çalışmaktan çok daha rahat ve hızlıdır. Platformlar arası yapısı sayesinde PowerShell herhangi bir işletim sisteminde kullanılabilir.

İster Ubuntu, Red Hat veya Windows çalıştırıyor olun, PowerShell bulut kaynaklarınızı kontrol etmenize yardımcı olabilir. Modülün kullanılması Azure PowerShellörneğin sanal makinelerin herhangi bir özelliğini ayarlayabilirsiniz.

Bu makalede, Azure bulutundaki bir VM'yi yeniden boyutlandırmak ve bir VM'yi ve onunla ilişkili nesneleri silmek için PowerShell'i nasıl kullanabileceğinize bakacağız.

PowerShell kullanarak Azure VM'lerini değiştirme ve silme

Önemli! İşe hazırlanırken ellerinizi dezenfektanla silmeyi unutmayın:

  • Bir modüle ihtiyacınız olacak Azure PowerShell Modülü - PowerShell Gallery'den şu komutla indirilebilir: Install-Module Az.
  • Komutu çalıştırarak sanal makinenin çalıştığı Azure bulutunda kimlik doğrulaması yapmanız gerekir. Connect-AzAccount.

Öncelikle bir Azure VM'yi yeniden boyutlandıracak bir betik oluşturalım. VS Code'u açalım ve adlı yeni bir PowerShell betiğini kaydedelim. AzVirtualMachine.ps1'i yeniden boyutlandır — Örnek ilerledikçe buna kod parçaları ekleyeceğiz.

Mevcut VM boyutlarını talep ediyoruz

VM boyutunu değiştirmeden önce Azure bulutundaki sanal makineler için kabul edilebilir boyutların neler olduğunu bulmanız gerekir. Bunu yapmak için komutu çalıştırmanız gerekir Get-AzVMSize.

Yani sanal makine için devvm01 kaynak grubundan dev Mümkün olan tüm kabul edilebilir boyutları talep ediyoruz:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(Gerçek problemlerde elbette KaynakGrubuAdı=dev и VMAdı=devvm01 bu parametreler için kendi değerlerinizi belirleyeceksiniz.)

Komut şunun gibi bir şey döndürecektir:

PowerShell kullanarak Azure VM'lerini değiştirme ve silme

Bunların tümü, belirli bir sanal makine için ayarlanabilecek olası boyut seçenekleridir.

Arabayı yeniden boyutlandıralım

Örneğin, yeni bir boyuta göre yeniden boyutlandıracağız Standart_B1ls - yukarıdaki listede ilk sırada yer alıyor. (Gerçek hayattaki uygulamalarda elbette ihtiyacınız olan boyutu seçersiniz.)

  1. İlk önce komutu kullanarak Get-AzVM nesnemiz (sanal makine) hakkında onu bir değişkende saklayarak bilgi alırız $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Daha sonra bu nesnenin özelliğini alıyoruz .HardwareProfile.VmSize ve istenen yeni değeri ayarlayın:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Ve şimdi sadece VM güncelleme komutunu yürütüyoruz - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Her şeyin yolunda gittiğinden emin oluyoruz - bunun için tekrar nesnemiz hakkında bilgi talep ediyoruz ve mülke bakıyoruz $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Eğer orada görürsek Standart_B1ls - bu her şeyin yolunda olduğu, arabanın boyutunun değiştiği anlamına gelir. Daha da ileri gidebilir ve bir dizi kullanarak birden fazla VM'yi aynı anda yeniden boyutlandırarak başarınızı artırabilirsiniz.

Azure'da bir VM'yi silmeye ne dersiniz?

Silme işleminde her şey göründüğü kadar basit ve anlaşılır değildir. Sonuçta, bu makineyle ilişkili aşağıdakiler de dahil olmak üzere bir dizi kaynağın kaldırılması gerekir:

  • Önyükleme tanılama depolama kapsayıcıları
  • Ağ arayüzleri
  • Genel IP adresleri
  • Durumunun depolandığı sistem diski ve blob
  • Veri diskleri

Bu nedenle bir fonksiyon yaratıp onu çağıracağız. Remove-AzrVirtualMachine - ve yalnızca Azure VM'yi değil aynı zamanda yukarıdakilerin tümünü de silecektir.

Standart yola gidiyoruz ve ilk önce komutu kullanarak nesnemizi (VM) alıyoruz Get-AzVm. Mesela bir araba olsun WINSRV19 kaynak grubundan MyTestVM'ler.

Bu nesneyi tüm özellikleriyle birlikte bir değişkene kaydedelim $vm:

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

Önyükleme tanılama dosyalarının bulunduğu kapsayıcıyı kaldırma

Azure'da bir VM oluştururken, kullanıcıdan ayrıca önyükleme tanılamalarını (önyükleme tanılama kapsayıcısı) depolamak için bir kapsayıcı oluşturması istenir; böylece önyüklemeyle ilgili sorunlar varsa sorun giderme için başvurulacak bir şey olur. Ancak VM silindiğinde bu konteyner artık amaçsız varlığını sürdürmek üzere bırakılır. Bu durumu düzeltelim.

  1. Öncelikle bu konteynerin hangi depolama hesabına ait olduğunu bulalım - bunun için özelliği bulmamız gerekiyor storageUri nesnenin bağırsaklarında DiagnosticsProfile VM'miz. Bunun için şu normal ifadeyi kullanıyorum:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Şimdi konteynerin adını bulmanız gerekiyor ve bunun için komutu kullanarak VM kimliğini almanız gerekiyor. 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. Daha sonra konteynerin ait olduğu kaynak grubunun adını alırız:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. Artık konteyneri komutla silmek için ihtiyacımız olan her şeye sahibiz Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

VM'yi kaldırma

Şimdi zaten bir değişken oluşturduğumuz için sanal makinenin kendisini silelim. $vm karşılık gelen nesne için. Peki, komutu çalıştıralım Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Ağ arayüzünü ve genel IP adresini kaldırma

VM'mizde hala bir (veya hatta birkaç) ağ arayüzü (NIC) var; bunları gereksiz olarak kaldırmak için, gelin özelliği inceleyelim NetworkInterfaces VM nesnemizi ve NIC'yi komutla silin Remove-AzNetworkInterface. Birden fazla ağ arayüzünün olması durumunda döngü kullanırız. Aynı zamanda her NIC için mülkü kontrol edeceğiz IpConfiguration Arayüzün genel bir IP adresine sahip olup olmadığını belirlemek için. Bulunursa komutuyla kaldıracağız Remove-AzPublicIpAddress.

İşte böyle bir kodun bir örneği: Tüm NIC'leri bir döngü halinde inceliyoruz, siliyoruz ve genel bir IP olup olmadığını kontrol ediyoruz. Varsa, özelliği ayrıştırın PublicIpAddress, ilgili kaynağın adını kimliğe göre bulun ve silin:


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

Sistem diskinin çıkarılması

İşletim sistemi diski, onu silme komutunun bulunduğu bir blobdur Remove-AzStorageBlob - ancak çalıştırmadan önce parametreleri için gerekli değerleri ayarlamanız gerekecektir. Bunu yapmak için özellikle sistem diskini içeren depolama kabının adını almanız ve ardından bunu ilgili depolama hesabıyla birlikte bu komuta iletmeniz gerekir.

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

Sistem Diski Durumu Blobunu Kaldırma

Bunu yapmak için, muhtemelen tahmin ettiğiniz gibi, bu diskin depolandığı depolama kabını alıyoruz ve sondaki blobun şunları içerdiğini ima ediyoruz: status, ilgili parametreleri silme komutuna iletin Remove-AzStorageBlob:

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

Ve son olarak veri disklerini kaldırıyoruz

VM'mizde hâlâ verilerin eklendiği diskler bulunabilir. İhtiyaç duyulmadığı takdirde onları da sileceğiz. Önce onu analiz edelim StorageProfile VM'miz ve özelliği bulun Uri. Birkaç disk varsa, buna göre bir döngü düzenleriz. URI. Her URI için karşılık gelen depolama hesabını aşağıdakileri kullanarak bulacağız: Get-AzStorageAccount. Ardından istenen blob adını ayıklamak ve silme komutuna iletmek için depolama URI'sini ayrıştırın Remove-AzStorageBlob bir depolama hesabıyla birlikte. Kodda şöyle görünecektir:

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

Ve artık “mutlu sona ulaştık!” Şimdi tüm bu parçalardan tek bir bütün oluşturmamız gerekiyor. Nazik yazar Adam Bertram kullanıcılarla yarı yolda buluştu ve bunu kendisi yaptı. İşte adı verilen son betiğin bağlantısı Kaldır-AzrVirtualMachine.ps1:

GitHub

Azure VM'lerle çalışırken çabadan, zamandan ve paradan tasarruf etmenize yardımcı olacak bu pratik ipuçlarını yararlı bulacağınızı umuyorum.

Kaynak: habr.com

Yorum ekle