URL-адрес Vagrant box для файла метаданных JSON


18

В моем 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.


Вы когда-нибудь находили решение для этого?
Джим Рубенштейн

@JimRubenstein К сожалению, нет. Предложение Николаса может сработать, но я почти уверен, что мой сервер уже отправляет правильные заголовки типов контента для JSON. Ответ от Chux может быть точным, но я еще не уверен, поскольку документация подразумевает иное. К сожалению, документация Vagrant довольно ужасна и не дает большого контекста между базовым уровнем обучения и уровнями «вносить вклад в проект» и «повесить на irc» ... по крайней мере, для меня в любом случае.
Брэд

Я тестирую что-то, пока мы говорим о публикации коробки + метаданных, чтобы увидеть, могу ли я подражать поведению бродячего облака локально. Я дам вам знать, как это получается.
Джим Рубинштейн

Ответы:


8

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

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

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

  • Vagrant ожидает, что файл 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 подберет его, интерпретирует метаданные и загрузит соответствующий блок.


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 upvagrant автоматически проверяют ваш файл metadata.json на наличие новой версии, и предлагают им vagrant box updateобновить окно.

Вы также можете пропустить vagrant box add <metadata.json url>и vagrant initбиты, определяющие базовую 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. Хотя я не уверен, как это работает, когда обновляются версии.


Это прекрасно, спасибо! Однако ... как добавить этот JSON URL в Vagrantfile?
Брэд

Вам не нужно. При добавлении блока Vagrant загружает текущее изображение блока и сохраняет информацию в нем ~/.vagrant.d/boxes/<your box name>. Внутри этой папки находится metadata_urlфайл, на который ссылается документация, в котором содержится URL-адрес вашего файла JSON, который определяет ваши версии. Вагрант обрабатывает все это автоматически, поэтому все, что вам нужно сделать, это сделать vagrant box add <your metadata.json url>, а просто vagrant init <boxname> && vagrant upВагрант сделает все остальное
Джим Рубенштейн,

Я понимаю это, но я пытаюсь сделать так, чтобы разработчики могли как можно проще приступить к работе. При добавлении URL-адреса в Vagrantfile нет vagrant box addнеобходимости. Если бы я мог установить URL этого JSON-файла в Vagrantfile, это был бы еще один шаг для нового разработчика, который просто присоединился к команде, чтобы начать работу. Это работает для коробок, но я не могу понять, почему это не работает для файла JSON.
Брэд

1
ах, понял - я на самом деле только что нашел решение, просто пукнув. Вы должны определить config.vm.boxAND, config.vm.box_urlгде boxнаходится имя вашего ящика и box_urlURL вашего файла json.
Джим Рубинштейн,

1
@JimRubenstein Фантастический ответ - так же, как Златовласка, не слишком короткая, не слишком длинная :)
Стив Янсен

9

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

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


1
Я не знаю, почему ваш ответ не является ответом, потому что это именно то, что мне нужно было сделать, чтобы локальная инициализация работала с 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 будет выглядеть так:

{
  "провайдер": "виртуальная коробка"
}

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 в архив


Для других с такой же проблемой путь metadata.json (в окнах): ..Users \ username \ vagrant.d \ boxes \ boxname \ 0 \ virtualbox \ metadata.json
Nebojsac

1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.