windows-builder

Construire des images Windows avec Packer en utilisant le communicateur WinRM et les provisionneurs PowerShell. Utiliser lors de la création d'AMI Windows, d'images Azure ou de modèles VMware.

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

Plus de skills de hashicorp

provider-framework-migration
hashicorp
Migrer les ressources et sources de données du provider Terraform du Plugin SDKv2 vers le Plugin Framework : multiplexage des deux plugins dans un seul provider (terraform-plugin-mux,…
provider-configuration
hashicorp
Implémenter la configuration et l'authentification du provider Terraform avec le Plugin Framework : schéma du provider pour les identifiants (attributs Optionnel + Sensible),…
provider-ephemeral-resources
hashicorp
Mettre en œuvre les ressources éphémères du fournisseur Terraform avec le Plugin Framework : le cycle de vie Open/Renew/Close, la conception de schéma éphémère, l'enregistrement via…
terraform-test
hashicorp
Guide complet pour écrire et exécuter des tests Terraform avec assertions, simulation et validation de modules. Rédigez des fichiers de test utilisant la syntaxe .tftest.hcl avec des blocs run qui s'exécutent en mode plan ou apply, prenant en charge l'exécution séquentielle et parallèle avec isolation d'état optionnelle. Affirmez les conditions sur les attributs de ressources, les sorties et les sources de données ; utilisez expect_failures pour valider que les entrées invalides sont correctement rejetées. Les fournisseurs simulés (Terraform 1.7.0+) simulent le comportement de l'infrastructure sans...
terraform-policy
hashicorp
Écrire, tester ou convertir des fichiers Terraform Policy (.policy.hcl, .policytest.hcl, Sentinel→tfpolicy). Déclencheurs : policy.hcl, policytest, convert sentinel, tfpolicy,…
terraform-search-import
hashicorp
Découvrir les ressources cloud existantes à l'aide de requêtes Terraform Search et les importer en masse dans la gestion Terraform. Utiliser lors de l'intégration d'infrastructure non gérée…
aws-ami-builder
hashicorp
Construisez des images Amazon Machine personnalisées avec le constructeur amazon-ebs de Packer. Automatise la création d'AMI à partir d'AMI sources à l'aide de modèles HCL avec des provisionneurs pour la personnalisation (scripts shell, téléchargements de fichiers, gestion de configuration). Prend en charge la distribution multi-région d'AMI via ami_regions et le filtrage flexible des AMI sources par nom, propriétaire et type de virtualisation. S'authentifie via des variables d'environnement, un fichier d'identifiants AWS ou des profils d'instance IAM ; inclut des commandes de validation et de construction pour le modèle...
tfctl
hashicorp
Interagir avec HCP Terraform / Terraform Cloud / Terraform Enterprise en utilisant l'interface en ligne de commande tfctl. Couverture complète de l'API. À utiliser pour TOUT HCP Terraform ou Terraform Cloud ou…