اصلاح و حذف ماشین های مجازی Azure با استفاده از PowerShell

با استفاده از PowerShell، مهندسان و مدیران IT با موفقیت کارهای مختلف را هنگام کار نه تنها با داخل محل، بلکه با زیرساخت های ابری، به ویژه با Azure، خودکار می کنند. در برخی موارد، کار از طریق PowerShell بسیار راحت تر و سریعتر از کار از طریق پورتال Azure است. به لطف ماهیت کراس پلتفرم آن، PowerShell می تواند در هر سیستم عاملی استفاده شود.

چه از اوبونتو، رد هت یا ویندوز استفاده کنید، PowerShell می تواند به شما در کنترل منابع ابری کمک کند. با استفاده از ماژول Azure PowerShellبه عنوان مثال، می توانید هر ویژگی ماشین های مجازی را تنظیم کنید.

در این مقاله به نحوه استفاده از PowerShell برای تغییر اندازه ماشین مجازی در ابر Azure و همچنین حذف یک ماشین مجازی و اشیاء مرتبط با آن خواهیم پرداخت.

اصلاح و حذف ماشین های مجازی Azure با استفاده از PowerShell

مهم! فراموش نکنید که برای آماده شدن برای کار، دستان خود را با مواد ضدعفونی کننده پاک کنید:

  • شما به یک ماژول نیاز دارید ماژول Azure PowerShell - با دستور می توان آن را از گالری پاورشل دانلود کرد Install-Module Az.
  • شما باید در ابر Azure جایی که ماشین مجازی در حال اجراست با اجرای دستور احراز هویت کنید Connect-AzAccount.

ابتدا اجازه دهید یک اسکریپت ایجاد کنیم که اندازه یک ماشین مجازی Azure را تغییر دهد. بیایید VS Code را باز کنیم و یک اسکریپت جدید PowerShell به نام ذخیره کنیم تغییر اندازه-AzVirtualMachine.ps1 - با پیشرفت مثال، تکه‌هایی از کد را به آن اضافه می‌کنیم.

ما اندازه های VM موجود را درخواست می کنیم

قبل از تغییر اندازه VM، باید اندازه های قابل قبول ماشین های مجازی در ابر Azure را دریابید. برای این کار باید دستور را اجرا کنید Get-AzVMSize.

بنابراین برای ماشین مجازی devvm01 از گروه منابع توسعه تمدن ما تمام اندازه های قابل قبول ممکن را درخواست می کنیم:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(البته در مشکلات واقعی به جای ResourceGroupName=dev и VMName=devvm01 شما مقادیر خود را برای این پارامترها مشخص خواهید کرد.)

دستور چیزی شبیه به این را برمی گرداند:

اصلاح و حذف ماشین های مجازی Azure با استفاده از PowerShell

اینها همه گزینه های اندازه ممکن هستند که می توانند برای یک ماشین مجازی معین تنظیم شوند.

بیایید اندازه ماشین را تغییر دهیم

به عنوان مثال، ما اندازه را به یک اندازه جدید تغییر می دهیم Standard_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

اگر آنجا را ببینیم Standard_B1ls - یعنی همه چیز مرتب است، اندازه ماشین تغییر کرده است. شما می توانید با تغییر اندازه چندین ماشین مجازی به طور همزمان و با استفاده از یک آرایه، جلوتر رفته و موفقیت خود را افزایش دهید.

در مورد حذف VM در Azure چطور؟

با حذف، همه چیز آنطور که به نظر می رسد ساده و سرراست نیست. پس از همه، لازم است تعدادی از منابع مرتبط با این دستگاه را حذف کنید، از جمله:

  • ظروف ذخیره سازی عیب یابی بوت
  • رابط های شبکه
  • آدرس های IP عمومی
  • دیسک سیستم و لکه ای که وضعیت آن در آن ذخیره می شود
  • دیسک های داده

