我正在尝试使用 packer.io 构建 Windows AMI。
在 powershell 文件中我已运行以下命令作为配置步骤的最后一条命令:
Write-Host "Running the EC2Config.exe file to sysprep the image for UserData to run on next boot."
cmd.exe /c "C:\Program Files\Amazon\Ec2ConfigService\ec2config.exe" -sysprep
在我的打包器输出中,我看到以下文本:
amazon-ebs: Running the EC2Config.exe file to sysprep the image for UserData to run on next boot.
amazon-ebs: Running in foreground...
amazon-ebs: SysprepUtils: Setting bundle/Sysprep operations for Vista/2008.
amazon-ebs: SysprepUtils: Reading Bundle Properties from C:\Program Files\Amazon\Ec2ConfigService\Settings\BundleConfig.xml
amazon-ebs: SysprepUtils: Processing property: AutoSysprep
amazon-ebs: SysprepUtils: Processing property: SetRDPCertificate
amazon-ebs: SysprepUtils: Changing plugin Ec2ConfigureRDP state to Disabled
amazon-ebs: SysprepUtils: Changing plugin Ec2OutputRDPCert state to Enabled
amazon-ebs: SysprepUtils: Processing property: SetPasswordAfterSysprep
amazon-ebs: SysprepUtils: Changing plugin Ec2SetPassword state to Enabled
amazon-ebs: SysprepUtils: Changing plugin Ec2WindowsActivate state to Enabled
amazon-ebs: SysprepUtils: Changing plugin Ec2HandleUserData state to Enabled
amazon-ebs: SysprepUtils: Changing plugin Ec2DynamicBootVolumeSize state to Enabled
amazon-ebs: SysprepUtils: Sysprep command: 'C:\windows\system32\sysprep\sysprep.exe'
amazon-ebs: SysprepUtils: Sysprep args: '"/unattend:C:\Program Files\Amazon\Ec2ConfigService\sysprep2008.xml" /oobe /shutdown /generalize'
==> amazon-ebs: Terminating the source AWS instance...
==> amazon-ebs: No AMIs to cleanup
==> amazon-ebs: Deleting temporary keypair...
Build 'amazon-ebs' errored: Script exited with non-zero exit status: 1. Allowed exit codes are: [0]
所以...
它运行成功,然后运行 sysprep,但 sysprep 导致打包程序发现它未成功运行。我尝试使用 运行打包程序-force
,但这似乎不允许我成功构建映像。
我有点不知所措——我不确定最简单的方法是尝试强制打包程序查看正在构建的图像,还是尝试在我的 powershell 脚本末尾为打包程序添加另一个步骤,尝试强制该结果具有良好的错误代码并继续前进。
答案1
在搜索我自己的问题“Packer 关闭构建实例之前进行系统准备”的答案时发现了这个问题,它给了我解决问题的正确线索。
事实证明,Packer 的 PowerShell 配置程序有一个名为的可选参数valid_exit_codes
。由于您看到的退出代码为 1,请将 valid_exit_codes 设置为“0,1”。在您的 Packer windows.json 中:
"valid_exit_codes": "0,1"
我不知道这有多新;我正在使用 Packer 0.12.2。
我的结果
有趣的是,我的ec2config.exe -sysprep
运行退出为 0:
amazon-ebs: SysprepUtils: Sysprep args: '"/unattend:C:\Program Files\Amazon\Ec2ConfigService\sysprep2008.xml" /oobe /shutdown /generalize'
2017/01/23 20:18:33 packer: 2017/01/23 20:18:33 [INFO] command 'powershell -executionpolicy bypass -encodedCommand aQBmACAAKAB ..deleted.. GUAcwB0AC0A=' exited with code: 0
另一个可能的选择
您可能还想考虑尝试另外一件事(由于时间限制,我还没有尝试):
/shutdown
从 sysprep 参数中删除该标志。您可以在 中找到它C:\Program Files\Amazon\Ec2ConfigService\Settings\BundleConfig.xml
。只需使用 PowerShell 脚本进行查找和替换即可。
希望这可以帮助!
答案2
如果目标机器启动了关机,我们在最新的 Packer 二进制文件 (0.10.1) 上看到了类似错误终止的实例。
您应该能够仅使用参数/generalize /oobe /quiet
,然后 Packer 将在生成 AMI 之前处理关闭。