如何使用vagrant文​​件配置上传多个文件?

时间:2014-08-26 22:59:03

标签: vagrant virtualbox vagrantfile

在Vagrant设置中,我必须在配置阶段将几个文件从主机上传到访客。

https://docs.vagrantup.com/v2/provisioning/file.html我可以看到如何从源上传到目的地,但是如何上传多个文件或文件夹结构?

注意:我知道我可以使用shell配置程序执行此操作,但在这种特殊情况下,一组文件上载更合适。

6 个答案:

答案 0 :(得分:11)

文件夹内容上传似乎也有效(我只尝试使用文件,而不是嵌套文件夹):

config.vm.provision :file, source: '../folder', destination: "/tmp/folder"

答案 1 :(得分:8)

每个文件都需要单独的config.vim.provision部分。您可以将这些部分中的多个部分添加到Vagrantfile,如下所示:

config.vm.provision :file do |file|
  file.source = "/etc/file1.txt"
  file.destination = "/tmp/1.txt"
end

config.vm.provision :file do |file|
  file.source = "/etc/file2.txt"
  file.destination = "/tmp/2.txt"
end

输出:

[default] Running provisioner: file...
[default] Running provisioner: file...

您看到它正在执行两个配置操作。您可以验证虚拟机中的文件存在:

vagrant ssh -- ls -al /tmp/{1,2}.txt
-rw-r--r-- 1 vagrant vagrant 4 Aug 27 08:22 /tmp/1.txt
-rw-rw-r-- 1 vagrant vagrant 4 Aug 27 08:22 /tmp/2.txt

答案 2 :(得分:4)

如果其他人只需要快速而肮脏的黑客将目录结构从主机复制到访客,这就是我最终做到的方式:

require 'pathname' # at the beginning of the Vagrantfile

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  # more configuration here

  r = Pathname.new 'root'
  Dir.glob(File.join("root", File.join("**","*"))) do |f|
    if !File.directory?(f) then
      s = Pathname.new f
      t = s.relative_path_from r
      config.vm.provision "file" do |fp|
        fp.source = s.to_s
        fp.destination = "/tmp/root/" + t.to_s
      end
    end
  end

  # more configuration here

end

感谢@hek2mgl让我登录the right track

答案 3 :(得分:1)

这适用于我,cd到你的流浪汉然后运行

vagrant up
vagrant ssh

vagrant@yourvagrant: sudo chown -R testuser:testuser /var/www/ or whatever folder you want to upload your files

并在你的Vagrantfile中添加

# we create add script to upload folder to a vagrant guest from local file
config.vm.provision :file, source: '/wamp/www/ian_loans', destination:  "/var/www/solidbond"

只需将文件目录替换为您的需求。退出和 并且不要忘记在你的流浪目录中运行

vagrant provision

最后转到您的Ubuntu目录,查看您要上传的文件是否存在。

vagrant@yourvagrant: cd /var/your file directory

答案 4 :(得分:1)

您可以像其他人提到的那样使用文件配置程序,但仍然值得注意的是,可以使用类型设置为rsync的同步文件夹功能:http://docs.vagrantup.com/v2/synced-folders/rsync.html

  

Vagrant可以使用rsync作为将文件夹同步到来宾的机制   机。此同步文件夹类型主要用于情况   其他同步文件夹机制不可用的地方,例如何时   guest虚拟机中不提供NFS或VirtualBox共享文件夹   机。

     

rsync同步文件夹从计算机执行一次性单向同步   跑到Vagrant正在启动的机器上。

在执行配置程序之前,第一次vagrant up同步发生。 Vagrantfile中的示例配置如下所示:

config.vm.synced_folder "upload/", "/home/vagrant", type: "rsync"

答案 5 :(得分:0)

这有点旧,但我会在这里为使用PowerShell的Windows用户的整个目录结构抛出另一个答案。

首先,创建一个Powershell脚本,从共享文件夹复制整个文件夹结构。

#Check if the directory you're copying already exists on the VM
$foldercheck = "path\to\folder\on\vm"
if (test-path $foldercheck)
{
    Write-Host "Folder 'path\to\folder\on\vm' already exists..."
}
else {
    #Create the new directory
    New-Item -ItemType Directory -Force -Path "path\to\folder\on\vm"

    #Copy over contents to the directory
    Copy-Item "\\VBOXSRV\<share_name>\path\to\folder\to\copy\*" -Destination "path\to\folder\on\vm" -recurse
}

然后,配置您的Vagrantfile以自动挂载共享文件夹,复制PowerShell脚本,然后按指定的顺序运行它们。

Vagrant.configure(2) do |config|
    config.vm.provider "virtualbox" do |vb|
        # Other settings
        # ...
        # Add shared folders
        vb.customize ["sharedfolder", "add", :id, "--name", "<share_name>", "--hostpath", "path/to/host/folder/location", "--automount"]
    end
    # =================================================================
    # PROVISIONING
    # =================================================================
    # Load up the files to the Guest environment for use by PowerShell
    config.vm.provision "file", source: "path/to/provisioning/files/powershellfile.ps1", destination: "path/to/temporary/location/powershellfile.ps1"
    # Rinse/repeat for additional provisioning files

    # Now provision files in the order they are specified
    config.vm.provision "shell", inline: "path/to/temporary/location/powershellfile.ps1"
    # Rinse/repeat to run PowerShell scripts
end