Creación de una máquina virtual Windows con VM Image Builder mediante PowerShell

Se aplica a: ✔️ Máquinas virtuales Windows

En este artículo, se muestra cómo crear una imagen de máquina virtual Windows personalizada mediante el módulo de PowerShell Azure VM Image Builder.

Requisitos previos

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

Si decide usar PowerShell de forma local, para este artículo es preciso que instale el módulo Azure PowerShell y que se conecte a la cuenta de Azure con el cmdlet Connect-AzAccount. Para más información, vea Instalar Azure PowerShell.

Algunos pasos requieren cmdlets del módulo Az.ImageBuilder. Instale por separado con el comando siguiente.

Install-Module -Name Az.ImageBuilder

Azure Cloud Shell

En Azure se hospeda Azure Cloud Shell, un entorno de shell interactivo que puede utilizar mediante el explorador. Puede usar Bash o PowerShell con Cloud Shell para trabajar con los servicios de Azure. 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.

Para iniciar Azure Cloud Shell:

Opción Ejemplo o vínculo
Seleccione Pruébelo en la esquina superior derecha de un bloque de código o de comandos. Solo con seleccionar Pruébelo no se copia automáticamente el código o comando en Cloud Shell. Screenshot that shows an example of Try It for Azure Cloud Shell.
Vaya a https://shell.azure.com o seleccione el botón Iniciar Cloud Shell para abrir Cloud Shell en el explorador. Button to launch Azure Cloud Shell.
Seleccione el botón Cloud Shell en la barra de menús de la esquina superior derecha de Azure Portal. Screenshot that shows the Cloud Shell button in the Azure portal

Para usar Azure Cloud Shell:

  1. Inicie Cloud Shell.

  2. Seleccione el botón Copiar en un bloque de código (o bloque de comandos) para copiar el código o comando.

  3. Pegue el código o comando 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.

  4. Seleccione Enter para ejecutar el código o comando.

Si tiene varias suscripciones a Azure, elija la suscripción adecuada en la que se debe facturar el recurso. Seleccione una suscripción específica con el cmdlet Set-AzContext.

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

Registro de proveedores

Si aún no lo ha hecho, registre los siguientes proveedores de recursos para usarlos con su suscripción de Azure:

  • Microsoft.Compute
  • Microsoft.KeyVault
  • Microsoft.Storage
  • Microsoft.Network
  • Microsoft.VirtualMachineImages
  • Microsoft.ManagedIdentity
  • Microsoft.ContainerInstance
Get-AzResourceProvider -ProviderNamespace Microsoft.Compute, Microsoft.KeyVault, Microsoft.Storage, Microsoft.VirtualMachineImages, Microsoft.Network, Microsoft.ManagedIdentity |
  Where-Object RegistrationState -ne Registered |
    Register-AzResourceProvider

Definición de variables

Dado que usará algunos datos de forma repetida, cree algunas variables para almacenar esa información:

# 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. Para confirmar que la variable subscriptionID contiene el id. de la suscripción, puede ejecutar la segunda línea en el ejemplo siguiente:

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

Crear un grupo de recursos

Cree un grupo de recursos de Azure con el cmdlet New-AzResourceGroup. Un grupo de recursos es un contenedor lógico en el que se implementan y se administran recursos de Azure como un grupo.

En el ejemplo siguiente, se crea un grupo de recursos basado en el nombre de la variable $imageResourceGroup en la región que ha especificado en la variable $location. Este grupo de recursos se usa para almacenar el artefacto de la plantilla de configuración de la imagen y la imagen misma.

New-AzResourceGroup -Name $imageResourceGroup -Location $location

Creación de una identidad de usuario y configuración de los permisos de rol

Conceda permisos a Azure Image Builder para crear imágenes en el grupo de recursos especificado mediante el ejemplo siguiente. Sin este permiso, el proceso de creación de la imagen no se completará correctamente.

  1. Cree variables para la definición de roles y los nombres de identidad. Estos valores deben ser únicos.

    [int]$timeInt = $(Get-Date -UFormat '%s')
    $imageRoleDefName = "Azure Image Builder Image Def $timeInt"
    $identityName = "myIdentity$timeInt"
    
  2. Cree una identidad de usuario.

    New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
    
  3. Almacene el recurso de identidad y los id. de entidad de seguridad en las variables.

    $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

  1. Descargue el archivo de configuración JSON y, a continuación, modifíquelo en función de la configuración definida en este artículo.

    $myRoleImageCreationUrl = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json'
    $myRoleImageCreationPath = "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
    
  2. Cree la definición de roles.

    New-AzRoleDefinition -InputFile $myRoleImageCreationPath
    
  3. Conceda la definición de roles a la entidad de servicio de VM Image Builder.

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

  1. Cree la galería.

    $myGalleryName = 'myImageGallery'
    $imageDefName = 'winSvrImages'
    
    New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location
    
  2. Cree una definición de galería.

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