بنابراین، ما یک تابع ایجاد می کنیم و آن را فراخوانی می کنیم Remove-AzrVirtualMachine - و نه تنها Azure VM، بلکه تمام موارد فوق را نیز حذف می کند.

ما راه استاندارد را می رویم و ابتدا با استفاده از دستور شیء خود (VM) را دریافت می کنیم Get-AzVm. مثلاً بگذارید ماشین باشد WINSRV19 از گروه منابع MyTestVMs.

بیایید این شی را به همراه تمام خصوصیات آن در یک متغیر ذخیره کنیم $vm:

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

حذف کانتینر با فایل های تشخیص بوت

هنگام ایجاد یک VM در Azure، از کاربر نیز خواسته می‌شود که یک محفظه برای ذخیره عیب‌یابی بوت (Boot diagnostics container) ایجاد کند تا در صورت وجود مشکل در راه‌اندازی، چیزی برای عیب‌یابی وجود داشته باشد. با این حال، هنگامی که 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 عمومی

ماشین مجازی ما هنوز یک (یا حتی چند) رابط شبکه (NIC) دارد - برای حذف آنها به عنوان غیر ضروری، اجازه دهید از طریق ویژگی عبور کنیم. NetworkInterfaces VM ما را شیء کرده و با دستور NIC را حذف کنید Remove-AzNetworkInterface. در صورتی که بیش از یک رابط شبکه وجود داشته باشد، از یک حلقه استفاده می کنیم. در همان زمان، برای هر NIC، ویژگی را بررسی خواهیم کرد IpConfiguration برای تعیین اینکه آیا رابط دارای آدرس IP عمومی است یا خیر. اگر یکی پیدا شد با دستور حذفش می کنیم Remove-AzPublicIpAddress.

در اینجا یک مثال از چنین کدهایی آورده شده است، که در آن همه NIC ها را در یک حلقه بررسی می کنیم، آنها را حذف می کنیم و بررسی می کنیم که آیا یک IP عمومی وجود دارد یا خیر. اگر وجود دارد، پس ویژگی را تجزیه کنید PublicIpAddress، نام منبع مربوطه را با شناسه پیدا کنید و آن را حذف کنید:


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]

حذف لکه وضعیت دیسک سیستم

برای انجام این کار، همانطور که احتمالاً قبلاً حدس زده اید، ظرف ذخیره سازی که در آن این دیسک ذخیره شده است را می گیریم و به این معنی است که حباب در انتها حاوی status، پارامترهای مربوطه را به دستور delete منتقل کنید Remove-AzStorageBlob:

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

و در نهایت دیسک های داده را حذف می کنیم

ماشین مجازی ما هنوز هم می‌تواند دیسک‌هایی با داده‌های متصل به آن داشته باشد. در صورت عدم نیاز، آنها را نیز حذف خواهیم کرد. بیایید ابتدا آن را تجزیه کنیم StorageProfile ماشین مجازی ما و پیدا کردن ملک Uri. اگر چندین دیسک وجود داشته باشد، یک چرخه را بر اساس آن سازماندهی می کنیم URI. برای هر URI، حساب ذخیره سازی مربوطه را با استفاده از آن پیدا می کنیم Get-AzStorageAccount. سپس URI ذخیره سازی را تجزیه کنید تا نام حباب مورد نظر استخراج شود و آن را به دستور 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]
    }
}

و اکنون "ما به پایان خوش رسیده ایم!" اکنون باید یک کل واحد از همه این قطعات جمع آوری کنیم. نویسنده مهربان آدام برترام در نیمه راه با کاربران ملاقات کرد و خودش این کار را کرد. در اینجا یک لینک به اسکریپت نهایی به نام است Remove-AzrVirtualMachine.ps1:

GitHub

امیدوارم این نکات کاربردی برای صرفه جویی در تلاش، زمان و هزینه شما هنگام کار با ماشین های مجازی Azure مفید واقع شود.

منبع: www.habr.com

اضافه کردن نظر