Błędny adres URL pola dla pliku metadanych JSON

18

W moim pliku Vagrant mogę określić adres URL pudełka:

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

Zgodnie z najnowszą dokumentacją powinienem być w stanie utworzyć plik JSON, który zawiera adresy URL dla różnych wersji pudełka. Dokumentacja mówi również, że mogę używać adresu URL tego pliku JSON podczas działania vagrant box add. Miałem nadzieję, że będę mógł użyć adresu URL tego pliku JSON config.vm.box_url. To jednak nie działa. Kiedy próbuję, traktuje to jak plik pudełkowy:

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.

Czy można powiedzieć Vagrantowi, aby używał pliku JSON z metadanymi skrzynki w moim pliku Vagrant? Wolałbym nie używać Vagrant Cloud.

Ćwiek
źródło
Czy kiedykolwiek znalazłeś rozwiązanie tego problemu?
Jim Rubenstein
@JimRubenstein Niestety nie. Sugestia Nicholasa może działać, ale jestem prawie pewien, że mój serwer już wysyła poprawne nagłówki typu zawartości dla JSON. Odpowiedź od Chuxa może być dokładna, ale nie jestem jeszcze przekonany, ponieważ dokumentacja sugeruje inaczej. Niestety, dokumentacja Vagrant jest dość straszna i nie zawiera zbyt dużego kontekstu między podstawowym samouczkiem a poziomem przyczyniania się do projektu i spędzania czasu na irc ... przynajmniej dla mnie.
Brad
testuję coś, gdy mówimy o publikacji ramki + metadanych, aby sprawdzić, czy mogę naśladować zachowanie włóczęgi w chmurze, lokalnie. dam ci znać, jak się okaże.
Jim Rubenstein

Odpowiedzi:

8

Na dzień dzisiejszy (2016-07-12, włóczęga 1.8.4), jeśli chcesz uruchomić własny katalog w sposób ręczny (to znaczy ręcznie aktualizować skrzynki i edytować plik metadata.json), ale nadal powinien się zachowywać jak prawdziwy katalog, pamiętaj o następujących rzeczach:

  • Plik nie musi mieć nazwy „metadata.json”. Można go nazwać dowolną nazwą, o ile zawiera oczekiwane wartości. Używam „metadata.json” tutaj, aby wyjaśnić dalsze kroki poniżej.

  • każdy plik metadata.json może zawierać tylko jedno pojedyncze pudełko. Może mieć wiele wersji, a każda wersja może mieć wielu dostawców (virtualbox, vmware, libvirt). Jeśli potrzebujesz więcej niż jednego pola (powiedzmy „fedora” i „ubuntu”), potrzebujesz dwóch różnych plików metadanych.

  • Vagrant oczekuje, że plik metadata.json ma typ „application / json” (jak wspomniano powyżej Nicholas Hinds. Jeśli twój serwer nie zwróci go (lub zwróci „tekst / zwykły”), włóczęga przyjmie, że jest to rzeczywisty plik skrzynki i spróbuj go przeanalizować (i ponieść porażkę).

  • Atlas Hashicorp (wcześniej Vagrant Cloud) stanowi wyjątek od tego, ponieważ przekierowania prowadzą do treści udostępnianych jako „text / html”. Domyślam się, że ma to coś wspólnego z przekierowaniami (więcej na ten temat poniżej).

  • Plik skrzynki nie musi znajdować się w tym samym miejscu co plik metadanych. Możesz mieć plik metadanych na lokalnym serwerze internetowym i pudełko w Amazon S3, nie ma z tym problemu.

Tak więc, o ile mi się udało, znalazłem najłatwiejszy sposób, aby uruchomić to na serwerze internetowym i nadal mieć całkiem normalną funkcjonalność, to zrobić:

Na swoim hoście utwórz strukturę plików i katalogów podobną do tej:

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)

