URL-адреса бродячого для файлу метаданих 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 може бути точною, але я ще не переконаний, оскільки документація передбачає інше. На жаль, документація Вагранта є досить жахливою навколо і не дає великого контексту між базовим навчальним посібником та внеском у проект, проектом та призупиненням-на-irc .... принаймні для мене все одно.
Бред

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

Відповіді:


8

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

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

  • кожен файл metadata.json може містити лише одне поле. Він може мати кілька версій, і кожна версія може мати декілька постачальників (virtualbox, vmware, libvirt). Якщо вам потрібно мати більше одного вікна (скажімо, "Fedora" та "ubuntu"), вам потрібні два різних файли метаданих.

  • Vagrant очікує, що файл metadata.json матиме тип "application / json" (як згадував Ніколас Хіндс. Якщо ваш веб-сервер не повертає його (або повертає "текст / звичайний"), vagrant припустить, що це фактичний файл вікна , і спробуйте розібрати його (і невдало провалитися).

  • Атлас Хашикорпа (який раніше був Хмарою-бродягою) - виняток із цього, оскільки переспрямовування веде вас до вмісту, який подається як "текст / 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 / box / 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, він повинен перенаправляти вміст прямо до нього, бродяг підбере його, інтерпретує метадані та завантажить відповідне поле.


19

Прочитавши ще раз своє запитання, здається, ви намагаєтесь зробити щось трохи інше, ніж я, - але я думаю, наша кінцева мета однакова.

Я не хочу використовувати сервіс Vagrant Cloud для розміщення моїх базових вікон, але я хочу мати можливість поширювати середовище розробки для своєї команди розробників та використовувати функції metadata.jsonфайлу для підтримки системи версій для середовища розробки, яка буде доступна моїй команді розробників просто за допомогою засобів, вбудованих у бродячі.

На момент написання цієї документації бродяча документація в цій галузі дуже рідка (8/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). Після того, як я це зробив, все, що залишилося, - це перевірити це бродячим:

# 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

Voila, приватна скринька, що розміщена на відкритому повітрі, розміщена та розроблена, що не потребує використання Vagrant Cloud.

Під час створення нових версій коробки ви будете пакувати її та редагувати metadata.jsonфайл. З того, що я можу сказати, ви можете використовувати будь-яку схему версій, яку ви хочете, будь то семантична версія (1.0.0, 1.0.1 і т. Д.) Або просто цілі числа для версій (1, 2, 3 тощо). Коли користувачі вашої скриньки vagrant upбродять автоматично перевіряє ваш файл 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. Хоча я не впевнений у тому, як це працює, коли версії оновлюються.


Це ідеально, дякую! Однак ... як додати цю URL-адресу JSON до 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
ах, gotcha - я насправді я просто знайшов рішення для цього, просто придурившись. ви повинні визначити config.vm.boxІ, config.vm.box_urlде boxваше ім'я поля, і box_urlце URL-адреса вашого файлу json.
Джим Рубенштейн

1
@JimRubenstein Фантастична відповідь - так само, як Золотинки, не надто короткі, не надто довгі :)
Стів Янсен

9

Vagrant вимагає, щоб URL-адреси метаданих поля надходили до application/jsonтипу вмісту. Помилка, яку ви отримуєте, вказує на те, що бродяг інтерпретував вашу 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. Само бродяжне ядро ​​розпаковує коробки для подальшого використання.

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, метаdata.json виглядав би так:

{
  "провайдер": "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.


Отже, я думаю, що ваш формат файлу коробки, мабуть, неправильний Або він не стискається з рекомендованим форматом, або ви не включили файл метаданих.json в архів


Для інших із тим самим питанням шлях metadata.json (у windows) є .. Користувачі \ ім'я користувача \ vagrant.d \ box \ boxname \ 0 \ virtualbox \ metadata.json
Nebojsac

1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.