Compartir a través de


Uso de Azure VM Image Builder para crear una imagen de cuadro de desarrollo

En este artículo se muestra cómo usar una plantilla de Azure VM Image Builder para crear una imagen de máquina virtual personalizada en Azure Compute Gallery y distribuirla globalmente. A continuación, puede usar la imagen para crear cuadros de desarrollo en Microsoft Dev Box.

Las imágenes de máquina virtual estandarizadas pueden ayudarle a garantizar implementaciones coherentes de los cuadros de desarrollo mediante la inclusión de la seguridad, la configuración y el software predefinidos. Pero la configuración manual de una canalización de creación de imágenes requiere mucho tiempo y es compleja, y la creación de imágenes de máquina virtual (VM) personalizadas puede ser difícil y no confiable.

Azure VM Image Builder es un servicio administrado basado en HashiCorp Packer que simplifica el proceso de creación y creación de imágenes de máquina virtual para cuadros de desarrollo. La plantilla image Builder de este artículo incluye pasos de personalización que instalan Visual Studio Code y Chocolatey.

VM Image Builder puede:

  • Abstraer los pasos manuales o las herramientas y procesos complejos y ocultar las necesidades específicas de Azure. Por ejemplo, generalice una imagen mediante la ejecución de sysprep , pero permita que los usuarios avanzados lo invaliden.
  • Trabajar con canalizaciones de compilación de imágenes existentes. Puede llamar a VM Image Builder desde la canalización o usar una tarea de servicio de Azure VM Image Builder en Azure Pipelines.
  • Recopile datos de personalización de varios orígenes, por lo que no tiene que recopilarlos usted mismo.
  • Integración con Azure Compute Gallery para crear un sistema de administración de imágenes para la distribución global, la replicación, el control de versiones y el escalado. Puede distribuir una imagen como un disco duro virtual y una imagen administrada sin volver a generarla.

Importante

Microsoft Dev Box solo admite imágenes que usan el tipo de seguridad Trusted Launch .

Requisitos previos

En el ejemplo de este artículo se usa Azure PowerShell. También puede usar la CLI de Azure.

Categoría Requisitos
Herramientas y permisos Un grupo de recursos de Azure al que tiene permisos de propietario o colaborador .
Tools Azure PowerShell 6.0 o posterior instalado. Para obtener instrucciones, consulte Instalación de Azure PowerShell en Windows.

Configuración de herramientas y roles

Para configurar herramientas y roles, haga lo siguiente:

  1. Instale los módulos de Azure PowerShell necesarios.
  2. Establezca variables para la información que use más de una vez.
  3. Registre los proveedores de recursos de Azure necesarios.
  4. Cree una identidad de usuario para el grupo de recursos y asígnele un rol que permita distribuir imágenes.

Instalación de módulos de PowerShell

Ejecute el siguiente comando para instalar los módulos de PowerShell necesarios:

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

Responda Y a las indicaciones sobre los repositorios que no son de confianza.

Configuración de variables

Cree variables para almacenar información que use más de una vez. Ejecute el código siguiente, reemplazando <resource-group> por el nombre del grupo de recursos y <location> por la región de Azure que desea usar.

# Get existing context 
$currentAzContext = Get-AzContext

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

# Destination image resource group  
$imageResourceGroup="<resource-group>"

# Location
$location="<location>"

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

# Image template name  
$imageTemplateName="vscodeWinTemplate"  

Registro de proveedores de recursos de Azure

Para usar VM Image Builder, se deben registrar los siguientes proveedores de recursos de Azure:

  • Microsoft.VirtualMachineImages
  • Microsoft.Compute
  • Microsoft.Network
  • Microsoft.Storage
  • Microsoft.KeyVault
  • Microsoft.ContainerInstance
  1. Para comprobar los registros de proveedor, ejecute el comando siguiente:

      Get-AzResourceProvider -ProviderNamespace "Microsoft.VirtualMachineImages", "Microsoft.Compute", "Microsoft.Network", "Microsoft.Storage", "Microsoft.KeyVault", "Microsoft.ContainerInstance" | Format-table -Property ProviderNamespace,RegistrationState
    
  2. Si alguno de los registros de proveedor no devuelve Registered, registre el proveedor ejecutando el Register-AzResourceProvider comando . En el ejemplo siguiente se registra el Microsoft.VirtualMachineImages proveedor de recursos.

      Register-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages
    

