Я решил изучить Packer, собрав FreeBSD Vagrant box. Вся установка находится на GitHub . Все работает до стадии постобработки. На самом деле, этот этап также утверждает, что завершился без ошибок, но когда я пытаюсь запустить Vagrant box, виртуальная машина не имеет никаких эффектов, которые должны были быть выполнены 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 и марионетку, но не имеет пользователя 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
. Это изменило вывод журнала (больше нет «Коммуникатор завершился на: 2»), но не изменил результат.
Welp, я нашел ответ. Он не имеет большого отношения к Packer или Puppet. Оказывается, бродяга где-то кэширует коробки. После моей первой установки, Vagrant всегда использовал одну и ту же старую коробку, и игнорировал любые обновления от новых сборок упаковщиков. Чтобы исправить это (пока я не выясню, как вернуть бродячие коробки, собранные упаковщиком), я могу каждый раз уничтожать коробку с помощью
vagrant box remove packer_virtualbox-iso_virtualbox.box