16

В моем Vagrantfile я могу указать URL-адрес окна:

config.vm.box_url = "http://example.com/my-box.pkg"

Согласно более поздней документации, я смогу создать файл JSON, содержащий URL-адреса для разных версий коробки. В документации также сказано, что я могу использовать URL этого JSON-файла при запуске vagrant box add . Я надеялся использовать URL-адрес этого файла JSON для config.vm.box_url . Тем не менее, это не похоже на работу. Когда я пытаюсь это сделать, он воспринимает это как файл коробки:

Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'my-box' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Adding box 'my-box' (v0) for provider: virtualbox
    default: Downloading: http://example.com/my-box.pkg.json
    default: Progress: 100% (Rate: 876k/s, Estimated time remaining: 0:00:01)
The box failed to unpackage properly. Please verify that the box
file you're trying to add is not corrupted and try again. The
output from attempting to unpackage (if any):

bsdtar.EXE: Unrecognized archive format: Illegal byte sequence
bsdtar.EXE: Error exit delayed from previous errors.

Можно ли сказать Vagrant использовать JSON-файл метаданных блока в моем Vagrantfile? Я бы предпочел не использовать Vagrant Cloud.

5 ответов5

19

После прочтения вашего вопроса, кажется, вы пытаетесь сделать что-то немного отличное от меня, но я думаю, что наша конечная цель та же.

Я не хочу использовать службу Vagrant Cloud для размещения своих базовых блоков, но я хочу иметь возможность распространять среду разработки для моей команды разработчиков и использовать функции файла metadata.json для поддержки системы управления версиями для Среда разработки, которая затем будет доступна моей команде разработчиков, просто используя средства, встроенные в vagrant.

На момент написания этой статьи (5/5/2014) бродячая документация действительно редка, предположительно потому, что это относительно новая функция, но я уверен, что тот факт, что VagrantCloud имеет платный уровень, также имеет к этому отношение ,

Чтобы понять, как использовать файл metadata.json для версии и распространения блоков, я взглянул на некоторые виртуальные машины, доступные в VagrantCloud. Посмотрев их и прочитав часть бродячего кода, стало довольно легко понять, как достичь моей цели.

  • Упакуйте свою коробку, как обычно. В моем случае я упаковываю только для виртуальной коробки, потому что это то, что наши разработчики будут использовать для запуска Vm. Я также упаковываю Vagrantfile с моей базовой коробкой, которая обеспечивает некоторую подготовку для среды разработки (настройка общих ресурсов для соответствующих папок, некоторые основные настройки Apache, ведение журнала ошибок и т.д.)
  • Создайте файл metadata.json для описания вашего базового блока, мой выглядит примерно так:

    {
        "description": "long box description",
        "short_description": "short box description",
        "name": "company/developer-environment",
        "versions": [{
            "version": "1",
            "status": "active",
            "description_html": "<p>Dev Environment</p>",
            "description_markdown": "Dev Environment",
            "providers": [{
                "name": "virtualbox",
                "url": "http:\/\/vagrant.domain.local/dev/company-developer-environment-1.box"
            }]
        }]
    }
    

Создав файл metadata.json , я загрузил его на локальный сервер, работающий в нашей внутренней сети (vagrant.domain.local/metadata.json). Как только я это сделал, все, что осталось, это проверить его с помощью vagrant:

# add the box to vagrant using the definition from metadata.json
# (the box is actually downloaded here, so it can take a minute...or 10)
$ vagrant box add http://vagrant.domain.local/dev/metadata.json

# init the box (this creates a .vagrant folder and a Vagrantfile in the cwd with the appropriate box name)
$ vagrant init company/developer-environment

# boot the box
$ vagrant up

Вуаля, удаленный хостинг, общий и версионный приватный ящик, который не требует использования Vagrant Cloud.

Создавая новые версии своего ящика, вы упакуете его и отредактируете файл metadata.json . Из того, что я могу сказать, вы можете использовать любую схему управления версиями, которую хотите, будь то семантическое управление версиями (1.0.0, 1.0.1 и т.д.) Или просто целые числа для версий (1, 2, 3 и т.д.). Когда пользователи вашего ящика vagrant up vagrant автоматически проверяют ваш файл metadata.json на наличие новой версии, и им предлагается выполнить vagrant box update для обновления ящика.

Вы также можете пропустить vagrant box add <metadata.json url> и vagrant init bit, определив базовый Vagrantfile с именем и URL-адресом блока, например так:

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "company/developer-environment"
  config.vm.box_url = "https://vagrant.domain.local/dev/metadata.json"
end

Вы можете распространять Vagrantfile с этим содержимым, и все пользователи будут просто быть в состоянии vagrant up Хотя я не уверен, как это работает, когда обновляются версии.

9

Vagrant требует, чтобы URL-адреса метаданных бокса передавались с типом контента application/json . Полученная ошибка указывает на то, что vagrant интерпретировал ваш URL как обычное поле.

Убедитесь, что ваш HTTP-сервер правильно устанавливает заголовок Content-Type . Большинство HTTP-серверов автоматически устанавливают заголовок Content-Type на application/json если ваш файл имеет расширение .json

