إنشاء صورة Windows وتوزيعها على معرض حوسبة Azure

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

في هذه المقالة، ستتعلم كيفية استخدام Azure VM Image Builder وAzure PowerShell لإنشاء إصدار صورة في معرض حوسبة Azure (معرض الصور المشترك سابقا) ثم توزيع الصورة عالميا. يمكنك أيضا القيام بذلك باستخدام Azure CLI.

لتكوين الصورة، تستخدم هذه المقالة قالب JSON، والذي يمكنك العثور عليه في armTemplateWinSIG.json. ستقوم بتنزيل وتحرير إصدار محلي من القالب، لذلك ستستخدم أيضا جلسة PowerShell محلية.

لتوزيع الصورة على معرض حوسبة Azure، يستخدم القالب sharedImage كقيمة distribute لقسم القالب.

يتم تشغيل Sysprep VM Image Builder تلقائيا لتعميم الصورة. الأمر هو أمر عام Sysprep ، ويمكنك تجاوزه إذا كنت بحاجة إلى ذلك.

كن على دراية بعدد المرات التي تقوم فيها بتخصيصات الطبقة. يمكنك تشغيل Sysprep الأمر لعدد محدود من المرات على صورة Windows واحدة. بعد الوصول إلى Sysprep الحد الأقصى، يجب إعادة إنشاء صورة Windows. لمزيد من المعلومات، راجع حدود عدد المرات التي يمكنك فيها تشغيل Sysprep.

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

لاستخدام VM Image Builder، تحتاج إلى تسجيل الموفرين.

  1. تحقق من تسجيلات مقدم الخدمة. تأكد من أن كل واحد يرجع Registered.

    Get-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages | Format-table -Property ResourceTypes,RegistrationState
    Get-AzResourceProvider -ProviderNamespace Microsoft.Storage | Format-table -Property ResourceTypes,RegistrationState 
    Get-AzResourceProvider -ProviderNamespace Microsoft.Compute | Format-table -Property ResourceTypes,RegistrationState
    Get-AzResourceProvider -ProviderNamespace Microsoft.KeyVault | Format-table -Property ResourceTypes,RegistrationState
    Get-AzResourceProvider -ProviderNamespace Microsoft.Network | Format-table -Property ResourceTypes,RegistrationState
    Get-AzResourceProvider -ProviderNamespace Microsoft.ContainerInstance | Format-table -Property ResourceTypes,RegistrationState
    
  2. إذا لم يقوموا بإرجاع Registered، فسجل الموفرين عن طريق تشغيل الأوامر التالية:

    Register-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages
    Register-AzResourceProvider -ProviderNamespace Microsoft.Storage
    Register-AzResourceProvider -ProviderNamespace Microsoft.Compute
    Register-AzResourceProvider -ProviderNamespace Microsoft.KeyVault
    Register-AzResourceProvider -ProviderNamespace Microsoft.ContainerInstance
    
  3. تثبيت وحدات PowerShell:

    'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
    

إنشاء المتغيرات

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

استبدل قيم المتغيرات، مثل username و vmpassword، بمعلوماتك الخاصة.

# Get existing context
$currentAzContext = Get-AzContext

# Get your current subscription ID. 
$subscriptionID=$currentAzContext.Subscription.Id

# Destination image resource group
$imageResourceGroup="aibwinsig"

# Location
$location="westus"

# Image distribution metadata reference name
$runOutputName="aibCustWinManImg02ro"

# Image template name
$imageTemplateName="helloImageTemplateWin02ps"

# Distribution properties object name (runOutput).
# This gives you the properties of the managed image on completion.
$runOutputName="winclientR01"

# Create a resource group for the VM Image Builder template and Azure Compute Gallery
New-AzResourceGroup `
   -Name $imageResourceGroup `
   -Location $location

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

يستخدم VM Image Builder هوية المستخدم المتوفرة لإدخال الصورة في معرض حوسبة Azure. في هذا المثال، يمكنك إنشاء تعريف دور Azure مع إجراءات محددة لتوزيع الصورة. ثم يتم تعيين تعريف الدور لهوية المستخدم.

