Vista previa: Creación de una máquina virtual Windows con Azure Image Builder mediante PowerShellPreview: Create a Windows VM with Azure Image Builder using PowerShell

En este artículo se muestra cómo puede crear una imagen personalizada de Windows mediante el módulo de PowerShell de Azure VM Image Builder.This article demonstrates how you can create a customized Windows image using the Azure VM Image Builder PowerShell module.

Precaución

Actualmente, el generador de imágenes de Azure se encuentra en versión preliminar pública.Azure Image Builder is currently in public preview. Esta versión preliminar se proporciona sin un acuerdo de nivel de servicio.This preview version is provided without a service level agreement. No se recomienda para las cargas de trabajo de producción.It's not recommended for production workloads. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas.Certain features might not be supported or might have constrained capabilities. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.For more information, see Supplemental Terms of Use for Microsoft Azure Previews.

Requisitos previosPrerequisites

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.If you don't have an Azure subscription, create a free account before you begin.

Si decide usar PowerShell de forma local, para este artículo es preciso que instale el módulo Az PowerShell y que se conecte a su cuenta de Azure con el cmdlet Connect-AzAccount.If you choose to use PowerShell locally, this article requires that you install the Az PowerShell module and connect to your Azure account using the Connect-AzAccount cmdlet. Para más información sobre cómo instalar el módulo Az PowerShell, consulte Instalación de Azure PowerShell.For more information about installing the Az PowerShell module, see Install Azure PowerShell.

Importante

Mientras los módulos de PowerShell Az.ImageBuilder y Az.ManagedServiceIdentity estén en versión preliminar, debe instalarlos de forma independiente mediante el cmdlet Install-Module con el parámetro AllowPrerelease.While the Az.ImageBuilder and Az.ManagedServiceIdentity PowerShell modules are in preview, you must install them separately using the Install-Module cmdlet with the AllowPrerelease parameter. Una vez que estos módulos de PowerShell estén disponibles con carácter general, formarán parte de las futuras versiones del módulo Az PowerShell y estarán disponibles de forma nativa en Azure Cloud Shell.Once these PowerShell modules become generally available, they become part of future Az PowerShell module releases and available natively from within Azure Cloud Shell.

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

Uso de Azure Cloud ShellUse Azure Cloud Shell

En Azure se hospeda Azure Cloud Shell, un entorno de shell interactivo que puede utilizar mediante el explorador.Azure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. Puede usar Bash o PowerShell con Cloud Shell para trabajar con los servicios de Azure.You can use either Bash or PowerShell with Cloud Shell to work with Azure services. Puede usar los comandos preinstalados de Cloud Shell para ejecutar el código de este artículo sin tener que instalar nada en su entorno local.You can use the Cloud Shell preinstalled commands to run the code in this article without having to install anything on your local environment.

Para iniciar Azure Cloud Shell:To start Azure Cloud Shell:

OpciónOption Ejemplo o vínculoExample/Link
Seleccione Pruébelo en la esquina superior derecha de un bloque de código.Select Try It in the upper-right corner of a code block. Solo con seleccionar Pruébelo no se copia automáticamente el código en Cloud Shell.Selecting Try It doesn't automatically copy the code to Cloud Shell. Ejemplo de Probarlo para Azure Cloud Shell
Vaya a https://shell.azure.com o seleccione el botón Iniciar Cloud Shell para abrir Cloud Shell en el explorador.Go to https://shell.azure.com, or select the Launch Cloud Shell button to open Cloud Shell in your browser. Iniciar Cloud Shell en una nueva ventanaLaunch Cloud Shell in a new window
Seleccione el botón Cloud Shell en la barra de menús de la esquina superior derecha de Azure Portal.Select the Cloud Shell button on the menu bar at the upper right in the Azure portal. Botón Cloud Shell en Azure Portal

Para ejecutar el código de este artículo en Azure Cloud Shell:To run the code in this article in Azure Cloud Shell:

  1. Inicie Cloud Shell.Start Cloud Shell.

  2. Seleccione el botón Copiar de un bloque de código para copiar el código.Select the Copy button on a code block to copy the code.

  3. Pegue el código en la sesión de Cloud Shell. Para ello, seleccione Ctrl+Mayús+V en Windows y Linux, o bien seleccione Cmd+Mayús+V en macOS.Paste the code into the Cloud Shell session by selecting Ctrl+Shift+V on Windows and Linux or by selecting Cmd+Shift+V on macOS.

  4. Seleccione Entrar para ejecutar el código.Select Enter to run the code.

