使用包装工具中的.box中包含的文件进行流动供应

时间:2015-02-24 19:07:42

标签: vagrant packer

我正在使用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将这些文件复制到实例目录的步骤吗?或者我在我的流浪模板中错误地引用它们?

2 个答案:

答案 0 :(得分:2)

脚本将相对于Vagrantfile,因此在主机上。查看此处的path部分:http://docs.vagrantup.com/v2/provisioning/shell.html

它明确指出:

  

相对路径(如上)相对于项目的根Vagrantfile的位置进行了扩展。

我认为vagrant initvagrant 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