7

На сегодняшний день (2016-07-12, vagrant 1.8.4), если вы хотите запустить свой собственный каталог вручную (то есть вручную обновить поля и отредактировать файл metadata.json), но при этом вести себя как следует Как и в реальном каталоге, имейте в виду следующее:

  • Нет необходимости называть файл «metadata.json». Он может быть назван как угодно, если он содержит ожидаемые значения. Я использую "metadata.json" здесь, чтобы прояснить шаги ниже.

  • каждый файл metadata.json может содержать только одно поле. Он может иметь несколько версий, и каждая версия может иметь несколько провайдеров (virtualbox, vmware, libvirt). Если вам нужно иметь более одного окна (скажем, "fedora" и "ubuntu"), вам нужны два разных файла метаданных.

  • Вагрант ожидает, что файл metadata.json будет иметь тип «application /json» (как упоминал Николас Хиндс выше). Если ваш веб-сервер не возвращает его (или возвращает «text /plain»), vagrant примет это за фактический файл коробки и попытается его проанализировать (и потерпит неудачу).

  • Исключением является Атлас Hashicorp (который раньше был Vagrant Cloud), поскольку перенаправления ведут вас к контенту, который используется как «text /html». Мое лучшее предположение для этого - это как-то связано с перенаправлениями (подробнее об этом ниже).

  • Файл блока не обязательно должен находиться в том же месте, что и файл метаданных. Вы можете разместить файл метаданных на локальном веб-сервере, а в Amazon S3 - нет проблем.

Итак, насколько я понял, я нашел самый простой способ заставить это работать на веб-сервере, и у меня все еще есть довольно нормальная функциональность - сделать это:

На вашем веб-хосте создайте структуру файлов и каталогов, подобную этой:

d wwwroot/
d wwwroot/boxes
d wwwroot/boxes/yourname
f wwwroot/boxes/yourname/.htaccess
d wwwroot/boxes/yourname/box1
f wwwroot/boxes/yourname/box1/metadata.json
f wwwroot/boxes/yourname/box1/box1-$version1-$provider.box
f wwwroot/boxes/yourname/box1/box1-$version2-$provider.box
f wwwroot/boxes/yourname/box1/box1-$version2-$otherprovider.box
d wwwroot/boxes/yourname/box2
f wwwroot/boxes/yourname/box2/metadata.json
f wwwroot/boxes/yourname/box2/box2-$version1-$provider.box
(... etc)

(этот макет означает, что ваш «metadata.json» для box1 должен иметь URL-адреса, указывающие на что-то вроде « http://yourhost/boxes/yourname/box1/box1- $ version1- $ provider.box»)

На вашем .htaccess, убедитесь, что "metadata.json" установлен для индекса каталога. Остальное необязательно, для отрицательного кэша и скрытия фактического содержимого:

Header unset Pragma
FileETag None
Header unset ETag
DirectoryIndex metadata.json
IndexIgnore *
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate, private"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"

В вашей среде экспортируйте VAGRANT_SERVER_URL, указывающий на ваш веб-хостинг. Обратите внимание, нет косой черты!

export VAGRANT_SERVER_URL="http://yourhost/boxes"

Имея это в наличии (и все файлы с правильным содержимым), вы можете пойти и добавить свой ящик напрямую:

vagrant box add yourname/box1

Так как «metadata.json» является индексным файлом для каталога box1, он должен перенаправить содержимое прямо на него, vagrant подберет его, интерпретирует метаданные и загрузит соответствующий блок.

4

Я думаю, что вы перепутали их директивы ..

Следующее взято с веб-сайта бродяги:


ФАЙЛ КОРОБКИ

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

Box files are compressed using tar, tar.gz, or zip. The contents of the archive can be anything, and is specific to each provider. Ядро Vagrant распаковывает коробки только для последующего использования.

Within the archive, Vagrant does expect a single file: "metadata.json". Это файл JSON, который совершенно не связан с вышеуказанным компонентом "метаданных блока". This file must contain at least the "provider" key with the provider the box is for . Например, если ваш ящик предназначен для VirtualBox, metadata.json будет выглядеть так:

{
  "provider": "virtualbox"
}

If there is no metadata.json file or the file does not contain valid JSON with at least a "provider" key, then Vagrant will error when adding the box.


Итак, я думаю, что ваш формат файла коробки, вероятно, неправильно. Либо он не сжат в рекомендованном формате, либо вы не включили файл metadata.json в архив

1

Вы можете попробовать https://github.com/sparkoo/boxitory. Это просто один jar-сервер. Вы указываете на каталог, в котором у вас есть ваши бродячие коробки, и он создает совместимый http-интерфейс для бродяги. Тогда вы просто указываете это из своего vagrantfile, и все готово. Вам не нужно вручную обрабатывать json-файлы с описанием ваших ящиков, добавлением новых версий, провайдеров и т.д. Все это делается для вас бесплатно. Просто добавьте новый файл коробки, и Boxitory мгновенно вернет его по запросу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .