Criar uma imagem do Windows e distribuí-la para uma Galeria de Computação do Azure
Aplica-se a: ✔️ VMs do Windows
Neste artigo, você aprenderá a usar o Construtor de Imagens de VM do Azure e o Azure PowerShell para criar uma versão de imagem em uma Galeria de Computação do Azure (anteriormente Galeria de Imagens Compartilhadas) e, em seguida, distribuir a imagem globalmente. Você também pode fazer isso usando a CLI do Azure.
Para configurar a imagem, este artigo usa um modelo JSON, que você pode encontrar em armTemplateWinSIG.json. Você baixará e editará uma versão local do modelo, portanto, também usará uma sessão local do PowerShell.
Para distribuir a imagem para uma Galeria de Computação do Azure, o modelo usa sharedImage como o valor para a distribute
seção do modelo.
O VM Image Builder é executado Sysprep
automaticamente para generalizar a imagem. O comando é um comando genérico Sysprep
e você pode substituí-lo se necessário.
Esteja ciente do número de vezes que você coloca personalizações em camadas. Você pode executar o Sysprep
comando um número limitado de vezes em uma única imagem do Windows. Depois de atingir o Sysprep
limite, você deve recriar sua imagem do Windows. Para obter mais informações, consulte Limites de quantas vezes você pode executar o Sysprep.
Registar os fornecedores
Para usar o VM Image Builder, você precisa registrar os provedores.
Verifique os registos do seu fornecedor. Certifique-se de que cada um retorna 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
Se eles não retornarem Registrado, registre os provedores executando os seguintes 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
Instale os módulos do PowerShell:
'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
Criar variáveis
Como você usará algumas informações repetidamente, crie algumas variáveis para armazenar essas informações.
Substitua os valores das variáveis, como username
e vmpassword
, por suas próprias informações.
# 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
Criar uma identidade atribuída pelo usuário e definir permissões no grupo de recursos
O Construtor de Imagens de VM usa a identidade de usuário fornecida para injetar a imagem na Galeria de Computação do Azure. Neste exemplo, você cria uma definição de função do Azure com ações específicas para distribuir a imagem. A definição de função é então atribuída à identidade do usuário.
# 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
Atribuir permissões para a identidade distribuir as imagens
Use este comando para baixar um modelo de definição de função do Azure e atualize-o com os 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
Se você receber o erro "New-AzRoleDefinition: limite de definição de função excedido. Não é possível criar mais definições de função", consulte Solucionar problemas do RBAC do Azure (controle de acesso baseado em função).
Criar uma Galeria de Computação do Azure
Para usar o Construtor de Imagens de VM com uma Galeria de Computação do Azure, você precisa ter uma galeria e uma definição de imagem existentes. O VM Image Builder não cria a galeria e a definição de imagem para você.
Se ainda não tiver uma galeria e uma definição de imagem para usar, comece por criá-las.
# 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'
Baixar e configurar o modelo
Baixe o modelo JSON e configure-o com suas variáveis.
$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
Criar a versão da imagem
O seu modelo deve ser enviado para o serviço. Os comandos a seguir baixarão todos os artefatos dependentes, como scripts, e os armazenarão no grupo de recursos de preparo, que é prefixado com IT_.
New-AzResourceGroupDeployment `
-ResourceGroupName $imageResourceGroup `
-TemplateFile $templateFilePath `
-ApiVersion "2022-02-14" `
-imageTemplateName $imageTemplateName `
-svclocation $location
Para criar a imagem, invoque 'Executar' no modelo.
Invoke-AzResourceAction `
-ResourceName $imageTemplateName `
-ResourceGroupName $imageResourceGroup `
-ResourceType Microsoft.VirtualMachineImages/imageTemplates `
-ApiVersion "2022-02-14" `
-Action Run
Criar a imagem e replicá-la para ambas as regiões pode levar alguns momentos. Antes de começar a criar uma VM, aguarde até que esta parte esteja concluída.
Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup |
Select-Object -Property Name, LastRunStatusRunState, LastRunStatusMessage, ProvisioningState
Criar a VM
Crie uma VM a partir da versão de imagem que você criou com o VM Image Builder.
Obtenha a versão da imagem que criou:
$imageVersion = Get-AzGalleryImageVersion ` -ResourceGroupName $imageResourceGroup ` -GalleryName $sigGalleryName ` -GalleryImageDefinitionName $imageDefName $imageVersionId = $imageVersion.Id
Crie a VM na segunda região, onde a imagem foi replicada:
$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
Verificar a personalização
Crie uma conexão de Área de Trabalho Remota para a VM usando o nome de usuário e a senha que você definiu quando criou a VM. Na VM, abra uma janela do Prompt de Comando e execute o seguinte comando:
dir c:\
Você verá um diretório chamado buildActions
que foi criado durante a personalização da imagem.
Limpar os recursos
Nota
Se agora você quiser tentar repersonalizar a versão da imagem para criar uma nova versão da mesma imagem, ignore a etapa descrita aqui e vá para Usar o Construtor de Imagens de VM para criar outra versão da imagem.
Se você não precisar mais dos recursos que criou enquanto seguia o processo neste artigo, poderá excluí-los.
O processo a seguir exclui a imagem que você criou e todos os outros arquivos de recurso. Certifique-se de que concluiu esta implementação antes de eliminar os recursos.
Exclua primeiro o modelo de grupo de recursos. Caso contrário, o grupo de recursos de preparo (IT_) que o Construtor de Imagens de VM usa não será limpo.
Obtenha o ResourceID do modelo de imagem.
$resTemplateId = Get-AzResource -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2022-02-14"
Excluir modelo de imagem.
Remove-AzResource -ResourceId $resTemplateId.ResourceId -Force
Exclua a atribuição de função.
Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
Remova as definições.
Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
Exclua a identidade.
Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
Exclua o grupo de recursos.
Remove-AzResourceGroup $imageResourceGroup -Force
Próximos passos
Para atualizar a versão da imagem que você criou neste artigo, consulte Usar o VM Image Builder para criar outra versão da imagem.