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-actions
hashicorp
Implémentez les actions du fournisseur Terraform à l'aide du Plugin Framework. À utiliser lors du développement d'opérations impératives qui s'exécutent lors d'événements de cycle de vie (avant/après…
official
new-terraform-provider
hashicorp
Utilisez ceci lors de la création d'un nouveau provider Terraform avec le Plugin Framework : disposition de l'espace de travail, configuration du module go, provider server main.go, et provider.go…
official
terraform-test
hashicorp
Guide complet pour écrire et exécuter des tests Terraform. À utiliser lors de la création de fichiers de test (.tftest.hcl), de l'écriture de scénarios de test avec des blocs run, de la validation…
official
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...
official
provider-actions
hashicorp
Implémente des actions impératives du fournisseur Terraform lors des événements du cycle de vie des ressources à l'aide du Plugin Framework. Prend en charge les déclencheurs de cycle de vie avant/après création et avant/après mise à jour (les événements de destruction ne sont pas disponibles dans Terraform 1.14.0). Nécessite une définition de schéma appropriée avec les types de framework corrects, ElementType pour les collections et des validateurs pour la validation des entrées. Inclut le rapport de progression, la gestion des délais d'attente et une gestion complète des erreurs pour les opérations de longue durée. Implémente le polling et...
official
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...
official
new-terraform-provider
hashicorp
Crée un nouveau fournisseur Terraform en utilisant le Plugin Framework. Génère un espace de travail Go avec la convention de nommage standard "terraform-provider-" et initialise les dépendances requises. Fournit un fichier main.go modèle suivant les schémas du Plugin Framework de HashiCorp, avec des marqueurs TODO pour la personnalisation. Valide la configuration en exécutant des commandes de build et de test pour garantir que le fournisseur compile et réussit les vérifications initiales. Gère l'espace de travail en confirmant l'intention avant de créer un nouveau...
official
azure-verified-modules
hashicorp
Exigences de certification et bonnes pratiques pour les modules Azure Terraform cherchant la conformité AVM. Impose des contraintes de version de fournisseur (azurerm >= 4.0, < 5.0 ; azapi >= 2.0, < 3.0) et interdit les références de modules basées sur git au profit de sources de registre Terraform épinglées. Impose le snake_case en minuscules pour tous les identifiants, des types de variables précis, des attributs de sortie discrets via un modèle de couche anti-corruption, et des locales ordonnées alphabétiquement. Nécessite des variables de basculement de fonctionnalités pour les nouvelles ressources ajoutées...
official