Si tiene varias suscripciones a Azure, elija la suscripción adecuada en la que se debe facturar el recurso.If you have multiple Azure subscriptions, choose the appropriate subscription in which the resources should be billed. Seleccione una suscripción específica con el cmdlet Set-AzContext.Select a specific subscription using the Set-AzContext cmdlet.

Set-AzContext -SubscriptionId 00000000-0000-0000-0000-000000000000

Registro de característicasRegister features

Si esta es la primera vez que usa Azure Image Builder durante la versión preliminar, registre la nueva característica VirtualMachineTemplatePreview.If this is your first time using Azure image builder during the preview, register the new VirtualMachineTemplatePreview feature.

Register-AzProviderFeature -ProviderNamespace Microsoft.VirtualMachineImages -FeatureName VirtualMachineTemplatePreview

Compruebe el estado del registro de la característica.Check the status of the feature registration.

Nota

RegistrationState puede estar en el estado Registering durante varios minutos antes de cambiar a Registered.The RegistrationState may be in the Registering state for several minutes before changing to Registered. Espere hasta que el estado sea Registrado antes de continuar.Wait until the status is Registered before continuing.

Get-AzProviderFeature -ProviderNamespace Microsoft.VirtualMachineImages -FeatureName VirtualMachineTemplatePreview

Registre los siguientes proveedores de recursos para usarlos con la suscripción de Azure si aún no están registrados.Register the following resource providers for use with your Azure subscription if they aren't already registered.

  • Microsoft.ComputeMicrosoft.Compute
  • Microsoft.KeyVaultMicrosoft.KeyVault
  • Microsoft.StorageMicrosoft.Storage
  • Microsoft.NetworkMicrosoft.Network
  • Microsoft.VirtualMachineImagesMicrosoft.VirtualMachineImages
Get-AzResourceProvider -ProviderNamespace Microsoft.Compute, Microsoft.KeyVault, Microsoft.Storage, Microsoft.VirtualMachineImages, Microsoft.Network |
  Where-Object RegistrationState -ne Registered |
    Register-AzResourceProvider

Definición de variablesDefine variables

Usará varias partes de la información de forma repetida.You'll be using several pieces of information repeatedly. Cree variables para almacenar la información.Create variables to store the information.

# Destination image resource group name
$imageResourceGroup = 'myWinImgBuilderRG'

# Azure region
$location = 'WestUS2'

# Name of the image to be created
$imageTemplateName = 'myWinImage'

# Distribution properties of the managed image upon completion
$runOutputName = 'myDistResults'

Cree una variable para el id. de suscripción de Azure.Create a variable for your Azure subscription ID. Para confirmar que la variable subscriptionID contiene el id. de la suscripción, puede ejecutar la segunda línea en el ejemplo siguiente.To confirm that the subscriptionID variable contains your subscription ID, you can run the second line in the following example.

# Your Azure Subscription ID
$subscriptionID = (Get-AzContext).Subscription.Id
Write-Output $subscriptionID

Crear un grupo de recursosCreate a resource group

Cree un grupo de recursos de Azure con el cmdlet New-AzResourceGroup.Create an Azure resource group using the New-AzResourceGroup cmdlet. Un grupo de recursos es un contenedor lógico en el que se implementan y se administran recursos de Azure como un grupo.A resource group is a logical container in which Azure resources are deployed and managed as a group.

En el ejemplo siguiente se crea un grupo de recursos basado en el nombre de la variable $imageResourceGroup en la región especificada en la variable $location.The following example creates a resource group based on the name in the $imageResourceGroup variable in the region specified in the $location variable. Este grupo de recursos se usa para almacenar el artefacto de la plantilla de configuración de la imagen y la imagen misma.This resource group is used to store the image configuration template artifact and the image.

New-AzResourceGroup -Name $imageResourceGroup -Location $location

Creación de una identidad de usuario y configuración de los permisos de rolCreate user identity and set role permissions

Conceda permisos a Azure Image Builder para crear imágenes en el grupo de recursos especificado mediante el ejemplo siguiente.Grant Azure image builder permissions to create images in the specified resource group using the following example. Sin este permiso, el proceso de compilación de la imagen no se completará correctamente.Without this permission, the image build process won't complete successfully.

Cree variables para la definición de roles y los nombres de identidad.Create variables for the role definition and identity names. Estos valores deben ser únicos.These values must be unique.

[int]$timeInt = $(Get-Date -UFormat '%s')
$imageRoleDefName = "Azure Image Builder Image Def $timeInt"
$identityName = "myIdentity$timeInt"

Cree una identidad de usuario.Create a user identity.

New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName

Almacene el recurso de identidad y los id. de entidad de seguridad en las variables.Store the identity resource and principal IDs in variables.

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

Asignación de permisos para identidad para distribuir imágenesAssign permissions for identity to distribute images

