تكوين مربع تطوير باستخدام Azure VM Image Builder وMicrosoft Dev Box

في هذه المقالة، يمكنك استخدام Azure VM Image Builder لإنشاء مربع تطوير مخصص في Microsoft Dev Box باستخدام قالب. يتضمن القالب خطوة تخصيص لتثبيت Visual Studio Code (VS Code).

عندما تستخدم مؤسستك صور الجهاز الظاهري الموحد (VM)، يمكن ترحيلها بسهولة أكبر إلى السحابة والمساعدة في ضمان الاتساق في عمليات النشر الخاصة بك. عادةً ما تتضمن الصور أمانًا محددًا مسبقًا وإعدادات التكوين وأي برامج ضرورية. يتطلب إعداد مسار معالجة التصوير الوقت والبنية الأساسية والعديد من التفاصيل الأخرى. باستخدام Azure VM Image Builder، يمكنك إنشاء تكوين يصف صورتك. ثم تقوم الخدمة بإنشاء الصورة وإرسالها إلى مشروع مربع تطوير.

على الرغم من أنه من الممكن إنشاء صور جهاز ظاهري مخصصة يدويا أو باستخدام أدوات أخرى، يمكن أن تكون العملية مرهقة وغير موثوق بها. تمنحك VM Image Builder، المُنشَأة على HashiCorp Packer، مزايا الخدمة المدارة.

لتقليل تعقيد إنشاء صور الجهاز الظاهري، نقومVM Image Builder بما يلي:

  • تزيل الحاجة إلى استخدام الأدوات والعمليات والخطوات اليدوية المعقدة لإنشاء صورة جهاز ظاهري. تلخص VM Image Builder كل هذه التفاصيل وتخفي المتطلبات الخاصة بـ Azure، مثل الحاجة إلى تعميم الصورة (Sysprep). وتمنح المستخدمين الأكثر تقدمًا القدرة على تجاوز هذه المتطلبات.

  • يعمل مع مسارات إنشاء الصور الموجودة للحصول على تجربة النقر والانتقال. يمكنك استدعاء VM Image Builder من البنية الأساسية لبرنامج ربط العمليات التجارية الخاصة بك أو استخدام مهمة DevOps لخدمة Azure VM Image Builder.

  • إحضار بيانات التخصيص من مصادر مختلفة، ما يزيل الحاجة إلى جمعها جميعا من مكان واحد.

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

هام

يدعم Microsoft Dev Box الصور التي تستخدم نوع الأمان تمكين التشغيل الموثوق به فقط.

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

