مشاركة عبر


قم بإنشاء Windows VM باستخدام VM Image Builder باستخدام PowerShell

ينطبق على: ✔️ أجهزة Windows الظاهرية

توضح هذه المقالة كيفية إنشاء صورة Windows VM مخصصة باستخدام الوحدة النمطية Azure VM Image Builder PowerShell.

المتطلبات الأساسية

في حال لم يكن لديك اشتراك Azure، فأنشئ حساباً مجانيّاً قبل البدء.

إذا اخترت استخدام PowerShell محلياً، فستتطلب هذه المقالة تثبيت وحدة Azure PowerShell والاتصال بحساب Azure الخاص بك باستخدام الأمر cmdlet Connect-AzAccount. لمزيد من المعلومات، راجع تثبيت Azure PowerShell.

تتطلب بعض الخطوات أوامر cmdlets من الوحدة النمطية Az.ImageBuilder . تثبيت بشكل منفصل باستخدام الأمر التالي.

Install-Module -Name Az.ImageBuilder

Azure Cloud Shell

Azure يستضيف Azure Cloud Shell، بيئة تفاعلية يمكن استخدامها من خلال المستعرض. يمكنك استخدام Bash أو PowerShell مع Cloud Shell للعمل مع خدمات Azure. يمكنك استخدام أوامر Cloud Shell المثبتة مسبقًا لتشغيل التعليمات البرمجية في هذه المقالة دون الحاجة إلى تثبيت أي شيء على البيئة المحلية.

لبدء Azure Cloud Shell:

Option مثال/ رابط
انقر فوق ⁧⁩جربه⁧⁩ في الزاوية العلوية اليسرى من التعليمة البرمجية أو كتلة الأمر. تحديد ⁧⁩جربه⁧⁩ لا يقوم بنسخ التعليمة البرمجية أو الأمر تلقائيًا إلى Cloud Shell. لقطة شاشة تعرض مثالاً على Try It for Azure Cloud Shell.
انتقل إلى ⁧⁩⁧ https://shell.azure.com⁩⁧⁩، أو حدد زر ⁩تشغيل Cloud Shell لفتح Cloud Shell في المتصفح لديك. زر لتشغيل Azure Cloud Shell.
حدد زر Cloud Shell على شريط القوائم في أعلى اليمين في مدخل Microsoft Azure. لقطة شاشة تعرض زر Cloud Shell في مدخل Microsoft Azure

لاستخدام Azure Cloud Shell:

  1. ابدأ تشغيل Cloud Shell.

  2. حدد الزر نسخ على كتلة التعليمات البرمجية (أو كتلة الأوامر) لنسخ التعليمات البرمجية أو الأمر.

  3. ألصق التعليمة البرمجية أو الأمر في جلسة Cloud Shell بتحديد Ctrl+Shift+Vعلى Windows وLunix، أو بتحديد Cmd+Shift+Vعلى macOS.

  4. حدد Enter لتشغيل التعليمات البرمجية أو الأمر.

إذا كان لديك العديد من اشتراكات «Microsoft Azure»، فاختر الاشتراك المناسب الذي يجب فوترة الموارد من خلاله. حدد اشتراكاً محدداً باستخدام الأمر cmdlet Set-AzContext.

Set-AzContext -SubscriptionId 00000000-0000-0000-0000-000000000000

تسجيل الموفرين

إذا لم تكن قد قمت بذلك بالفعل، فقم بتسجيل موفري الموارد التالين لاستخدامهم مع اشتراك Azure الخاص بك:

  • Microsoft.Compute
  • Microsoft.KeyVault
  • Microsoft.Storage
  • Microsoft.Network
  • Microsoft.VirtualMachineImages
  • Microsoft.ManagedIdentity
  • Microsoft.ContainerInstance
Get-AzResourceProvider -ProviderNamespace Microsoft.Compute, Microsoft.KeyVault, Microsoft.Storage, Microsoft.VirtualMachineImages, Microsoft.Network, Microsoft.ManagedIdentity |
  Where-Object RegistrationState -ne Registered |
    Register-AzResourceProvider

تحديد المتغيرات

نظراً لأنك ستستخدم بعض المعلومات بشكل متكرر، قم بإنشاء بعض المتغيرات لتخزين تلك المعلومات:

# Destination image resource group name
$imageResourceGroup = 'myWinImgBuilderRG'

# Azure region
$location = 'WestUS2'

# Name of the image to be created
$imageTemplateName = 'myWinImage'

# Distribution properties of the managed image upon completion
$runOutputName = 'myDistResults'

قم بإنشاء متغير لمعرف اشتراك Azure الخاص بك. للتأكد من أن المتغير subscriptionID يحتوي على معرف الاشتراك الخاص بك، يمكنك تشغيل السطر الثاني في المثال التالي:

# Your Azure Subscription ID
$subscriptionID = (Get-AzContext).Subscription.Id
Write-Output $subscriptionID

إنشاء مجموعة موارد

