我正在使用 Packer 为 Ubuntu 14.04 构建 VirtualBox 映像。我有一个 Packer 脚本这里,以前可以正常工作,但后来由于某种原因(以及后来的几次 VirtualBox 更新)开始失败。安装一直卡在“选择并安装软件”步骤:
如果我使用该选项运行脚本-debug
,我不会从 Packer 本身获得任何有用的信息:
~/Projects/src/github.com/yunojuno/trifecta/packer(master)$ SSH_USERNAME=vagrant SSH_PASSWORD=vagrant packer build -debug template.json
Debug mode enabled. Builds will not be parallelized.
virtualbox-iso output will be in this color.
==> virtualbox-iso: Downloading or copying Guest additions
virtualbox-iso: Downloading or copying: file:///Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso
==> virtualbox-iso: Pausing after run of step 'StepDownloadGuestAdditions'. Press enter to continue.
==> virtualbox-iso: Downloading or copying ISO
virtualbox-iso: Downloading or copying: http://releases.ubuntu.com/14.04/ubuntu-14.04.3-server-amd64.iso
==> virtualbox-iso: Pausing after run of step 'StepDownload'. Press enter to continue.
==> virtualbox-iso: Pausing after run of step 'StepOutputDir'. Press enter to continue.
==> virtualbox-iso: Pausing after run of step 'StepCreateFloppy'. Press enter to continue.
==> virtualbox-iso: Starting HTTP server on port 8532
==> virtualbox-iso: Pausing after run of step 'StepHTTPServer'. Press enter to continue.
==> virtualbox-iso: Pausing after run of step 'StepSuppressMessages'. Press enter to continue.
==> virtualbox-iso: Creating virtual machine...
==> virtualbox-iso: Pausing after run of step 'stepCreateVM'. Press enter to continue.
==> virtualbox-iso: Creating hard drive...
==> virtualbox-iso: Pausing after run of step 'stepCreateDisk'. Press enter to continue.
==> virtualbox-iso: Pausing after run of step 'stepAttachISO'. Press enter to continue.
==> virtualbox-iso: Pausing after run of step 'StepAttachGuestAdditions'. Press enter to continue.
==> virtualbox-iso: Pausing after run of step 'StepAttachFloppy'. Press enter to continue.
==> virtualbox-iso: Creating forwarded port mapping for SSH (host port 4141)
==> virtualbox-iso: Pausing after run of step 'StepForwardSSH'. Press enter to continue.
==> virtualbox-iso: Executing custom VBoxManage commands...
virtualbox-iso: Executing: modifyvm ubuntu1404 --memory 4096
virtualbox-iso: Executing: modifyvm ubuntu1404 --cpus 1
==> virtualbox-iso: Pausing after run of step 'StepVBoxManage'. Press enter to continue.
==> virtualbox-iso: Starting the virtual machine...
==> virtualbox-iso: Waiting 10s for boot...
==> virtualbox-iso: Pausing after run of step 'StepRun'. Press enter to continue.
==> virtualbox-iso: Typing the boot command...
==> virtualbox-iso: Pausing after run of step 'StepTypeBootCommand'. Press enter to continue.
==> virtualbox-iso: Waiting for SSH to become available...
脚本就在那时挂起了 - 因为无人值守安装失败了(见上面的截图)。
启动命令是:
"boot_command": [
"<esc><esc><enter><wait>",
"/install/vmlinuz ",
"noapic ",
"preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg auto ",
"locale=en_US ",
"kbd-chooser/method=us ",
"keyboard-configuration/modelcode=pc105 ",
"keyboard-configuration/layout=US ",
"keyboard-configuration/variant=US ",
"hostname={{ .Name }} ",
"fb=false ",
"debconf/frontend=noninteractive ",
"console-setup/ask_detect=false ",
"initrd=/install/initrd.gz -- ",
"<enter>"
],
我对 Linux 安装了解不够,无法调试这个问题 —— 我怎么知道真正失败了什么,并修复它?
答案1
目前,我尚不清楚该 Github repo 中的打包模板和预置是否存在导致此问题的原因。
我可以构建该模板并安装可运行的 Linux。
您应该查看的是预先设置的pkgsel
行,因为当您要求安装程序安装不存在的包(在配置的存储库中)时,您不在交互式安装模式中,所以它会以您看到的方式出错。
预置功能非常强大,基本上可以对安装进行任何操作。调试起来可能相当不透明,但使用 Packer,provisioner
安装完成后我们也可以进入调试状态。
在这种情况下,它是 shell 脚本,https://github.com/yunojuno/trifecta/blob/master/packer/template.json#L61-L66
我建议保持预置的超级基础并在您的供应商中进行定制,创建一个新的 shell 脚本来添加新包,执行您想要融入图像的其他定制 - 甚至删除预置安装的东西。
一旦处于配置阶段,您就可以使用-debug
Packer 中的开关以更切实的方式进入调试 - 因为配置器是通过正在安装的虚拟机上的 ssh 连接运行的 shell 脚本,如果您遇到问题,您还可以连接到该 ssh 或通过 Virtualbox GUI 并在清理之前调试正在运行的机器。
Bento 项目有出色的 Packer 模板,您可能想将其用作参考 -https://github.com/chef/bento/blob/master/ubuntu-14.04-amd64.json和https://github.com/chef/bento/blob/master/http/ubuntu-14.04/preseed.cfg- 它们由 Chef 创建和维护,但 Chef 实际上并未安装,它们基本上是一个原始的 Vagrant 盒子。
基本上 - 目前,您预先植入的包名称之一是假的。
我希望这有帮助!
编辑:
我认为定义一些术语可能会有所帮助:
打包机HashiCorp 软件可自动构建图像。基本工作流程是Builder
-> Provisioner
->Post Process
建造者:针对不同的虚拟化平台,例如 Virtualbox、Vmware、AWS EC2、Digital Ocean 等。每个平台都有不同的图像格式,因此我们需要为每个平台制作一个图像。
构建者通常利用正在安装的操作系统的无人值守自动化工具来提供一致的基础配置例如 Debian/Ubuntu 预安装、RHEL/Centos Kickstart 等等。提供者:Shell、Ansible、Chef、Salt、Puppet 等。它们在所有已安装的基本映像上运行,用于配置、安装软件等。
后处理器:Vagrant、Atlas、Amazon 等。为部署目标准备好你的图像。
(Packer 中还有几个可选的工作流程步骤,但这些是基础。)
答案2
除了 @rjocoleman 的出色回答之外,还有一种方法可以从正在运行的安装程序访问 /var/log/syslog。您可以使用主菜单中的“保存调试日志”提取它。这有助于Builder
在绝对必要时调试工作流程的一部分。