windows-builder

Build Windows images with Packer using WinRM communicator and PowerShell provisioners. Use when creating Windows AMIs, Azure images, or VMware templates.

npx skills add https://github.com/hashicorp/agent-skills --skill windows-builder

Windows Builder

Platform-agnostic patterns for building Windows images with Packer.

Reference: WinRM Communicator

Note: Windows builds incur significant costs and time. Expect 45-120 minutes per build due to Windows Updates. Failed builds may leave resources running - always verify cleanup.

WinRM Communicator Setup

Windows requires WinRM for Packer communication.

AWS Example

source "amazon-ebs" "windows" {
  region        = "us-west-2"
  instance_type = "t3.medium"

  source_ami_filter {
    filters = {
      name = "Windows_Server-2022-English-Full-Base-*"
    }
    most_recent = true
    owners      = ["amazon"]
  }

  ami_name = "windows-server-2022-${local.timestamp}"

  communicator   = "winrm"
  winrm_username = "Administrator"
  winrm_use_ssl  = true
  winrm_insecure = true
  winrm_timeout  = "15m"

  user_data_file = "scripts/setup-winrm.ps1"
}

WinRM Setup Script (scripts/setup-winrm.ps1)

<powershell>
# Configure WinRM
winrm quickconfig -q
winrm set winrm/config '@{MaxTimeoutms="1800000"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
winrm set winrm/config/service/auth '@{Basic="true"}'

# Configure firewall
netsh advfirewall firewall add rule name="WinRM 5985" protocol=TCP dir=in localport=5985 action=allow
netsh advfirewall firewall add rule name="WinRM 5986" protocol=TCP dir=in localport=5986 action=allow

# Restart WinRM
net stop winrm
net start winrm
</powershell>

Azure Example

source "azure-arm" "windows" {
  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 = "images-rg"
  managed_image_name                = "windows-${local.timestamp}"

  os_type         = "Windows"
  image_publisher = "MicrosoftWindowsServer"
  image_offer     = "WindowsServer"
  image_sku       = "2022-datacenter-g2"

  location = "East US"
  vm_size  = "Standard_D2s_v3"

  # Azure auto-configures WinRM
  communicator   = "winrm"
  winrm_use_ssl  = true
  winrm_insecure = true
  winrm_timeout  = "15m"
  winrm_username = "packer"
}

PowerShell Provisioners

Install Software

build {
  sources = ["source.amazon-ebs.windows"]

  # Install Chocolatey
  provisioner "powershell" {
    inline = [
      "Set-ExecutionPolicy Bypass -Scope Process -Force",
      "iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))"
    ]
  }

  # Install applications
  provisioner "powershell" {
    inline = [
      "choco install -y googlechrome",
      "choco install -y 7zip",
    ]
  }

  # Install IIS
  provisioner "powershell" {
    inline = [
      "Install-WindowsFeature -Name Web-Server -IncludeManagementTools"
    ]
  }
}

Windows Updates

provisioner "powershell" {
  inline = [
    "Install-PackageProvider -Name NuGet -Force",
    "Install-Module -Name PSWindowsUpdate -Force",
    "Import-Module PSWindowsUpdate",
    "Get-WindowsUpdate -Install -AcceptAll -AutoReboot",
  ]
  timeout = "2h"
}

# Wait for reboots
provisioner "windows-restart" {
  restart_timeout = "30m"
}

Cleanup

provisioner "powershell" {
  inline = [
    "# Clear temp files",
    "Remove-Item -Path 'C:\\Windows\\Temp\\*' -Recurse -Force -ErrorAction SilentlyContinue",
    "# Clear Windows Update cache",
    "Stop-Service -Name wuauserv -Force",
    "Remove-Item -Path 'C:\\Windows\\SoftwareDistribution\\*' -Recurse -Force -ErrorAction SilentlyContinue",
    "Start-Service -Name wuauserv",
  ]
}

Common Issues

WinRM Timeout

  • Increase winrm_timeout to 15m or more
  • Verify security group allows ports 5985/5986
  • Check user data script completed successfully

PowerShell Execution Policy

provisioner "powershell" {
  inline = [
    "Set-ExecutionPolicy Bypass -Scope Process -Force",
    "# Your commands here",
  ]
}