إنشاء مجموعة موارد Azure باستخدام New-AzResourceGroup cmdlet. مجموعة الموارد عبارة عن حاوية منطقية يتم فيها توزيع موارد «Microsoft Azure» وإدارتها كمجموعة.

يُنشئ المثال التالي مجموعة موارد تستند إلى الاسم الموجود في المتغير $imageResourceGroup في المنطقة التي حددتها في المتغير $location. تُستخدم مجموعة الموارد هذه لتخزين عنصر قالب تكوين الصورة والصورة.

New-AzResourceGroup -Name $imageResourceGroup -Location $location

قم بإنشاء هوية مستخدم وتعيين أذونات الدور

امنح أذونات منشئ الصور في Azure لإنشاء صور في مجموعة الموارد المحددة باستخدام المثال التالي. بدون هذا الإذن، لن تنتهي عملية إنشاء الصورة بنجاح.

  1. إنشاء متغيرات لتعريف الدور وأسماء الهوية. يجب أن تكون هذه القيم فريدة من نوعها.

    [int]$timeInt = $(Get-Date -UFormat '%s')
    $imageRoleDefName = "Azure Image Builder Image Def $timeInt"
    $identityName = "myIdentity$timeInt"
    
  2. إنشاء هوية مستخدم.

    New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
    
  3. تخزين مورد الهوية والمعرفات الرئيسية في المتغيرات.

    $identityNameResourceId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id
    $identityNamePrincipalId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
    

تعيين أذونات للهوية لتوزيع الصور

  1. قم بتنزيل ملف تكوين JSON، ثم قم بتعديله بناءً على الإعدادات المحددة في هذه المقالة.

    $myRoleImageCreationUrl = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json'
    $myRoleImageCreationPath = "myRoleImageCreation.json"
    
    Invoke-WebRequest -Uri $myRoleImageCreationUrl -OutFile $myRoleImageCreationPath -UseBasicParsing
    
    $Content = Get-Content -Path $myRoleImageCreationPath -Raw
    $Content = $Content -replace '<subscriptionID>', $subscriptionID
    $Content = $Content -replace '<rgName>', $imageResourceGroup
    $Content = $Content -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName
    $Content | Out-File -FilePath $myRoleImageCreationPath -Force
    
  2. إنشاء تعريف الدور.

    New-AzRoleDefinition -InputFile $myRoleImageCreationPath
    
  3. قم بمنح تعريف الدور لمدير خدمة VM Image Builder.

    $RoleAssignParams = @{
      ObjectId = $identityNamePrincipalId
      RoleDefinitionName = $imageRoleDefName
      Scope = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    }
    New-AzRoleAssignment @RoleAssignParams
    

إشعار

إذا تلقيت الخطأ "New-AzRoleDefinition: تم تجاوز حد تعريف الدور. لا يمكن إنشاء المزيد من تعريفات الأدوار، "راجع استكشاف أخطاء Azure RBAC (التحكم في الوصول المستند إلى الدور) وإصلاحها.

  1. إنشاء المعرض.

    $myGalleryName = 'myImageGallery'
    $imageDefName = 'winSvrImages'
    
    New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location
    
  2. إنشاء تعريف معرض.

    $GalleryParams = @{
      GalleryName = $myGalleryName
      ResourceGroupName = $imageResourceGroup
      Location = $location
      Name = $imageDefName
      OsState = 'generalized'
      OsType = 'Windows'
      Publisher = 'myCo'
      Offer = 'Windows'
      Sku = 'Win2019'
      HyperVGeneration = 'v1'
    }
    New-AzGalleryImageDefinition @GalleryParams
    

إنشاء صورة

  1. قم بإنشاء عنصر مصدر VM Image Builder. للحصول على قيم المعلمات الصالحة، راجع البحث عن صور Windows VM في Azure Marketplace باستخدام Azure PowerShell.

    $SrcObjParams = @{
      PlatformImageSource = $true
      Publisher = 'MicrosoftWindowsServer'
      Offer = 'WindowsServer'
      Sku = '2019-Datacenter'
      Version = 'latest'
    }
    $srcPlatform = New-AzImageBuilderTemplateSourceObject @SrcObjParams
    
  2. قم بإنشاء عنصر موزع VM Image Builder.

    $disObjParams = @{
      SharedImageDistributor = $true
      ArtifactTag = @{tag='dis-share'}
      GalleryImageId = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup/providers/Microsoft.Compute/galleries/$myGalleryName/images/$imageDefName"
      ReplicationRegion = $location
      RunOutputName = $runOutputName
      ExcludeFromLatest = $false
    }
    $disSharedImg = New-AzImageBuilderTemplateDistributorObject @disObjParams
    
  3. قم بإنشاء عنصر تخصيص VM Image Builder.

    $ImgCustomParams01 = @{
      PowerShellCustomizer = $true
      Name = 'settingUpMgmtAgtPath'
      RunElevated = $false
      Inline = @("mkdir c:\\buildActions", "mkdir c:\\buildArtifacts", "echo Azure-Image-Builder-Was-Here  > c:\\buildActions\\buildActionsOutput.txt")
    }
    $Customizer01 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams01
    
  4. قم بإنشاء عنصر تخصيص VM Image Builder ثانياً.

    $ImgCustomParams02 = @{
      FileCustomizer = $true
      Name = 'downloadBuildArtifacts'
      Destination = 'c:\\buildArtifacts\\index.html'
      SourceUri = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/exampleArtifacts/buildArtifacts/index.html'
    }
    $Customizer02 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams02
    
  5. قم بإنشاء قالب VM Image Builder.

    $ImgTemplateParams = @{
      ImageTemplateName = $imageTemplateName
      ResourceGroupName = $imageResourceGroup
      Source = $srcPlatform
      Distribute = $disSharedImg
      Customize = $Customizer01, $Customizer02
      Location = $location
      UserAssignedIdentityId = $identityNameResourceId
    }
    New-AzImageBuilderTemplate @ImgTemplateParams
    