# setup role def names, these need to be unique
$timeInt=$(get-date -UFormat "%s")
$imageRoleDefName="Azure Image Builder Image Def"+$timeInt
$identityName="aibIdentity"+$timeInt

## Add an Azure PowerShell module to support AzUserAssignedIdentity
Install-Module -Name Az.ManagedServiceIdentity

# Create an identity
New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName

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

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

استخدم هذا الأمر لتنزيل قالب تعريف دور Azure، ثم قم بتحديثه بالمعلمات المحددة مسبقا.

$aibRoleImageCreationUrl="https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json"
$aibRoleImageCreationPath = "aibRoleImageCreation.json"

# Download the configuration
Invoke-WebRequest -Uri $aibRoleImageCreationUrl -OutFile $aibRoleImageCreationPath -UseBasicParsing

((Get-Content -path $aibRoleImageCreationPath -Raw) -replace '<subscriptionID>',$subscriptionID) | Set-Content -Path $aibRoleImageCreationPath
((Get-Content -path $aibRoleImageCreationPath -Raw) -replace '<rgName>', $imageResourceGroup) | Set-Content -Path $aibRoleImageCreationPath
((Get-Content -path $aibRoleImageCreationPath -Raw) -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName) | Set-Content -Path $aibRoleImageCreationPath

# Create a role definition
New-AzRoleDefinition -InputFile  ./aibRoleImageCreation.json

# Grant the role definition to the VM Image Builder service principal
New-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"

إشعار

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

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

إذا لم يكن لديك بالفعل معرض وتعريف صورة لاستخدامها، فابدأ بإنشائها.

# Gallery name
$sigGalleryName= "myIBSIG"

# Image definition name
$imageDefName ="winSvrimage"

# Additional replication region
$replRegion2="eastus"

# Create the gallery
New-AzGallery `
   -GalleryName $sigGalleryName `
   -ResourceGroupName $imageResourceGroup  `
   -Location $location

# Create the image definition
New-AzGalleryImageDefinition `
   -GalleryName $sigGalleryName `
   -ResourceGroupName $imageResourceGroup `
   -Location $location `
   -Name $imageDefName `
   -OsState generalized `
   -OsType Windows `
   -Publisher 'myCompany' `
   -Offer 'WindowsServer' `
   -Sku 'WinSrv2019'

تنزيل القالب وتكوينه

قم بتنزيل قالب JSON وتكوينه مع المتغيرات الخاصة بك.


$templateFilePath = "armTemplateWinSIG.json"

Invoke-WebRequest `
   -Uri "https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/1_Creating_a_Custom_Win_Shared_Image_Gallery_Image/armTemplateWinSIG.json" `
   -OutFile $templateFilePath `
   -UseBasicParsing

(Get-Content -path $templateFilePath -Raw ) `
   -replace '<subscriptionID>',$subscriptionID | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<rgName>',$imageResourceGroup | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<runOutputName>',$runOutputName | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<imageDefName>',$imageDefName | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<sharedImageGalName>',$sigGalleryName | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<region1>',$location | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<region2>',$replRegion2 | Set-Content -Path $templateFilePath
((Get-Content -path $templateFilePath -Raw) -replace '<imgBuilderId>',$identityNameResourceId) | Set-Content -Path $templateFilePath

أنشئ إصدار الصورة

يجب إرسال القالب إلى الخدمة. ستقوم الأوامر التالية بتنزيل أي بيانات اصطناعية تابعة، مثل البرامج النصية، وتخزينها في مجموعة الموارد المرحلية، مسبوقة IT_.

New-AzResourceGroupDeployment `
   -ResourceGroupName $imageResourceGroup `
   -TemplateFile $templateFilePath `
   -ApiVersion "2022-02-14" `
   -imageTemplateName $imageTemplateName `
   -svclocation $location

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

Invoke-AzResourceAction `
   -ResourceName $imageTemplateName `
   -ResourceGroupName $imageResourceGroup `
   -ResourceType Microsoft.VirtualMachineImages/imageTemplates `
   -ApiVersion "2022-02-14" `
   -Action Run

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

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

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

