Compartir por


Creación de una imagen de Windows y distribución a una instancia de Azure Compute Gallery

Se aplica a: ✔️ Máquinas virtuales Windows

En este artículo, obtendrá información sobre cómo usar Azure VM Image Builder y Azure PowerShell para crear una versión de la imagen en una instancia de Azure Compute Gallery (anteriormente llamado Shared Image Gallery) y después distribuirla globalmente. También puede hacerlo mediante la CLI de Azure.

Para configurar la imagen, en este artículo se usa una plantilla JSON, que puede encontrar en armTemplateWinSIG.json. Descargará y editará una versión local de la plantilla, por lo que también usará una sesión local de PowerShell.

Para distribuir la imagen en una instancia de Azure Compute Gallery, en la plantilla se usa sharedImage como valor de la sección distribute de la plantilla.

VM Image Builder ejecuta Sysprep automáticamente para generalizar la imagen. El comando es un comando Sysprep genérico y puede invalidarlo si es necesario.

Tenga en cuenta el número de veces que pone una capa en las personalizaciones. Puede ejecutar el comando Sysprep un número limitado de veces en una sola imagen de Windows. Una vez alcanzado el límite de Sysprep, debe volver a crear la imagen de Windows. Para más información, consulte Límites en la cantidad de veces que se puede ejecutar Sysprep.

Registro de los proveedores

Para usar VM Image Builder, debe registrar los proveedores.

  1. Compruebe los registros del proveedor. Asegúrese de que cada uno devuelve el valor Registrado.

    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. Si no devuelven el valor Registrado, registre los proveedores mediante la ejecución de los siguientes comandos:

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

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

Creación de variables

Ya que usará algunos datos de forma repetida, cree diversas variables para almacenar esa información.

Reemplace los valores de las variables, por ejemplo username y vmpassword, por su propia información.

# 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

Creación de una identidad asignada por el usuario y establecimiento de los permisos en el grupo de recursos

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

# 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

Asignación de permisos para la entidad con el fin de 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"

Nota

Si recibe el error: "New-AzRoleDefinition: se ha superado el límite de definición de roles. No se pueden crear más definiciones de roles", consulte Solución de problemas de RBAC (control de acceso basado en rol) de Azure.

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.

Si aún no tiene una galería y una definición de imagen para usar, empiece por crearlas.

# 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'

Descarga y configuración de la plantilla

Descargue la plantilla JSON y configúrela con las variables.


$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

Creación de la versión de la imagen

La plantilla se debe enviar al servicio. Los comandos siguientes descargarán los artefactos dependientes, como los scripts, y los almacenarán en el grupo de recursos de almacenamiento provisional, que tiene el prefijo IT_.

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

Para crear la imagen, invoque "Run" (Ejecutar) en la plantilla.

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

La creación de la imagen y su replicación en ambas regiones puede tardar un tiempo. Antes de empezar a crear una máquina virtual, espere hasta que finalice esta parte.

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

Creación de la máquina virtual

Cree la máquina virtual a partir de la versión de la imagen que ha creado con VM Image Builder.

  1. Obtenga la versión de la imagen que ha creado:

    $imageVersion = Get-AzGalleryImageVersion `
    -ResourceGroupName $imageResourceGroup `
    -GalleryName $sigGalleryName `
    -GalleryImageDefinitionName $imageDefName
    $imageVersionId = $imageVersion.Id
    
  2. Cree la máquina virtual en la segunda región, donde se ha replicado la imagen:

    $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
    

Comprobación de la personalización

Cree una conexión de Escritorio remoto a la VM con el nombre de usuario y la contraseña que ha establecido al crear la VM. En la máquina virtual, abra una ventana del símbolo del sistema y ejecute el siguiente comando:

dir c:\

Debería ver un directorio con el nombre buildActions, que se ha creado durante la personalización de la imagen.

Limpieza de los recursos

Nota

Si ahora quiere volver a personalizar la versión de la imagen para crear una nueva de la misma, omita el paso que se indica aquí y vaya a Uso de VM Image Builder para crear otra versión de la imagen.

Si ya no necesita los recursos que ha creado mientras seguía el proceso de este artículo, puede eliminarlos.

El siguiente proceso elimina la imagen que ha creado y todos los demás archivos de recursos. Asegúrese de que ha terminado esta implementación antes de eliminar los recursos.

Elimine primero la plantilla del grupo de recursos. De lo contrario, no se limpiará el grupo de recursos de almacenamiento provisional (IT_) que usa VM Image Builder.

  1. Obtenga el elemento ResourceID de la plantilla de la imagen.

    $resTemplateId = Get-AzResource -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2022-02-14"
    
  2. Elimine la plantilla de la imagen.

    Remove-AzResource -ResourceId $resTemplateId.ResourceId -Force
    
  3. Elimine la asignación de roles.

    Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  4. Quite las definiciones.

    Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  5. Elimine la identidad.

    Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
    
  6. Elimine el grupo de recursos.

    Remove-AzResourceGroup $imageResourceGroup -Force
    

Pasos siguientes

Para actualizar la versión de la imagen que ha creado en este artículo, consulte Creación de una versión de una imagen de máquina virtual Windows a partir de otra existente mediante Azure Image Builder.