自动化与脚本
用 Packer 构建 Windows 镜像时:通过…
当需要用 Packer 制作 Windows AMI、Azure 镜像或 VMware 模板时,按 WinRM + PowerShell 流程完成初始化、软件安装、系统更新和清理。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用 Packer 构建 Windows 特定
解决思路
- Windows 镜像必须使用 WinRM 作为 Packer communicator 与目标机通信。
- AWS 源示例:使用 amazon-ebs,设置 region、instance_type、source_ami_filter(name = Windows_Server-2022-English-Full-Base-*,most_recent = true,owners = ["amazon"]),ami_name = windows-server-2022-${local.timestamp}。
- AWS source 中设置 communicator = winrm,winrm_username = Administrator,winrm_use_ssl = true,winrm_insecure = true,winrm_timeout = 15m,user_data_file = scripts/setup-winrm.ps1。
- 创建 scripts/setup-winrm.ps1,使用 <powershell> 包裹脚本,在启动时配置 WinRM。
- 在 setup-winrm.ps1 中执行 winrm quickconfig -q。
- 设置 WinRM MaxTimeoutms:winrm set winrm/config '@{MaxTimeoutms="1800000"}'。
- 设置 WinRM service AllowUnencrypted true 和 auth Basic true。
- 添加入站防火墙规则允许 WinRM 5985/5986 TCP: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。
- 重启 WinRM:net stop winrm,然后 net start winrm。
- Azure 源示例:使用 azure-arm,设置 client_id、client_secret、subscription_id、tenant_id,managed_image_resource_group_name、managed_image_name,os_type = Windows,image_publisher = MicrosoftWindowsServer,image_offer = WindowsServer,image_sku = 2022-datacenter-g2,location、vm_size。
- Azure 中设置 communicator = winrm,winrm_use_ssl = true,winrm_insecure = true,winrm_timeout = 15m,winrm_username = packer;Azure 会自动配置 WinRM。
- 使用 powershell provisioner 安装 Chocolatey:Set-ExecutionPolicy Bypass -Scope Process -Force;iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))。
- 使用 powershell provisioner 通过 choco install -y 安装应用,例如 googlechrome、7zip。
- 使用 powershell provisioner 安装 IIS:Install-WindowsFeature -Name Web-Server -IncludeManagementTools。
- 使用 powershell provisioner 安装 Windows 更新:Install-PackageProvider -Name NuGet -Force;Install-Module -Name PSWindowsUpdate -Force;Import-Module PSWindowsUpdate;Get-WindowsUpdate -Install -AcceptAll -AutoReboot;设置 timeout = 2h。
- 使用 windows-restart provisioner 等待重启,设置 restart_timeout = 30m。
- 清理临时文件:Remove-Item -Path 'C:\Windows\Temp\*' -Recurse -Force -ErrorAction SilentlyContinue。
- 清理 Windows Update 缓存:Stop-Service -Name wuauserv -Force;Remove-Item -Path 'C:\Windows\SoftwareDistribution\*' -Recurse -Force -ErrorAction SilentlyContinue;Start-Service -Name wuauserv。
- 遇到 WinRM 超时:将 winrm_timeout 增加到 15m 或更长;确认安全组/防火墙允许 5985/5986;检查 user data 脚本是否成功完成。
- 遇到 PowerShell 执行策略问题:在 provisioner 中执行 Set-ExecutionPolicy Bypass -Scope Process -Force。
- 长构建时间处理:Windows Updates 可能耗时 1-2 小时;优先使用已预打补丁的基础镜像;将 provisioner timeout 设为 2h。
- 预期 Windows 构建成本高且耗时 45-120 分钟;失败的构建可能遗留运行中的资源,务必验证并清理资源。
适用边界 · 注意事项
- 不适用于 Linux 镜像构建,或目标环境无法启用 WinRM/5985/5986 的场景。
- 不适用于没有 Packer、云平台或 VMware 权限/账号,无法创建临时构建资源的场景。
- 不适用于无法接受 45-120 分钟构建时间和可能产生费用的场景。