Azure Image Builder

by hashicorpf706481af9b8No license890 starsListed Oct 8, 2026Updated Oct 8, 2026Repository updated 3 days ago

Build Azure managed images and Azure Compute Gallery images with Packer. Use when creating custom images for Azure VMs.

Instructions onlyDevOps & Cloud
AI-generated overview

Builds Azure managed images and Azure Compute Gallery images with Packer's azure-arm builder.

What it does
This skill provides Packer HCL templates and guidance for building custom Azure VM images using the azure-arm builder. It covers managed image output, Azure Compute Gallery destinations with replication regions, service principal and managed identity authentication, and the packer init, validate and build commands. It also lists common issues such as authentication failures, immutable gallery versions and provisioning timeouts.
When to use it
Use it when creating custom Azure images for virtual machines, whether as managed images or as versions published to an Azure Compute Gallery. It suits teams that need repeatable, Packer-based image builds on Azure.
Requirements
Requires Packer with the HashiCorp Azure plugin, Azure credentials (service principal client ID, secret, subscription and tenant IDs, or CLI/managed identity auth), and network access to Azure. Builds incur Azure compute, storage and data transfer costs. Ships no scripts; instructions only.

Azure Image Builder

Build Azure managed images and Azure Compute Gallery images using Packer's azure-arm builder.

Reference: Azure ARM Builder

Note: Building Azure images incurs costs (compute, storage, data transfer). Builds typically take 15-45 minutes depending on provisioning and OS.

Basic Managed Image

hcl
packer {  required_plugins {    azure = {      source  = "github.com/hashicorp/azure"      version = "~> 2.0"    }  }}
variable "client_id" {  type      = string  sensitive = true}
variable "client_secret" {  type      = string  sensitive = true}
variable "subscription_id" {  type = string}
variable "tenant_id" {  type = string}
variable "resource_group" {  type    = string  default = "packer-images-rg"}
locals {  timestamp = regex_replace(timestamp(), "[- TZ:]", "")}
source "azure-arm" "ubuntu" {  client_id       = var.client_id  client_secret   = var.client_secret  subscription_id = var.subscription_id  tenant_id       = var.tenant_id
  managed_image_resource_group_name = var.resource_group  managed_image_name                = "my-app-${local.timestamp}"
  os_type         = "Linux"  image_publisher = "Canonical"  image_offer     = "0001-com-ubuntu-server-jammy"  image_sku       = "22_04-lts-gen2"
  location = "East US"  vm_size  = "Standard_B2s"
  azure_tags = {    Name      = "my-app"    BuildDate = local.timestamp  }}
build {  sources = ["source.azure-arm.ubuntu"]
  provisioner "shell" {    inline = [      "sudo apt-get update",      "sudo apt-get upgrade -y",    ]  }}

Azure Compute Gallery

hcl
source "azure-arm" "ubuntu" {  client_id       = var.client_id  client_secret   = var.client_secret  subscription_id = var.subscription_id  tenant_id       = var.tenant_id
  os_type         = "Linux"  image_publisher = "Canonical"  image_offer     = "0001-com-ubuntu-server-jammy"  image_sku       = "22_04-lts-gen2"
  location = "East US"  vm_size  = "Standard_B2s"
  shared_image_gallery_destination {    resource_group       = "gallery-rg"    gallery_name         = "myImageGallery"    image_name           = "ubuntu-webapp"    image_version        = "1.0.${formatdate("YYYYMMDD", timestamp())}"    replication_regions  = ["East US", "West US 2"]    storage_account_type = "Standard_LRS"  }}

Authentication

Service Principal

bash
# Create service principalaz ad sp create-for-rbac \  --name "packer-sp" \  --role Contributor \  --scopes /subscriptions/<subscription-id>
# Set environment variablesexport ARM_CLIENT_ID="<client-id>"export ARM_CLIENT_SECRET="<client-secret>"export ARM_SUBSCRIPTION_ID="<subscription-id>"export ARM_TENANT_ID="<tenant-id>"

Managed Identity

hcl
source "azure-arm" "ubuntu" {  use_azure_cli_auth = true  subscription_id    = var.subscription_id  # ... rest of configuration}

Build Commands

bash
# Set authenticationexport ARM_CLIENT_ID="your-client-id"export ARM_CLIENT_SECRET="your-client-secret"export ARM_SUBSCRIPTION_ID="your-subscription-id"export ARM_TENANT_ID="your-tenant-id"
# Initialize pluginspacker init .
# Validate templatepacker validate .
# Build imagepacker build .

Common Issues

Authentication Failed

  • Verify service principal credentials
  • Ensure Contributor role on resource group
  • Check subscription and tenant IDs

Compute Gallery Version Exists

  • Image versions are immutable
  • Use unique version numbers with date/build number
  • Cannot overwrite existing versions

Timeout During Provisioning

  • Check network connectivity from build VM
  • Verify NSG rules allow required traffic
  • Increase timeout if needed

References

Source and attribution

Source:hashicorp/agent-skillsinplugins/packer/skills/azure-image-builderat commitf706481

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal

More from hashicorp/agent-skills

Azure Image Builder Agent Skill | SourceWeft