Descargue el archivo de configuración JSON y modifíquelo en función de la configuración definida en este artículo.Download .json config file and modify it based on the settings defined in this article.

$myRoleImageCreationUrl = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json'
$myRoleImageCreationPath = "$env:TEMP\myRoleImageCreation.json"

Invoke-WebRequest -Uri $myRoleImageCreationUrl -OutFile $myRoleImageCreationPath -UseBasicParsing

$Content = Get-Content -Path $myRoleImageCreationPath -Raw
$Content = $Content -replace '<subscriptionID>', $subscriptionID
$Content = $Content -replace '<rgName>', $imageResourceGroup
$Content = $Content -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName
$Content | Out-File -FilePath $myRoleImageCreationPath -Force

Cree la definición de roles.Create the role definition.

New-AzRoleDefinition -InputFile $myRoleImageCreationPath

Conceda la definición de roles a la entidad de servicio de Image Builder.Grant the role definition to the image builder service principal.

$RoleAssignParams = @{
  ObjectId = $identityNamePrincipalId
  RoleDefinitionName = $imageRoleDefName
  Scope = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
}
New-AzRoleAssignment @RoleAssignParams

Nota

Si recibe el error: "New-AzRoleDefinition: Se ha superado el límite de definiciones de rol. No se pueden crear más definiciones de roles. ", consulte Solución de problemas de Azure RBAC.If you receive the error: "New-AzRoleDefinition: Role definition limit exceeded. No more role definitions can be created.", see Troubleshoot Azure RBAC.

Cree la galería.Create the gallery.

$myGalleryName = 'myImageGallery'
$imageDefName = 'winSvrImages'

New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location

Cree una definición de galería.Create a gallery definition.

$GalleryParams = @{
  GalleryName = $myGalleryName
  ResourceGroupName = $imageResourceGroup
  Location = $location
  Name = $imageDefName
  OsState = 'generalized'
  OsType = 'Windows'
  Publisher = 'myCo'
  Offer = 'Windows'
  Sku = 'Win2019'
}
New-AzGalleryImageDefinition @GalleryParams

Crear una imagenCreate an image

Cree un objeto de origen de Azure Image Builder.Create an Azure image builder source object. Consulte Búsqueda de imágenes de VM de Windows en Azure Marketplace con Azure PowerShell para ver los valores de parámetros válidos.See Find Windows VM images in the Azure Marketplace with Azure PowerShell for valid parameter values.

$SrcObjParams = @{
  SourceTypePlatformImage = $true
  Publisher = 'MicrosoftWindowsServer'
  Offer = 'WindowsServer'
  Sku = '2019-Datacenter'
  Version = 'latest'
}
$srcPlatform = New-AzImageBuilderSourceObject @SrcObjParams

Cree un objeto distribuidor de Azure Image Builder.Create an Azure image builder distributor object.

$disObjParams = @{
  SharedImageDistributor = $true
  ArtifactTag = @{tag='dis-share'}
  GalleryImageId = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup/providers/Microsoft.Compute/galleries/$myGalleryName/images/$imageDefName"
  ReplicationRegion = $location
  RunOutputName = $runOutputName
  ExcludeFromLatest = $false
}
$disSharedImg = New-AzImageBuilderDistributorObject @disObjParams

Cree un objeto de personalización de Azure Image Builder.Create an Azure image builder customization object.

$ImgCustomParams01 = @{
  PowerShellCustomizer = $true
  CustomizerName = 'settingUpMgmtAgtPath'
  RunElevated = $false
  Inline = @("mkdir c:\\buildActions", "mkdir c:\\buildArtifacts", "echo Azure-Image-Builder-Was-Here  > c:\\buildActions\\buildActionsOutput.txt")
}
$Customizer01 = New-AzImageBuilderCustomizerObject @ImgCustomParams01

Cree un segundo objeto de personalización de Azure Image Builder.Create a second Azure image builder customization object.

$ImgCustomParams02 = @{
  FileCustomizer = $true
  CustomizerName = 'downloadBuildArtifacts'
  Destination = 'c:\\buildArtifacts\\index.html'
  SourceUri = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/exampleArtifacts/buildArtifacts/index.html'
}
$Customizer02 = New-AzImageBuilderCustomizerObject @ImgCustomParams02

Cree una plantilla de Azure Image Builder.Create an Azure image builder template.

$ImgTemplateParams = @{
  ImageTemplateName = $imageTemplateName
  ResourceGroupName = $imageResourceGroup
  Source = $srcPlatform
  Distribute = $disSharedImg
  Customize = $Customizer01, $Customizer02
  Location = $location
  UserAssignedIdentityId = $identityNameResourceId
}
New-AzImageBuilderTemplate @ImgTemplateParams

