Как я могу загрузить более одного файла с помощью Vagrant file provisioning?
в настройке Vagrant мне нужно загрузить пару файлов с хоста гостю на этапе подготовки.
в https://docs.vagrantup.com/v2/provisioning/file.html я вижу, как загрузить один файл из источника в пункт назначения, но как я могу загрузить несколько файлов или структуру папок?
примечание: Я знаю, что могу сделать это с помощью Shell provisioner, но в этом конкретном случае набор загрузок файлов будет больше соответствующий.
6 ответов
вам понадобится отдельный для каждого файла. Вы можете добавить несколько из этих разделов в свою 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
загрузка содержимого папки, похоже, также работает (я пробовал только с файлами, а не вложенными папками):
config.vm.provision :file, source: '../folder', destination: "/tmp/folder"
если кому-то еще просто нужен быстрый и грязный хак, чтобы скопировать структуру каталогов с хоста на гостя, вот как я это сделал:
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 для меня правильный путь.
вы можете использовать file provisioner, как упоминалось другими, но все же стоит отметить, что можно использовать функциональность синхронизированной папки с типом, установленным в rsync:http://docs.vagrantup.com/v2/synced-folders/rsync.html:
Vagrant может использовать rsync в качестве механизма для синхронизации папки с гостем машина. Этот синхронизированный тип папок полезен в основном в ситуациях где другие механизмы синхронизированных папок недоступны, например когда NFS или VirtualBox общие папки недоступны в гостевой машина.
синхронизированная папка rsync выполняет одноразовую одностороннюю синхронизацию с компьютера Бег к машине, которую запустил Бродяга.
первый vagrant up
синхронизация происходит до выполнения поставщиков. Пример конфигурации в Vagrantfile будет выглядеть следующим образом:
config.vm.synced_folder "upload/", "/home/vagrant", type: "rsync"
это работает для меня, 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
vagrant provision
наконец, перейдите в каталог Ubuntu и посмотрите, есть ли файл, который вы хотите загрузить.
vagrant@yourvagrant: cd /var/your file directory
Это немного старый, но я брошу здесь другой ответ для всех структур каталогов для пользователей Windows, использующих PowerShell.
сначала создайте сценарий 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 для автоматического монтирования папки shared, скопируйте сценарии 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