إنشاء جهاز ظاهري من إصدار الصورة الذي قمت بإنشائه باستخدام VM Image Builder.

  1. احصل على إصدار الصورة الذي قمت بإنشائه:

    $imageVersion = Get-AzGalleryImageVersion `
    -ResourceGroupName $imageResourceGroup `
    -GalleryName $sigGalleryName `
    -GalleryImageDefinitionName $imageDefName
    $imageVersionId = $imageVersion.Id
    
  2. إنشاء الجهاز الظاهري في المنطقة الثانية، حيث تم نسخ الصورة نسخا متماثلا:

    $vmResourceGroup = "myResourceGroup"
    $vmName = "myVMfromImage"
    
    # Create user object
    $cred = Get-Credential -Message "Enter a username and password for the virtual machine."
    
    # Create a resource group
    New-AzResourceGroup -Name $vmResourceGroup -Location $replRegion2
    
    # Network pieces
    $subnetConfig = New-AzVirtualNetworkSubnetConfig -Name mySubnet -AddressPrefix 192.168.1.0/24
    $vnet = New-AzVirtualNetwork -ResourceGroupName $vmResourceGroup -Location $replRegion2 `
    -Name MYvNET -AddressPrefix 192.168.0.0/16 -Subnet $subnetConfig
    $pip = New-AzPublicIpAddress -ResourceGroupName $vmResourceGroup -Location $replRegion2 `
    -Name "mypublicdns$(Get-Random)" -AllocationMethod Static -IdleTimeoutInMinutes 4
    $nsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name myNetworkSecurityGroupRuleRDP  -Protocol Tcp `
    -Direction Inbound -Priority 1000 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * `
    -DestinationPortRange 3389 -Access Deny
    $nsg = New-AzNetworkSecurityGroup -ResourceGroupName $vmResourceGroup -Location $replRegion2 `
    -Name myNetworkSecurityGroup -SecurityRules $nsgRuleRDP
    $nic = New-AzNetworkInterface -Name myNic -ResourceGroupName $vmResourceGroup -Location $replRegion2 `
    -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id
    
    # Create a virtual machine configuration using $imageVersion.Id to specify the image
    $vmConfig = New-AzVMConfig -VMName $vmName -VMSize Standard_D1_v2 | `
    Set-AzVMOperatingSystem -Windows -ComputerName $vmName -Credential $cred | `
    Set-AzVMSourceImage -Id $imageVersion.Id | `
    Add-AzVMNetworkInterface -Id $nic.Id
    
    # Create a virtual machine
    New-AzVM -ResourceGroupName $vmResourceGroup -Location $replRegion2 -VM $vmConfig
    

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

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

dir c:\

يجب أن تشاهد دليلا باسم buildActions تم إنشاؤه أثناء تخصيص الصورة.

تفريغ مواردك

إشعار

إذا كنت تريد الآن محاولة إعادة تخصيص إصدار الصورة لإنشاء إصدار جديد من نفس الصورة، فتخط الخطوة الموضحة هنا وانتقل إلى استخدام VM Image Builder لإنشاء إصدار صورة آخر.

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

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

احذف قالب مجموعة الموارد أولا. وإلا، فلن يتم تنظيف مجموعة الموارد المرحلية (IT_) التي يستخدمها VM Image Builder.

  1. احصل على ResourceID لقالب الصورة.

    $resTemplateId = Get-AzResource -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2022-02-14"
    
  2. حذف قالب الصورة.

    Remove-AzResource -ResourceId $resTemplateId.ResourceId -Force
    
  3. حذف تعيين الدور.

    Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  4. إزالة التعريفات.

    Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  5. حذف الهوية.

    Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
    
  6. حذف مجموعة الموارد.

    Remove-AzResourceGroup $imageResourceGroup -Force
    

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

لتحديث إصدار الصورة الذي قمت بإنشائه في هذه المقالة، راجع استخدام VM Image Builder لإنشاء إصدار صورة آخر.