تغيير وإزالة Azure VMs باستخدام PowerShell

باستخدام PowerShell، نجح المهندسون ومسؤولو تكنولوجيا المعلومات في أتمتة المهام المختلفة عند العمل ليس فقط في أماكن العمل، ولكن أيضًا مع البنى التحتية السحابية، ولا سيما مع Azure. في بعض الحالات، يكون العمل من خلال PowerShell أكثر ملاءمة وأسرع من العمل من خلال بوابة Azure. بفضل طبيعته متعددة المنصات، يمكن استخدام PowerShell على أي نظام تشغيل.

سواء كنت تستخدم Ubuntu أو Red Hat أو Windows، يمكن أن يساعدك PowerShell في التحكم في مواردك السحابية. باستخدام الوحدة أزور باورشيلعلى سبيل المثال، يمكنك تعيين أي خصائص للأجهزة الافتراضية.

في هذه المقالة، سنلقي نظرة على كيفية استخدام PowerShell لتغيير حجم جهاز افتراضي في سحابة Azure، بالإضافة إلى حذف جهاز افتراضي والكائنات المرتبطة به.

تغيير وإزالة Azure VMs باستخدام PowerShell

المهم! ولا تنس مسح يديك بالمطهر استعداداً للعمل:

  • سوف تحتاج إلى وحدة نمطية وحدة أزور بوويرشيل - يمكن تنزيله من معرض PowerShell باستخدام الأمر 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

(في المشاكل الحقيقية، بطبيعة الحال، بدلا من ResourceGroupName=dev и VMName=devvm01 ستحدد القيم الخاصة بك لهذه المعلمات.)

سيعود الأمر بشيء مثل هذا:

تغيير وإزالة Azure VMs باستخدام 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، يُطلب من المستخدم أيضًا إنشاء حاوية لتخزين تشخيصات التمهيد (حاوية تشخيصات التمهيد)، بحيث إذا كانت هناك مشاكل في التمهيد، فهناك شيء يمكن اللجوء إليه لاستكشاف الأخطاء وإصلاحها. ومع ذلك، عند حذف VM، يتم ترك هذه الحاوية لمواصلة وجودها الآن بلا هدف. دعونا نصلح هذا الوضع.

  1. أولاً، دعنا نتعرف على حساب التخزين الذي تنتمي إليه هذه الحاوية - ولهذا نحتاج إلى العثور على العقار storageUri في أحشاء الكائن DiagnosticsProfile جهاز افتراضي لدينا. لهذا أستخدم هذا التعبير العادي:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. أنت الآن بحاجة إلى معرفة اسم الحاوية، ولهذا تحتاج إلى الحصول على معرف VM باستخدام الأمر 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 العام

لا يزال جهازنا الافتراضي يحتوي على واجهة شبكة واحدة (أو حتى عدة) - لإزالتها باعتبارها غير ضرورية، دعنا ننتقل إلى الخاصية 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]

إزالة Blob لحالة قرص النظام

للقيام بذلك، كما خمنت على الأرجح، نأخذ حاوية التخزين التي يتم تخزين هذا القرص فيها، مما يعني أن النقطة الموجودة في النهاية تحتوي على status، قم بتمرير المعلمات المقابلة إلى أمر الحذف Remove-AzStorageBlob:

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

وأخيرًا، نقوم بإزالة أقراص البيانات

لا يزال من الممكن أن يحتوي جهازنا الافتراضي على أقراص تحتوي على البيانات المرفقة به. إذا لم تكن هناك حاجة إليها، فسنقوم بحذفها أيضًا. دعونا نحللها أولاً StorageProfile جهازنا الافتراضي وابحث عن العقار Uri. إذا كان هناك عدة أقراص، فإننا ننظم دورة وفقًا لها URI. لكل URI، سنجد حساب التخزين المقابل باستخدام Get-AzStorageAccount. ثم قم بتحليل URI للتخزين لاستخراج اسم النقطة المطلوبة وتمريره إلى أمر الحذف 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]
    }
}

والآن "لقد وصلنا إلى النهاية السعيدة!" الآن نحن بحاجة إلى تجميع كل واحد من كل هذه الأجزاء. التقى المؤلف اللطيف آدم بيرترام بالمستخدمين في منتصف الطريق وقام بذلك بنفسه. هنا رابط للنص النهائي المسمى إزالة-AzrVirtualMachine.ps1:

GitHub جيثب:

أتمنى أن تجد هذه النصائح العملية مفيدة في توفير الجهد والوقت والمال عند العمل مع أجهزة Azure VM.

المصدر: www.habr.com

إضافة تعليق