我正在使用packer构建一个vagrant .box文件。我的包装工具中有这样的东西.json配置:
"post-processors": [
//SNIP
"include": [
"./choco.ps1",
"./vagrantUp.ps1",
]
]
它正在构建.box,如果我手动解压缩文件,我可以看到它们包含在那里。当我最终运行" vagrant box添加Mybox http://whatever"我甚至可以在〜/ .vagrant.d / boxes / MyBox / 0 / virtualbox文件夹中看到它们。
~ $ ls ~/.vagrant.d/boxes/MyBox/0/virtualbox/
Vagrantfile metadata.json
box.ovf packer-virtualbox-iso-1424829938-disk1.vmdk
choco.ps1 vagrantUp.ps1
另外,在我的打包器流浪汉模板中,我有一行:
config.vm.provision "shell", path: "vagrantUp.ps1"
接下来,我想初始化这台机器。我做了以下事情:
~ $ cd ~/Vagrant
Vagrant $ Vagrant mkdir MyBox; cd MyBox
MyBox $ vagrant init MyBox
MyBox $ ls
VagrantFile
此文件看起来像基本的流浪者默认值,但在顶部提到config.vm.box = "MyBox"
。
但是如果我vagrant up
,我会收到以下错误:
* `path` for shell provisioner does not exist on the host system: /Users/me/Vagrant/MyBox/vagrantUp.ps1
在我看来,/ Vagrant / MyBox中的VagrantFile正在引用〜/ .vagrant.d /中的VagrantFile,这很好,这就是我想要的。但是当文件实际上相对于〜/ .vagrant.d /
时,它仍然使用相对于/ Vagrant / MyBox的路径我错过了一个告诉vagrant将这些文件复制到实例目录的步骤吗?或者我在我的流浪模板中错误地引用它们?
答案 0 :(得分:2)
脚本将相对于Vagrantfile
,因此在主机上。查看此处的path
部分:http://docs.vagrantup.com/v2/provisioning/shell.html
它明确指出:
相对路径(如上)相对于项目的根Vagrantfile的位置进行了扩展。
我认为vagrant init
或vagrant init
中没有可以提取脚本并将其复制到Vagrantfile
所在的本地文件夹的功能。我不知道他们为什么在include
下的Packer Vagrant后处理器中拥有此功能:
要包含在Vagrant框中的文件的路径。这些文件将被复制到Vagrant框的顶级目录中(无论它们的路径如何)。然后可以从Vagrantfile中使用它们。
答案 1 :(得分:2)
在框中的Vagrantfile
中,您可以使用__FILE__
引用框中的其他文件到该框Vagrantfile
的获取路径,然后使用path
使用not grab extra whitespaces而不是inline
,以便脚本上传到VM然后执行:
Vagrant.configure("2") do |config|
# ... other configuration
box_root = File.expand_path(File.dirname(__FILE__))
config.vm.provision "shell",
path: File.join(box_root, "vagrantUp.ps1")
end