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. | |
Vaya a https://shell.azure.com o seleccione el botón Iniciar Cloud Shell para abrir Cloud Shell en el explorador. | |
Seleccione el botón Cloud Shell en la barra de menús de la esquina superior derecha de Azure Portal. |
Para usar Azure Cloud Shell:
Inicie Cloud Shell.
Seleccione el botón Copiar en un bloque de código (o bloque de comandos) para copiar el código o comando.
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.
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.
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"
Cree una identidad de usuario.
New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
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
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
Cree la definición de roles.
New-AzRoleDefinition -InputFile $myRoleImageCreationPath
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.
Creación de una instancia de Azure Compute Gallery
Cree la galería.
$myGalleryName = 'myImageGallery' $imageDefName = 'winSvrImages' New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location
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
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
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
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
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
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:
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
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
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
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.
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
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:
Elimine la plantilla de VM Image Builder.
Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
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.