Configuración de un cuadro de desarrollo mediante Azure VM Image Builder y Microsoft Dev Box

En este artículo, usará Azure VM Image Builder para crear un cuadro de desarrollo personalizado en Microsoft Dev Box mediante una plantilla. La plantilla incluye un paso de personalización para instalar Visual Studio Code (VS Code).

Cuando su organización usa imágenes de máquina virtual (VM) estandarizadas, puede migrar más fácilmente a la nube y ayudar a garantizar la coherencia en las implementaciones. Normalmente, las imágenes incluyen opciones de seguridad y de configuración predefinidas y el software necesario. La configuración de su propia canalización de creación de imágenes requiere tiempo, infraestructura y muchos otros detalles. Con Azure VM Image Builder, puede crear una configuración que describa la imagen. A continuación, el servicio compila la imagen y la envía a un proyecto de cuadro de desarrollo.

Aunque es posible crear imágenes de máquina virtual personalizadas a mano o mediante otras herramientas, el proceso puede ser complicado y poco confiable. Azure VM Image Builder, que se basa en HashiCorp Packer, proporciona las ventajas de un servicio administrado.

Para reducir la complejidad de crear imágenes de máquina virtual, VM Image Builder hace lo siguiente:

  • Elimina la necesidad de usar herramientas, procesos y pasos manuales complejos para crear una imagen de máquina virtual. VM Image Builder abstrae todos estos detalles y oculta los requisitos específicos de Azure, como la necesidad de generalizar la imagen (Sysprep). Además, proporciona a los usuarios más avanzados la posibilidad de invalidar estos requisitos.

  • Funciona con canalizaciones de compilación de imágenes existentes para una experiencia de clic y uso. Puede llamar a VM Image Builder desde la canalización o usar una tarea de DevOps del servicio Azure VM Image Builder.

  • Captura los datos de personalización de varios orígenes, lo que elimina la necesidad de recopilarlos todos de un solo lugar.

  • Se integra con Azure Compute Gallery, que crea un sistema de administración de imágenes para distribuir, replicar, versionar y escalar imágenes globalmente. Además, puede distribuir la misma imagen resultante que un disco duro virtual o como una o varias imágenes administradas, sin tener que volver a generarlas desde cero.

Importante

Microsoft Dev Box solo admite imágenes que usan el tipo de seguridad Inicio seguro habilitado.

Requisitos previos

Para aprovisionar una imagen personalizada que creó mediante VM Image Builder, necesita:

El primer paso es usar Azure VM Image Builder y Azure PowerShell para crear una versión de imagen en Azure Compute Gallery y, a continuación, distribuir la imagen globalmente. También puede realizar esta tarea mediante la CLI de Azure.

  1. Para usar VM Image Builder, debe registrar las características.

    Compruebe los registros del proveedor. Asegúrese de que cada comando devuelve Registered la característica especificada.

       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 
    

    Si los registros de proveedor no devuelven Registered, registre los proveedores ejecutando los comandos siguientes:

       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. Instale los módulos de PowerShell:

    'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
    
  3. Cree variables para almacenar información que use más de una vez.

    1. Copie el código de ejemplo siguiente.
    2. Reemplace por <Resource group> el grupo de recursos que usó para crear el centro de desarrollo.
    3. Ejecute el código actualizado en 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. Cree una identidad asignada por el usuario y establezca permisos en el grupo de recursos mediante la ejecución del código siguiente en PowerShell.

    VM Image Builder usa la identidad de usuario proporcionada para insertar la imagen en Azure Compute Gallery. En el ejemplo siguiente se crea una definición de rol de Azure con acciones específicas para distribuir la imagen. La definición de roles se asigna a la identidad del usuario.

    # 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. Asigne permisos para la identidad para distribuir las imágenes.

    Use este comando para descargar una plantilla de definición de roles de Azure y, a continuación, actualícela con los parámetros especificados anteriormente:

    $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" 
    

Para usar VM Image Builder con una instancia de Azure Compute Gallery, debe tener una galería y una definición de imagen existentes. VM Image Builder no crea la galería ni la definición de imagen automáticamente.

  1. Ejecute los siguientes comandos para crear una nueva definición de imagen y galería.

    Este código crea una definición con el tipo de seguridad de inicio de confianza y cumple los requisitos de imagen de 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. Cree un archivo para almacenar la definición de la plantilla, como c:/temp/mytemplate.txt.

  3. Copie la siguiente plantilla de Azure Resource Manager para VM Image Builder en el nuevo archivo de plantilla.

    Esta plantilla indica la imagen de origen y las personalizaciones aplicadas. Instala Choco y VS Code, e indica también la ubicación de distribución de imágenes.

    {
       "$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>"
                   ]
                }
             ]
          }
         }
       ]
      }
    

    Cierre el archivo de plantilla antes de continuar con el paso siguiente.

  4. Configure la nueva plantilla con las variables.

    Reemplace por <Template Path> la ubicación del archivo de plantilla, como 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. Envíe la plantilla al servicio.

    El comando siguiente descarga los artefactos dependientes, como scripts, y los almacena en el grupo de recursos de almacenamiento provisional. El grupo de recursos de almacenamiento provisional tiene el IT_prefijo .

    New-AzResourceGroupDeployment  -ResourceGroupName $imageResourceGroup  -TemplateFile $templateFilePath  -Api-Version "2020-02-14"  -imageTemplateName $imageTemplateName  -svclocation $location 
    
  6. Compile la imagen invocando el Run comando en la plantilla:

    En el símbolo del sistema para confirmar el proceso de ejecución, escriba .

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

    Importante

    La creación de la imagen y la replicación en ambas regiones puede tardar algún tiempo. Es posible que vea una diferencia en los informes de progreso entre PowerShell y Azure Portal. Antes de empezar a crear una definición de cuadro de desarrollo, espere hasta que finalice el proceso.

  7. Obtenga información sobre la imagen recién compilada, incluido el estado de ejecución y el estado de aprovisionamiento.

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

    Resultados del ejemplo:

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

    También puede ver el estado de aprovisionamiento de la imagen en Azure Portal. Vaya a la galería y vea la definición de la imagen.

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

Una vez aprovisionada la imagen personalizada en la galería, puede configurar la galería para que use las imágenes en el centro de desarrollo. Para más información, consulte Configuración de Azure Compute Gallery.

Configuración de Microsoft Dev Box con una imagen personalizada

Después de que las imágenes de la galería estén disponibles en el centro de desarrollo, puede usar la imagen personalizada con Microsoft Dev Box. Para obtener más información, consulte Inicio rápido: Configuración de Microsoft Dev Box.