Creación y asignación de una identidad de usuario

Cree una definición de rol de Azure que permita distribuir la imagen. A continuación, cree una identidad asignada por el usuario para el grupo de recursos y asigne el rol a la identidad de usuario. VM Image Builder usa la identidad de usuario para almacenar la imagen en Azure Compute Gallery.

  1. Ejecute el código siguiente para crear una definición de roles de Azure e identidad de usuario.

    # Set up a unique role definition name
    $timeInt=$(get-date -UFormat "%s") 
    $imageRoleDefName="Azure Image Builder Image Def"+$timeInt 
    $identityName="aibIdentity"+$timeInt 
    
    # 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
    
  2. Ejecute el código siguiente para descargar una plantilla de definición de roles de Azure que permita distribuir una imagen, actualizar la plantilla con los parámetros y asignar el rol a la identidad del usuario.

    $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 Azure Compute Gallery, necesita una galería y una definición de imagen. En los pasos siguientes se crea una nueva galería y definición de imagen y se personaliza una plantilla de Vm Image Builder.

  1. Ejecute los siguientes comandos para crear una nueva galería y una definición de imagen que tenga el tipo de seguridad de inicio de confianza necesario para una imagen de Windows 365.

    # Gallery name 
    $galleryName= "devboxGallery" 
    
    # Image definition name 
    $imageDefName ="vscodeImageDef" 
    
    # Second 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. Copie y pegue la siguiente plantilla de Azure Resource Manager para VM Image Builder en un nuevo archivo. Guarde el archivo en una ubicación como c:\temp\mytemplate.jsy, a continuación, cierre el archivo.

    La plantilla define la imagen de origen y las personalizaciones aplicadas, instala Chocolatey y Visual Studio Code e indica 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 VS Code",
                "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>"
                   ]
                }
             ]
          }
         }
       ]
      }
    
  3. Configure la nueva plantilla con tu configuración ejecutando el siguiente código, reemplazando <template-location> por la ubicación y el nombre de tu archivo de plantilla.

    $templateFilePath = "<template-location>"
    
    (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 
    

Compilación y visualización de la imagen

Envíe la plantilla personalizada al servicio VM Image Builder y compile la imagen.

  1. Ejecute el siguiente comando para enviar la plantilla al servicio. El comando descarga los artefactos dependientes, como scripts, y los almacena en un grupo de recursos de desarrollo provisional con el prefijo IT_.

    New-AzResourceGroupDeployment  -ResourceGroupName $imageResourceGroup  -TemplateFile $templateFilePath  -Api-Version "2020-02-14"  -imageTemplateName $imageTemplateName  -svclocation $location 
    
  2. Compile la imagen invocando la Run acción en la plantilla. En el mensaje de confirmación, pulse Y para Yes.

    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 dos regiones puede tardar algún tiempo. Es posible que vea informes de progreso diferentes entre PowerShell y Azure Portal. Espere hasta que se complete el proceso antes de empezar a crear una definición de cuadro de desarrollo a partir de la imagen.

Obtención de información sobre la imagen

Ejecute el siguiente comando para obtener 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 

Salida de ejemplo:

Name              LastRunStatusRunState LastRunStatusMessage ProvisioningState
----              --------------------- -------------------- -----------------
vscodeWinTemplate Running                                    Succeeded

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

Captura de pantalla que muestra el estado de aprovisionamiento de la versión de imagen personalizada.

Una vez almacenada la imagen personalizada en la galería, puede configurar la galería para que use sus imágenes en un centro de desarrollo de Microsoft Dev Box. Para más información, consulte Configuración de Azure Compute Gallery para Microsoft Dev Box.

Después de que las imágenes de la galería estén disponibles en el centro de desarrollo, puede adjuntar la imagen personalizada a un proyecto de cuadro de desarrollo y usarla para crear cuadros de desarrollo. Para obtener más información, consulte Inicio rápido: Configuración de Microsoft Dev Box.