Как я могу загрузить несколько файлов с резервным резервным файлом?

В настройке Vagrant мне нужно загрузить пару файлов с хоста на гостя на этапе подготовки.

В https://docs.vagrantup.com/v2/provisioning/file.html Я могу посмотреть, как загрузить один файл, от источника до адресата, но как загрузить несколько файлов или структуру папок?

ПРИМЕЧАНИЕ. Я знаю, что могу сделать это с помощью средства обеспечения оболочки, но в этом конкретном случае будет более подходящим набор загрузок файлов.

Ответ 1

Для каждого файла вам понадобится отдельный раздел 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

Загрузка содержимого папки также работает (я только пробовал ее с файлами, а не вложенными папками):

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

Ответ 3

Если кому-то еще нужен быстрый и грязный взломать, чтобы скопировать структуру каталогов с хоста на гостя, вот как я это сделал:

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 за то, что вы вернули мне правильный путь.

Ответ 4

Вы можете использовать средство создания файлов, как указывали другие, но все же стоит отметить, что можно использовать функциональные возможности синхронизированных папок с типом, установленным в rsync: http://docs.vagrantup.com/v2/synced-folders/rsync.html:

Vagrant может использовать rsync в качестве механизма синхронизации папки с гостевой машина. Этот тип синхронизированной папки полезен в первую очередь в ситуациях где другие механизмы синхронизации файлов недоступны, например, когда Общие папки NFS или VirtualBox недоступны в гостевой машина.

Синхронизированная папка rsync выполняет однократную одностороннюю синхронизацию с машиной работающий на машине, запущенной Vagrant.

При первой vagrant up синхронизации происходит до выполнения резервных копий. Пример конфигурации в Vagrantfile будет выглядеть следующим образом:

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

Ответ 5

Это работает для меня, cd для вашего бродяги, а затем запустите

vagrant up
vagrant ssh

[email protected]: 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 и посмотрите, есть ли файл, который вы хотите загрузить.

[email protected]: cd /var/your file directory

Ответ 6

Это немного старый, но я напишу еще один ответ для целых структур каталогов для пользователей Windows, использующих PowerShell.

Сначала создайте Powershell script, который копирует всю структуру папок из общей папки.

#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