(ten układ oznacza, że ​​twój „metadata.json” dla box1 będzie musiał mieć adresy URL wskazujące na coś w rodzaju „ http: // twójhost / pola / nazwa / box1 / pole1- $ wersja1- $ dostawca.box”)

Upewnij się, że w pliku .htaccess dla indeksu katalogu ustawiona jest wartość „metadata.json”. Reszta jest opcjonalna, dla negatywnej pamięci podręcznej i ukrywania faktycznej zawartości:

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"

W swoim środowisku wyeksportuj VAGRANT_SERVER_URL, wskazując na swój hosting. Zwróć uwagę na brak ukośnika!

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

Mając to na miejscu (i wszystkie pliki z prawidłową zawartością), możesz przejść i bezpośrednio dodać swoje pudełko:

vagrant box add yourname/box1

Ponieważ „metadata.json” jest plikiem indeksu dla katalogu box1, powinien przekierować zawartość bezpośrednio do niego, włóczęga ją przejmie, zinterpretuje metadane i pobierze odpowiednie pole.

Guto Andreollo
źródło
19

Po ponownym przeczytaniu pytania, wygląda na to, że próbujesz zrobić coś nieco innego niż ja - ale myślę, że nasz cel końcowy jest taki sam.

Nie chcę korzystać z usługi Vagrant Cloud do hostowania moich baz, ale chcę móc rozpowszechniać środowisko programistyczne w moim zespole deweloperów i korzystać z funkcji metadata.jsonpliku, aby utrzymać system kontroli wersji dla środowiska programistycznego, które następnie będą dostępne dla mojego zespołu programistów po prostu za pomocą udogodnień wbudowanych w włóczęgę.

Vagrant dokumentacja jest bardzo rzadka w tym obszarze w momencie pisania tego tekstu (8/5/2014), prawdopodobnie dlatego, że jest to stosunkowo nowa funkcja, ale jestem pewien, że fakt, że VagrantCloud ma płatną warstwę, ma z tym coś wspólnego .

Aby dowiedzieć się, jak wykorzystać metadata.jsonplik do wersji i dystrybucji skrzynek, przyjrzałem się niektórym maszynom wirtualnym dostępnym na VagrantCloud. Po ich przejrzeniu i przeczytaniu trochę błędnego kodu - dość łatwo było dowiedzieć się, jak osiągnąć mój cel.

  • Zapakuj swoje pudełko tak jak zwykle. W moim przypadku pakuję tylko dla wirtualnego pudełka, ponieważ tego właśnie nasi programiści będą używać do uruchomienia Vm. Pakuję też plik Vagrantfile z moim baseboxem, który wykonuje pewne operacje związane ze środowiskiem programistycznym (konfigurowanie udziałów w odpowiednich folderach, podstawowe konfiguracje apache, rejestrowanie błędów itp.)
  • Utwórz metadata.jsonplik, aby opisać swoje pole podstawowe, moje wygląda podobnie do tego:

    {
        "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"
            }]
        }]
    }
    

Po utworzeniu metadata.jsonpliku przesłałem go na lokalny serwer działający w naszej sieci wewnętrznej ( vagrant.domain.local/metadata.json). Kiedy to zrobiłem, pozostało mi tylko przetestować to włóczęgą:

# 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, zdalnie hostowana, współdzielona i wersjonowana prywatna skrzynka, która nie wymaga użycia Vagrant Cloud.

Gdy tworzysz nowe wersje swojego pudełka, spakujesz je i edytujesz metadata.jsonplik. Z tego, co mogę powiedzieć, możesz użyć dowolnego schematu wersjonowania, czy to wersjonowania semantycznego (1.0.0, 1.0.1, itp.), Czy po prostu prostych liczb całkowitych dla wersji (1, 2, 3 itd.). Gdy vagrant upwłóczęga użytkowników Twojej skrzynki automatycznie sprawdzi, czy plik metadata.json ma nową wersję, i poprosi ich o zrobienie vagrant box updateaktualizacji.

Możesz także pominąć bity vagrant box add <metadata.json url>i vagrant init, definiując podstawowy plik Vagrantfile z nazwą skrzynki i adresem URL skrzynki, tak jak poniżej:

# -*- 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

Możesz rozpowszechniać plik Vagrant z tymi treściami, a wszyscy użytkownicy będą w stanie to zrobić vagrant up. Chociaż nie jestem pewien, jak to działa, gdy wersje są aktualizowane.