Crear una imagen

  1. Cree un objeto de origen de VM Image Builder. Consulte Búsqueda y uso de imágenes de máquina virtual de Azure Marketplace con Azure PowerShell para ver los valores de parámetros válidos.

    $SrcObjParams = @{
      PlatformImageSource = $true
      Publisher = 'MicrosoftWindowsServer'
      Offer = 'WindowsServer'
      Sku = '2019-Datacenter'
      Version = 'latest'
    }
    $srcPlatform = New-AzImageBuilderTemplateSourceObject @SrcObjParams
    
  2. Cree un objeto distribuidor de VM Image Builder.

    $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-AzImageBuilderTemplateDistributorObject @disObjParams
    
  3. Cree un objeto de personalización de VM Image Builder.

    $ImgCustomParams01 = @{
      PowerShellCustomizer = $true
      Name = 'settingUpMgmtAgtPath'
      RunElevated = $false
      Inline = @("mkdir c:\\buildActions", "mkdir c:\\buildArtifacts", "echo Azure-Image-Builder-Was-Here  > c:\\buildActions\\buildActionsOutput.txt")
    }
    $Customizer01 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams01
    
  4. Cree un segundo objeto de personalización de VM Image Builder.

    $ImgCustomParams02 = @{
      FileCustomizer = $true
      Name = 'downloadBuildArtifacts'
      Destination = 'c:\\buildArtifacts\\index.html'
      SourceUri = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/exampleArtifacts/buildArtifacts/index.html'
    }
    $Customizer02 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams02
    
  5. Cree una plantilla de VM Image Builder.

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

Cuando se haya creado la plantilla, se devuelve un mensaje y se crea una plantilla de configuración de VM Image Builder en $imageResourceGroup.

Para determinar si el proceso de creación de la plantilla se ha realizado correctamente, utilice el ejemplo siguiente:

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

En segundo plano, VM Image Builder también crea un grupo de recursos de almacenamiento provisional en la suscripción. Este grupo de recursos se usa para la compilación de la imagen. Tiene el formato IT_<DestinationResourceGroup>_<TemplateName>.

Advertencia

No elimine directamente el grupo de recursos de almacenamiento provisional. Elimine el artefacto de la plantilla de imagen. Esto hará que se elimine el grupo de recursos de almacenamiento provisional.

Si el servicio notifica un error al enviar la plantilla de la configuración de la imagen, haga lo siguiente:

  • Consulte Solución de problemas de Azure VM Image Builder.

  • Antes de volver a intentar enviar la plantilla, elimínela siguiendo este ejemplo:

    Remove-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup
    

Iniciar la generación de imágenes

Para enviar la configuración de la imagen al servicio VM Image Builder, ejecute los siguientes comandos:

Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName

Espere a que finalice el proceso de creación de imágenes, lo que puede tardar hasta una hora.

Si se producen errores, consulte Solución de problemas de Azure VM Image Builder.

Crear una VM

  1. Almacene las credenciales de inicio de sesión de la máquina virtual en una variable. La contraseña debe ser compleja.

    $Cred = Get-Credential
    
  2. Cree la máquina virtual con la imagen que ha creado.

    $ArtifactId = (Get-AzImageBuilderTemplateRunOutput -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup).ArtifactId
    
    New-AzVM -ResourceGroupName $imageResourceGroup -Image $ArtifactId -Name myWinVM01 -Credential $Cred
    

Comprobación de las personalizaciones

  1. 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.

  2. Dentro de la máquina virtual, abra PowerShell y ejecute Get-Content como se muestra en el ejemplo siguiente:

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

    La salida se basa en el contenido del archivo creado durante el proceso de personalización de la imagen.

    Azure-Image-Builder-Was-Here
    
  3. En la misma sesión de PowerShell, compruebe la presencia del archivo c:\buildArtifacts\index.html para comprobar que la segunda personalización se haya completado correctamente, como se muestra en el ejemplo siguiente:

    Get-ChildItem c:\buildArtifacts\
    

    El resultado debe ser una lista de directorios que muestra que el archivo se ha descargado durante el proceso de personalización de la imagen.

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

Limpieza de los recursos

Si ya no necesita los recursos que se crearon durante este proceso, puede eliminarlos haciendo lo siguiente:

  1. Elimine la plantilla de VM Image Builder.

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
    
  2. Elimine el grupo de recursos de la imagen.

    Precaución

    En el ejemplo siguiente, se elimina el grupo de recursos especificado y todos los recursos que contiene. Si hay recursos que están fuera del ámbito de este artículo en el grupo de recursos especificado, también se eliminarán.

    Remove-AzResourceGroup -Name $imageResourceGroup
    

Pasos siguientes

Para más información sobre los componentes del archivo JSON que se usan en este artículo, consulte la referencia de la plantilla de VM Image Builder.