عندما يتم إنشاء القالب، يتم إرجاع رسالة ويتم إنشاء قالب تكوين VM Image Builder في $imageResourceGroup.

لتحديد ما إذا كانت عملية إنشاء القالب ناجحة، استخدم المثال التالي:

Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup |
  Select-Object -Property Name, LastRunStatusRunState, LastRunStatusMessage, ProvisioningState

في الخلفية، يقوم VM Image Builder أيضاً بإنشاء مجموعة موارد مرحلية في اشتراكك. تُستخدم مجموعة الموارد لبناء الصورة. إنه بتنسيق IT_<DestinationResourceGroup>_<TemplateName>.

تحذير

لا تحذف مجموعة الموارد المرحلية مباشرة. للتسبب في حذف مجموعة الموارد المرحلية، احذف عنصر قالب الصورة.

إذا أبلغت الخدمة عن فشل عند إرسال قالب تكوين الصورة، فقم بما يلي:

البدء في بناء الصورة

قم بإرسال تكوين الصورة إلى خدمة VM Image Builder عن طريق تشغيل الأمر التالي:

Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName

انتظر حتى تنتهي عملية بناء الصورة، والتي قد تستغرق ما يصل إلى ساعة.

إذا واجهت أخطاء، فراجع استكشاف أخطاء Azure VM Image Builder وإصلاحها.

إنشاء جهاز ظاهري

  1. قم بتخزين بيانات اعتماد تسجيل الدخول إلى VM في متغير. ينبغي أن تكون كلمة المرور معقدة.

    $Cred = Get-Credential
    
  2. قم بإنشاء الجهاز الظاهري باستخدام الصورة التي قمت بإنشائها.

    $ArtifactId = (Get-AzImageBuilderTemplateRunOutput -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup).ArtifactId
    
    New-AzVM -ResourceGroupName $imageResourceGroup -Image $ArtifactId -Name myWinVM01 -Credential $Cred
    

التحقق من التخصيصات

  1. قم بإنشاء اتصال سطح المكتب البعيد بالجهاز الظاهري باستخدام اسم المستخدم وكلمة المرور اللذين قمت بتعيينهما عند إنشاء الجهاز الظاهري.

  2. داخل الجهاز الظاهري، افتح PowerShell وقم بتشغيل Get-Content، كما هو موضح في المثال التالي:

    Get-Content -Path C:\buildActions\buildActionsOutput.txt
    

    يعتمد الإخراج على محتويات الملف الذي قمت بإنشائه أثناء عملية تخصيص الصورة.

    Azure-Image-Builder-Was-Here
    
  3. من جلسة PowerShell نفسها، تحقق من انتهاء التخصيص الثاني بنجاح عن طريق التحقق من وجود c:\buildArtifacts\index.html، كما هو موضح في المثال التالي:

    Get-ChildItem c:\buildArtifacts\
    

    يجب أن تكون النتيجة قائمة دليل توضح أنه تم تنزيل الملف أثناء عملية تخصيص الصورة.

        Directory: C:\buildArtifacts
    
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    -a---          29/01/2021    10:04            276 index.html
    

تفريغ مواردك

إذا لم تعد بحاجة إلى الموارد التي تم إنشاؤها أثناء هذه العملية، فيمكنك حذفها عن طريق القيام بما يلي:

  1. احذف قالب VM Image Builder.

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
    
  2. احذف مجموعة موارد الصور.

    أنذر

    يحذف المثال التالي مجموعة الموارد المحددة وجميع الموارد التي تحتوي عليها. في حالة وجود أي موارد خارج نطاق هذه المقالة في مجموعة الموارد، فسيتم حذفها أيضاً.

    Remove-AzResourceGroup -Name $imageResourceGroup
    

الخطوات التالية

لمعرفة المزيد حول مكونات ملف JSON الذي تستخدمه هذه المقالة، راجع مرجع قالب VM Image Builder.