Al completarse, se devuelve un mensaje y se crea una plantilla de configuración de Image Builder en $imageResourceGroup.When complete, a message is returned and an image builder configuration template is created in the $imageResourceGroup.

Para determinar si el proceso de creación de la plantilla se ha realizado correctamente, puede usar el ejemplo siguiente.To determine if the template creation process was successful, you can use the following example.

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

Asimismo, Image Builder crea en segundo plano un grupo de recursos de almacenamiento provisional en la suscripción.In the background, image builder also creates a staging resource group in your subscription. Este grupo de recursos se usa para la compilación de la imagen.This resource group is used for the image build. Está en el formato IT_<DestinationResourceGroup>_<TemplateName>.It's in the format: IT_<DestinationResourceGroup>_<TemplateName>.

Advertencia

No elimine el grupo de recursos de almacenamiento provisional directamente.Do not delete the staging resource group directly. Elimine el artefacto de la plantilla de imagen. Esto hará que se elimine el grupo de recursos de almacenamiento provisional.Delete the image template artifact, this will cause the staging resource group to be deleted.

Si el servicio informa de un error durante el envío de la plantilla de configuración de la imagen:If the service reports a failure during the image configuration template submission:

Remove-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup

Iniciar la generación de imágenesStart the image build

Envíe la configuración de la imagen al servicio de VM Image Builder.Submit the image configuration to the VM image builder service.

Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName

Espere a que se complete el proceso de aprovisionamiento.Wait for the image build process to complete. Este paso puede tardar hasta una hora.This step could take up to an hour.

Si se producen errores, consulte Solución de errores de Azure VM Image Builder (AIB).If you encounter errors, review Troubleshooting Azure VM Image Build (AIB) Failures.

Crear una VMCreate a VM

Almacene las credenciales de inicio de sesión de la máquina virtual en una variable.Store login credentials for the VM in a variable. La contraseña debe ser compleja.The password must be complex.

$Cred = Get-Credential

Cree la máquina virtual con la imagen que ha creado.Create the VM using the image you created.

$ArtifactId = (Get-AzImageBuilderRunOutput -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup).ArtifactId

New-AzVM -ResourceGroupName $imageResourceGroup -Image $ArtifactId -Name myWinVM01 -Credential $Cred

Comprobación de las personalizacionesVerify the customizations

Cree una conexión de Escritorio remoto a la máquina virtual con el nombre de usuario y la contraseña que ha establecido al crear la máquina virtual.Create a Remote Desktop connection to the VM using the username and password you set when you created the VM. Dentro de la máquina virtual, abra PowerShell y ejecute Get-Content como se muestra en el ejemplo siguiente:Inside the VM, open PowerShell and run Get-Content as shown in the following example:

Get-Content -Path C:\buildActions\buildActionsOutput.txt

Debería ver la salida en función del contenido del archivo creado durante el proceso de personalización de la imagen.You should see output based on the contents of the file created during the image customization process.

Azure-Image-Builder-Was-Here

En la misma sesión de PowerShell, compruebe la presencia del archivo c:\buildArtifacts\index.html para confirmar que la segunda personalización se completó correctamente, como se muestra en el ejemplo siguiente:From the same PowerShell session, verify that the second customization completed successfully by checking for the presence of the file c:\buildArtifacts\index.html as shown in the following example:

Get-ChildItem c:\buildArtifacts\

El resultado debe ser una lista de directorios que muestre el archivo descargado durante el proceso de personalización de la imagen.The result should be a directory listing showing the file downloaded during the image customization process.

    Directory: C:\buildArtifacts

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          29/01/2021    10:04            276 index.html

Limpieza de recursosClean up resources

Si no se necesitan los recursos que se han creado en este artículo, puede eliminarlos con el siguiente comando.If the resources created in this article aren't needed, you can delete them by running the following examples.

Eliminar la plantilla de Image BuilderDelete the image builder template

Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName

Eliminar el grupo de recursos de imagenDelete the image resource group

Precaución

En el ejemplo siguiente se elimina el grupo de recursos especificado y todos los recursos que contiene.The following example deletes the specified resource group and all resources contained within it. Si los recursos que están fuera del ámbito de este artículo existen en el grupo de recursos especificado, también se eliminarán.If resources outside the scope of this article exist in the specified resource group, they will also be deleted.

Remove-AzResourceGroup -Name $imageResourceGroup

Pasos siguientesNext steps

Para obtener más información sobre los componentes del archivo .json que se usan en este artículo, vea Referencia de la plantilla de generador de imágenes.To learn more about the components of the .json file used in this article, see Image builder template reference.