لتوفير صورة مخصصة قمت بإنشائها باستخدام VM Image Builder، تحتاج إلى:

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

  1. لاستخدام VM Image Builder، تحتاج إلى تسجيل الميزات.

    تحقق من تسجيلات مقدم الخدمة. تأكد من إرجاع 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 
    

    إذا لم ترجع 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.Network 
    
  2. تثبيت وحدات PowerShell:

    'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
    
  3. إنشاء متغيرات لتخزين المعلومات التي تستخدمها أكثر من مرة.

    1. انسخ نموذج التعليمات البرمجية التالي.
    2. استبدل <Resource group> بمجموعة الموارد التي استخدمتها لإنشاء مركز التطوير.
    3. تشغيل التعليمات البرمجية المحدثة في PowerShell.
    # Get existing context 
    $currentAzContext = Get-AzContext
    
    # Get your current subscription ID  
    $subscriptionID=$currentAzContext.Subscription.Id
    
    # Destination image resource group  
    $imageResourceGroup="<Resource group>"
    
    # Location  
    $location="eastus2"
    
    # Image distribution metadata reference name  
    $runOutputName="aibCustWinManImg01"
    
    # Image template name  
    $imageTemplateName="vscodeWinTemplate"  
    
  4. إنشاء هوية معينة من قبل المستخدم وتعيين أذونات على مجموعة الموارد عن طريق تشغيل التعليمات البرمجية التالية في PowerShell.

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

    # Set up role definition names, which 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 -Location $location
    
    $identityNameResourceId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id 
    $identityNamePrincipalId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
    
  5. تعيين أذونات للهوية لتوزيع الصور.

    استخدم هذا الأمر لتنزيل قالب تعريف دور 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" 
    

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

  1. قم بتشغيل الأوامر التالية لإنشاء معرض جديد وتعريف صورة.

    تنشئ هذه التعليمة البرمجية تعريفا بنوع أمان التشغيل الموثوق به وتلبي متطلبات صورة Windows 365.

    # Gallery name 
    $galleryName= "devboxGallery" 
    
    # Image definition name 
    $imageDefName ="vscodeImageDef" 
    
    # Additional replication region 
    $replRegion2="eastus" 
    
    # Create the gallery 
    New-AzGallery -GalleryName $galleryName -ResourceGroupName $imageResourceGroup -Location $location 
    
    $SecurityType = @{Name='SecurityType';Value='TrustedLaunch'} 
    $features = @($SecurityType) 
    
    # Create the image definition
    New-AzGalleryImageDefinition -GalleryName $galleryName -ResourceGroupName $imageResourceGroup -Location $location -Name $imageDefName -OsState generalized -OsType Windows -Publisher 'myCompany' -Offer 'vscodebox' -Sku '1-0-0' -Feature $features -HyperVGeneration "V2" 
    
  2. أنشئ ملفا لتخزين تعريف القالب، مثل c:/temp/mytemplate.txt.

  3. انسخ قالب Azure Resource Manger التالي ل VM Image Builder في ملف القالب الجديد.

    يشير هذا القالب إلى الصورة المصدر والتخصيصات المطبقة. يقوم بتثبيت Choco و VS Code، ويشير أيضا إلى موقع توزيع الصور.

    {
       "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
       "contentVersion": "1.0.0.0",
       "parameters": {
         "imageTemplateName": {
          "type": "string"
         },
         "api-version": {
          "type": "string"
         },
         "svclocation": {
          "type": "string"
         }
       },
       "variables": {},
       "resources": [
         {
          "name": "[parameters('imageTemplateName')]",
          "type": "Microsoft.VirtualMachineImages/imageTemplates",
          "apiVersion": "[parameters('api-version')]",
          "location": "[parameters('svclocation')]",
          "dependsOn": [],
          "tags": {
            "imagebuilderTemplate": "win11multi",
            "userIdentity": "enabled"
          },
          "identity": {
            "type": "UserAssigned",
            "userAssignedIdentities": {
             "<imgBuilderId>": {}
            }
          },
          "properties": {
            "buildTimeoutInMinutes": 100,
            "vmProfile": {
             "vmSize": "Standard_DS2_v2",
             "osDiskSizeGB": 127
            },
          "source": {
             "type": "PlatformImage",
             "publisher": "MicrosoftWindowsDesktop",
             "offer": "Windows-11",
             "sku": "win11-21h2-ent",
             "version": "latest"
          },
            "customize": [
             {
                "type": "PowerShell",
                "name": "Install Choco and Vscode",
                "inline": [
                   "Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))",
                   "choco install -y vscode"
                ]
             }
            ],
             "distribute": 
             [
                {   
                   "type": "SharedImage",
                   "galleryImageId": "/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<sharedImageGalName>/images/<imageDefName>",
                   "runOutputName": "<runOutputName>",
                   "artifactTags": {
                      "source": "azureVmImageBuilder",
                      "baseosimg": "win11multi"
                   },
                   "replicationRegions": [
                     "<region1>",
                     "<region2>"
                   ]
                }
             ]
          }
         }
       ]
      }
    

    أغلق ملف القالب قبل المتابعة إلى الخطوة التالية.

  4. تكوين القالب الجديد الخاص بك مع المتغيرات الخاصة بك.

    استبدل <Template Path> بموقع ملف القالب، مثل c:/temp/mytemplate.

    $templateFilePath = <Template Path>
    
    (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>',$galleryName| 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 
    
  5. إرسال القالب إلى الخدمة.

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

    New-AzResourceGroupDeployment  -ResourceGroupName $imageResourceGroup  -TemplateFile $templateFilePath  -Api-Version "2020-02-14"  -imageTemplateName $imageTemplateName  -svclocation $location 
    
  6. إنشاء الصورة عن طريق استدعاء Run الأمر على القالب:

    في المطالبة لتأكيد عملية التشغيل، أدخل Yes.

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

    هام

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

  7. احصل على معلومات حول الصورة التي تم إنشاؤها حديثا، بما في ذلك حالة التشغيل وحالة التوفير.

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

    عينة الإخراج:

    Name                 LastRunStatusRunState    LastRunStatusMessage   ProvisioningState
    ---------------------------------------------------------------------------------------
    vscodeWinTemplate                                                    Creating
    

    يمكنك أيضا عرض حالة التوفير لصورتك في مدخل Microsoft Azure. انتقل إلى المعرض الخاص بك واعرض تعريف الصورة.

    Screenshot that shows the provisioning state of the customized image version.

بعد توفير صورتك المخصصة في المعرض، يمكنك تكوين المعرض لاستخدام الصور في مركز التطوير. لمزيد من المعلومات، راجع تكوين معرض حوسبة Azure.

إعداد Microsoft Dev Box باستخدام صورة مخصصة

بعد توفر صور المعرض في مركز التطوير، يمكنك استخدام الصورة المخصصة مع Microsoft Dev Box. لمزيد من المعلومات، راجع التشغيل السريع: تكوين Microsoft Dev Box.