
腾讯云Windows 使用 Packer 须知:
Windows 依赖 WinRM 建立网络连接,通过 WinRM 下发指令。由于 Windows 公共镜像默认没有完全启用 WinRM ,因此需要借助 UserData 启用 WinRM ,原本调用 RunInstances 接口时放在 UserData 里的业务代码则放在 provisioners 部分执行。
Packer 确实跟普通调用云 API 接口创建机器打包镜像还是有些区别的。
1、Packer 创建打包机时,并不会等 UserData 代码执行完成后再去执行 provisioners 模块,且 Packer 在 Windows 系统上强依赖 WinRM ,而云厂商的 sysprep 公共镜像一般都是没完全放开 WinRM 的,如果没有完整的 Windows 打包镜像的例子作为参考,首次使用 Packer 打包 Windows 镜像极易碰壁。
2、Packer 从1.9.0版本开始, Plugin 跟 Packer 主程序分开了,需要单独安装 Plugin ,否则会报 builder unknown ,而1.9.0之前比如1.8.7版本的 Packer.exe 是自带 Plugin 的。
基本步骤:
1、下载 Packer
https://developer.hashicorp.com/packer/install
2、下载的压缩包(此处以1.14.1版本为例,下载 packer_1.14.1_windows_amd64.zip )解压有个 packer.exe , cmd 命令行进到解压后的目录执行这句命令完成 Packer 环境初始化
packer.exe plugins install github.com/hashicorp/tencentcloud
(这一步是从 GitHub 拉取 Packer Plugin ,国内机器从 GitHub 获取比较慢,耐心等待,如果报错,多尝试几次,不论是 packer init require.pkr.hcl 的方式初始化还是 packer plugins install github.com/hashicorp/tencentcloud 的方式初始化,国内访问 GitHub 都可能遇到这个问题,遇到了多试几次,海外机器一般能一次性成功)

3、客户端(执行 packer.exe 命令的机器)和Packer打包机之间的网络得是通的(就是执行 packer.exe 命令创建出来的用来中转做镜像,做完镜像后自动销毁的机器,如果执行 packer.exe 成功,制作镜像有个过程,这个过程中,你去控制台是能看到创建出来的机器的,不要干预它,不论创建镜像成功、失败,最终一般会自动回收临时创建出的打包机,如果有极特殊没回收成功的情况,提交工单反馈),这是前提,最好指定 config.json 的时候在其中分配公网( "associate_public_ip_address": true ),或者客户端就是 config.json 指定的同 VPC 的其他 CVM (内网互通)
注意:
①成功做过一次镜像后,下次再做得改 image_name 为新值

②把 config.json 里面的参数值换成你自己的,比如 secret_id 、 secret_key 、 region 、 zone 、 instance_type 、 source_image_id 、 disk_size 、 disk_type 、 vpc_id 、 subnet_id 、 winrm_password (跟 winrm_enable_userdata.ps1 中的密码保持一致)、 security_group_id 、 associate_public_ip_address

腾讯云完整的 Windows Packer 配置文件 config.json 内容如下(这里特意加腾讯云,是因为不同的云厂商,配置文件有所不同,主要差异在 user_data_file )
{
"builders": [
{
"type": "tencentcloud-cvm",
"secret_id": "你自己的secret_id",
"secret_key": "你自己的secret_key",
"region": "ap-shanghai",
"zone": "ap-shanghai-5",
"instance_type": "S5.MEDIUM4",
"source_image_id": "img-m07ny34j",
"disk_size": 40,
"disk_type": "CLOUD_PREMIUM",
"vpc_id": "vpc-9yabaw4m",
"subnet_id": "subnet-ih08bvf9",
"communicator": "winrm",
"winrm_port": 5985,
"winrm_username": "Administrator",
"winrm_password": "大写、小写、数字,组成的复杂密码",
"image_name": "test_Packer1",
"security_group_id": "sg-c65mz0li",
"packer_debug": true,
"associate_public_ip_address": true,
"run_tags": {
"good": "luck"
},
"user_data_file": "winrm_enable_userdata.ps1"
}],
"provisioners": [{
"type": "powershell",
"inline": ["mkdir C:\\test -force;wget http://windows-1251783334.cos.ap-shanghai.myqcloud.com/installChrome.ps1 -Outfile c:\\test\\packer.ps1;Start-Process powershell.exe -ArgumentList '-NoProfile -File c:\\test\\packer.ps1' -Wait;"]
}]
}
机型必须指定,但云盘类型参数可以删除(如果指定的话,示例 "disk_type": "CLOUD_PREMIUM" ),删除后会自动选用云盘类型 CLOUD_PREMIUM ,指定的机型如果发不出货时,需要调整 config.json 换别的 instance_type
inline 模块植入一些做镜像前必要的业务逻辑,比如有公网的情况下,联网自动安装 chrome 浏览器(看业务实际需求而定,也可以留空)
winrm_enable_userdata.ps1 的内容如下,注意替换其中的密码跟 config.json 中的密码保持一致,这是成败关键
https://windows-1251783334.cos.ap-shanghai.myqcloud.com/winrm_enable_userdata.ps1

4、以上是准备工作, config.json 和 winrm_enable_userdata.ps1 跟 Packer 主程序 packer.exe 放在一起,执行的时候切到主程序所在目录做 build
packer.exe build config.json
客户端机器尽量使用独立干净网络的云服务器,注意规避安全软件影响packer访问网络,可能会有办公网或安全软件的网络安全措施导致打包超时
比如下图中的报错 “Script exited with non-zero exit status: 16001.”

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。