Предоставление бродяг с использованием файлов, включенных в .box из упаковщика

Я создаю бродячий файл .box с помощью упаковщика. У меня в конфигурации упаковщика .json есть что-то вроде этого:

"post-processors": [
//SNIP
  "include": [
    "./choco.ps1",
    "./vagrantUp.ps1",
    ]
]

Он создает .box, и если я вручную распакую файл, я вижу, что они включены в него. Когда я заканчиваю запускать "vagrant box add Mybox http://whatever", я даже могу видеть их в моем ~ / .vagrant.d / boxs / 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

Мне кажется, что VagrantFile в / Vagrant / MyBox ссылается на VagrantFile в ~ / .vagrant.d /, что хорошо, это то, что я хочу. Но тогда он по-прежнему использует пути относительно / Vagrant / MyBox, когда файлы на самом деле относятся к ~ / .vagrant.d /

Мне не хватает шага, который говорит vagrant скопировать эти файлы в каталог экземпляра? Или я неправильно ссылаюсь на них в своем бродячем шаблоне?


person Jake Stevenson    schedule 24.02.2015    source источник


Ответы (2)


Скрипты будут расположены относительно Vagrantfile, то есть на хост-машине. Посмотрите раздел path здесь: http://docs.vagrantup.com/v2/provisioning/shell.html

В нем четко сказано:

Относительные пути, такие как выше, расширяются относительно местоположения корневого файла Vagrant для вашего проекта.

Я думаю, что в vagrant init или vagrant init нет функций, которые могли бы извлечь сценарии и скопировать их в локальную папку, где находится Vagrantfile. Я понятия не имею, почему у них есть эта функция в постпроцессоре Packer Vagrant под include:

Пути к файлам для включения в поле Vagrant. Каждый из этих файлов будет скопирован в каталог верхнего уровня ящика Vagrant (независимо от их путей). Затем их можно использовать из Vagrantfile.

person meilke    schedule 25.02.2015
comment
В порядке. Я создаю папку ~ / Vagrant / DevBox и записываю в нее компакт-диск. Затем я бродягу инициализирую MyBox там. Все, что у меня есть в этой папке, - это VagrantFile, который ссылается на MyBox в голове. Сценарии, которые были упакованы, оказались рядом с vmdk в ~ / .vagrant.d / box / MyBox / 0 / virtualbox, когда я сделал бродягу add MyBox что угодно. И VagrantFile в ЗДЕСЬ ссылается на скрипты. - person Jake Stevenson; 25.02.2015
comment
Я немного отредактировал вопрос, чтобы попытаться внести ясность. - person Jake Stevenson; 25.02.2015
comment
Я немного скорректировал свой ответ. - person meilke; 25.02.2015
comment
Итак, какие у меня есть варианты? Использовать суть для хранения моих скриптов? Или заставить мою команду не только ввести бродячий ящик, но ТАКЖЕ клонировать репозиторий git, в котором есть все скрипты и бродячий файл? - person Jake Stevenson; 25.02.2015
comment
Вот что мы делаем в моей команде: Vagrantfile и скрипты хранятся в том же репозитории, что и наш реальный продукт. - person meilke; 25.02.2015
comment
После бесконечных поисков способа использовать параметр include постпроцессора Packer Vagrant, я наконец понял, что вы можете использовать File.dirname(__FILE__) для получения пути к извлеченному ящику. См. stackoverflow.com/a/31977866/1856831 ниже. - person Kelsey Francis; 13.08.2015

В Vagrantfile внутри поля вы можете ссылаться на другие файлы внутри поля, используя __FILE__ для получения пути к этому полю Vagrantfile, а затем использовать path вместо inline с _ 6_ Provisioner, чтобы сценарий загружался на виртуальную машину и затем выполнялся:

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
person Kelsey Francis    schedule 13.08.2015
comment
или вы можете использовать __dir__ следующим образом: config.vm.provision shell, путь: File.join (__ dir__, vagrantUp.ps1) - person Tom Ferguson; 10.11.2020