Long Build Times

  • Windows Updates can take 1-2 hours
  • Use pre-patched base images when available
  • Set provisioner timeout = "2h"

References

Lebih banyak skill dari hashicorp

provider-actions
hashicorp
Implementasikan aksi Terraform Provider menggunakan Plugin Framework. Gunakan saat mengembangkan operasi imperatif yang dieksekusi pada peristiwa siklus hidup (sebelum/sesudah…
official
new-terraform-provider
hashicorp
Gunakan ini saat membuat kerangka penyedia Terraform baru dengan Plugin Framework: tata letak workspace, pengaturan modul go, main.go server penyedia, dan provider.go…
official
terraform-test
hashicorp
Panduan komprehensif untuk menulis dan menjalankan tes Terraform. Gunakan saat membuat file tes (.tftest.hcl), menulis skenario tes dengan run blocks, memvalidasi…
official
terraform-test
hashicorp
Panduan lengkap untuk menulis dan menjalankan tes Terraform dengan asersi, mocking, dan validasi modul. Tulis file tes menggunakan sintaks .tftest.hcl dengan blok run yang dijalankan dalam mode plan atau apply, mendukung eksekusi sekuensial dan paralel dengan isolasi status opsional. Asersi kondisi pada atribut sumber daya, output, dan sumber data; gunakan expect_failures untuk memvalidasi bahwa input yang tidak valid ditolak dengan benar. Mock provider (Terraform 1.7.0+) mensimulasikan perilaku infrastruktur tanpa...
official
provider-actions
hashicorp
Menerapkan tindakan penyedia Terraform imperatif pada peristiwa siklus hidup sumber daya menggunakan Plugin Framework. Mendukung pemicu siklus hidup sebelum/sesudah pembuatan dan sebelum/sesudah pembaruan (peristiwa penghancuran tidak tersedia di Terraform 1.14.0). Memerlukan definisi skema yang tepat dengan tipe kerangka yang benar, ElementType untuk koleksi, dan validator untuk validasi input. Termasuk pelaporan kemajuan, manajemen waktu tunggu, dan penanganan kesalahan yang komprehensif untuk operasi yang berjalan lama. Menerapkan polling dan...
official
aws-ami-builder
hashicorp
Bangun Amazon Machine Images kustom dengan builder amazon-ebs milik Packer. Mengotomatiskan pembuatan AMI dari AMI sumber menggunakan templat HCL dengan provisioner untuk kustomisasi (skrip shell, unggahan file, manajemen konfigurasi). Mendukung distribusi AMI multi-region melalui ami_regions dan pemfilteran AMI sumber yang fleksibel berdasarkan nama, pemilik, dan tipe virtualisasi. Otentikasi melalui variabel lingkungan, file kredensial AWS, atau profil instance IAM; mencakup perintah validasi dan build untuk templat...
official
new-terraform-provider
hashicorp
Membuat kerangka penyedia Terraform baru menggunakan Plugin Framework. Menghasilkan ruang kerja modul Go baru dengan konvensi penamaan standar "terraform-provider-" dan menginisialisasi dependensi yang diperlukan. Menyediakan file main.go template yang mengikuti pola Plugin Framework HashiCorp, dengan penanda TODO untuk kustomisasi. Memvalidasi pengaturan dengan menjalankan perintah build dan test untuk memastikan penyedia dapat dikompilasi dan lolos pemeriksaan awal. Menangani manajemen ruang kerja dengan mengonfirmasi niat sebelum membuat yang baru...
official
azure-verified-modules
hashicorp
Persyaratan sertifikasi dan praktik terbaik untuk modul Azure Terraform yang mencari kepatuhan AVM. Menerapkan batasan versi penyedia (azurerm >= 4.0, < 5.0; azapi >= 2.0, < 3.0) dan melarang referensi modul berbasis git demi sumber registry Terraform yang tetap. Mewajibkan penggunaan snake_case untuk semua pengidentifikasi, tipe variabel yang presisi, atribut output diskrit melalui pola lapisan anti-korupsi, dan lokal yang diurutkan secara alfabetis. Memerlukan variabel toggle fitur untuk sumber daya baru yang ditambahkan...
official