Jim Rubenstein
źródło
To idealnie, dzięki! Jednak ... jak dodać ten adres URL JSON do pliku Vagrantfile?
Brad
Nie musisz. Po dodaniu pola Vagrant pobiera bieżący obraz pudełka i przechowuje informacje w nim ~/.vagrant.d/boxes/<your box name>. Wewnątrz tego folderu znajduje się metadata_urlplik, do którego odwołuje się dokumentacja, który zawiera adres URL pliku JSON, który określa twoje wersje. Vagrant obsługuje to wszystko automatycznie, więc wszystko, co musisz zrobić vagrant box add <your metadata.json url>, to po prostu vagrant init <boxname> && vagrant upwłóczęga zajmie się resztą
Jim Rubenstein
Rozumiem to, ale staram się ułatwić programistom rozpoczęcie pracy. Dodanie adresu URL pola do pliku Vagrant nie vagrant box addjest konieczne. Gdybym mógł ustawić adres URL tego pliku JSON w pliku Vagrantfile, to jeden krok mniej dla nowego programisty, który dopiero dołącza do zespołu, aby rozpocząć pracę. Działa w przypadku skrzynek, ale nie mogę zrozumieć, dlaczego nie działa w przypadku pliku JSON.
Brad
1
ach, gotcha - właściwie właśnie znalazłem rozwiązanie, po prostu pierdząc. musisz zdefiniować config.vm.boxORAZ config.vm.box_urlgdzie boxjest nazwa skrzynki i box_urladres URL pliku json.
Jim Rubenstein,
1
@JimRubenstein Fantastyczna odpowiedź - podobnie jak Złotowłosa, nie za krótka, nie za długa :)
Steve Jansen
9

Vagrant wymaga, aby adresy URL metadanych w polu były podawane z application/jsontypem treści. Otrzymany błąd wskazuje, że włóczęga zinterpretował adres URL jako zwykłe pole.

Upewnij się, że serwer HTTP Content-Typeodpowiednio ustawia nagłówek. Większość serwerów HTTP automatycznie ustawi Content-Type nagłówek, application/jsonjeśli plik ma rozszerzenie.json

Nicholas Hinds
źródło
1
Nie wiem, dlaczego twoja odpowiedź nie jest odpowiedzią, ponieważ właśnie to musiałem zrobić, aby lokalne udostępnianie działało z Vagrant.
Gaurav,
4

Myślę, że pomieszaliście ich dyrektywy ...

Poniższe informacje pochodzą z witryny Vagrant:


PLIK BOX

Rzeczywisty plik skrzynki jest wymaganą częścią Vagrant. Zaleca się, aby zawsze używać pliku metadanych obok pliku pudełka, ale bezpośrednie pliki pudełkowe są obsługiwane z powodów starszych w 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 core sam rozpakowuje pudełka, by użyć ich później.

Within the archive, Vagrant does expect a single file: "metadata.json".Jest to plik JSON, który jest całkowicie niezwiązany z powyższym komponentem „metadanych skrzynki”. This file must contain at least the "provider" key with the provider the box is for. Na przykład, jeśli twoje pudełko było dla VirtualBox, metadata.json wyglądałby tak:

{
  „dostawca”: „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.


Myślę więc, że twój format pliku skrzynki jest prawdopodobnie nieprawidłowy. Albo nie jest skompresowany w zalecanym formacie, albo nie dołączono pliku metadata.json w archiwum

Chux Uzoeto
źródło
W przypadku innych osób z tym samym problemem ścieżka metadata.json (w systemie Windows) to .. Użytkownicy \ nazwa użytkownika \ włóczęga.d \ skrzynki \ nazwa skrzynki \ 0 \ virtualbox \ metadata.json
Nebojsac
1

Możesz spróbować https://github.com/sparkoo/boxitory . To prosty serwer z jednym słoikiem. Wskazujesz go na katalog, w którym masz swoje błądzące pudełka i tworzy kompatybilny interfejs http dla włóczęgów. Następnie po prostu wskazujesz go z pliku włóczęgi i gotowe. Nie musisz ręcznie obsługiwać plików Json opisujących twoje pudełka, dodawania nowych wersji, dostawców itp. Wszystko to odbywa się za darmo. Wystarczy dodać nowy plik skrzynki, a Boxitory natychmiast go zwróci na żądanie.

Michał Wala
źródło