我决定通过组装 FreeBSD Vagrant 盒子来学习 Packer。整个设置都在 GitHub 上。在后处理阶段之前,一切都运行良好。实际上,该阶段同样声称可以无错误地完成,但是当我尝试启动 Vagrant 框时,虚拟机没有任何 Puppet 应该完成的效果。
具体来说,如果我packer build freebsd.json
运行回购我最终得到一个 ovf 和 vmdk 文件,可以将其导入 VirtualBox 并获得一个vagrant
具有用户的实例和下面描述的 .ssh 设置。
但我也得到了一个packer_virtualbox-iso_virtualbox.box
文件,如果我这样做
vagrant init packer_virtualbox-iso_virtualbox.box
vagrant up
我得到一个实例,它启动并安装了 pkg 和 puppet,但没有vagrant
用户或其主目录。以下是精简版的打包程序 json文件:
{
"builders": [SNIP],
"provisioners": [{
"type": "shell",
"script": "install-puppet",
"execute_command": "chmod +x {{ .Path }}; env {{ .Vars }} {{ .Path }}"
}, {
"type": "puppet-masterless",
"manifest_file": "site.pp",
"execute_command": "cd {{.WorkingDir}} && env {{.FacterVars}} puppet apply --verbose --modulepath='{{.ModulePath}}' {{if ne .HieraConfigPath \"\"}}--hiera_config='{{.HieraConfigPath}}' {{end}} {{if ne .ManifestDir \"\"}}--manifestdir='{{.ManifestDir}}' {{end}} --detailed-exitcodes {{.ManifestFile}}"
}],
"post-processors": [{
"type": "compress",
"compression_level": 9,
"keep_input_artifact": true,
"output": "archive.tar.bz2"
}, {
"type": "vagrant",
"compression_level": 9,
"keep_input_artifact": true
}]
}
就好像 Vagrant 盒子以某种方式回滚到第一个配置程序已运行但第二个配置程序尚未运行的点。如何解释这一点?
更新
我尝试通过导出在调试模式下运行打包程序PACKER_LOG=debug
,并在输出中注意到与 Puppet 部分相关的内容:
2015/12/16 20:48:12 packer-builder-virtualbox-iso: 2015/12/16 20:48:12 remote command exited with '2': cd /tmp/packer-puppet-masterless && env FACTER_packer_build_name='virtualbox-iso' FACTER_packer_builder_type='virtualbox-iso' puppet apply --verbose --modulepath='' --detailed-exitcodes /tmp/packer-puppet-masterless/manifests/site.pp
2015/12/16 20:48:12 packer-builder-virtualbox-iso: 2015/12/16 20:48:12 [INFO] RPC endpoint: Communicator ended with: 2
2015/12/16 20:48:12 [INFO] 539 bytes written for 'stdout'
2015/12/16 20:48:12 [INFO] 0 bytes written for 'stderr'
2015/12/16 20:48:12 [INFO] RPC client: Communicator ended with: 2
2015/12/16 20:48:12 [INFO] RPC endpoint: Communicator ended with: 2
2015/12/16 20:48:12 packer-provisioner-puppet-masterless: 2015/12/16 20:48:12 [INFO] 0 bytes written for 'stderr'
2015/12/16 20:48:12 packer-provisioner-puppet-masterless: 2015/12/16 20:48:12 [INFO] 539 bytes written for 'stdout'
2015/12/16 20:48:12 packer-provisioner-puppet-masterless: 2015/12/16 20:48:12 [INFO] RPC client: Communicator ended with: 2
我不知道这是否是主要原因,但我尝试以execute_command
结尾的另一次运行true
。它改变了日志输出,(不再有“Communicator ending with: 2”)但没有改变结果。
答案1
好吧,我找到了答案。这与 Packer 或 Puppet 关系不大。事实证明,Vagrant 会将盒子缓存在某个地方。在我第一次安装后,Vagrant 总是使用相同的旧盒子,并忽略来自较新的包装器版本的任何更新。为了解决这个问题(直到我弄清楚如何对包装器构建的 vagrant 盒子进行版本控制),我每次都可以使用以下命令销毁盒子
vagrant box remove packer_virtualbox-iso_virtualbox.box