URL kotak gelandangan untuk file metadata JSON

17

Di Vagrantfile saya, saya dapat menentukan URL kotak:

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

Menurut dokumentasi yang lebih baru , saya harus dapat membuat file JSON yang berisi URL untuk berbagai versi kotak. Dokumentasi juga mengatakan bahwa saya dapat menggunakan URL file JSON ini ketika menjalankan vagrant box add. Saya berharap dapat menggunakan URL untuk file JSON itu config.vm.box_url. Namun, itu sepertinya tidak berhasil. Ketika saya mencobanya, itu memperlakukannya seperti file kotak:

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.

Apakah mungkin untuk memberi tahu Vagrant untuk menggunakan file JSON metadata kotak di Vagrantfile saya? Saya lebih suka tidak harus menggunakan Vagrant Cloud.

Brad
sumber
Apakah Anda pernah menemukan solusi untuk ini?
Jim Rubenstein
@JimRubenstein Sayangnya, tidak. Saran dari Nicholas mungkin bekerja tetapi saya cukup yakin server saya sudah mengirim header tipe konten yang benar untuk JSON. Jawaban dari Chux mungkin akurat, tapi saya belum yakin karena dokumentasi menyiratkan sebaliknya. Sayangnya, dokumentasi Vagrant sangat mengerikan di sekitar dan tidak memberikan banyak konteks antara tutorial-dasar dan kontribusi-untuk-proyek-dan-nongkrong-on-irc tingkat .... setidaknya untuk saya sih.
Brad
Saya sedang menguji sesuatu ketika kita berbicara tentang penerbitan kotak + metadata untuk melihat apakah saya dapat meniru perilaku cloud gelandangan, secara lokal. saya akan memberi tahu Anda bagaimana hasilnya.
Jim Rubenstein

Jawaban:

7

Mulai hari ini (2016-07-12, gelandangan 1.8.4), jika Anda ingin menjalankan katalog Anda sendiri dengan cara manual (yaitu, memperbarui kotak secara manual dan mengedit file metadata.json), tetapi masih harus berperilaku seperti katalog yang sebenarnya, ingatlah hal-hal berikut:

  • File tidak perlu dinamai "metadata.json". Itu bisa dinamai apa saja, asalkan berisi nilai yang diharapkan. Saya menggunakan "metadata.json" di sini untuk memperjelas langkah lebih lanjut di bawah ini.

  • setiap file metadata.json hanya dapat berisi satu kotak tunggal. Itu dapat memiliki beberapa versi, dan setiap versi dapat memiliki beberapa penyedia (virtualbox, vmware, libvirt). Jika Anda perlu memiliki lebih dari satu kotak (katakanlah, "fedora" dan "ubuntu") Anda perlu dua file metadata yang berbeda.

  • Vagrant mengharapkan file metadata.json memiliki tipe "application / json" (seperti yang disebutkan oleh Nicholas Hinds di atas. Jika server web Anda tidak mengembalikannya (atau, mengembalikan "teks / polos"), gelandangan akan menganggap itu file kotak aktual , dan mencoba menguraikannya (dan gagal total).

  • Atlas Hashicorp (yang dulunya adalah Vagrant Cloud) adalah pengecualian untuk ini, karena pengalihan mengarahkan Anda ke konten yang disajikan sebagai "teks / html". Tebakan terbaik saya untuk ini adalah ada hubungannya dengan pengalihan (lebih lanjut tentang ini di bawah).

  • File kotak tidak harus berada di tempat yang sama dengan file metadata. Anda dapat memiliki file metadata di server web lokal, dan kotak di Amazon S3, tidak ada masalah dengan itu.

Jadi, sejauh yang saya dapat, saya menemukan cara termudah untuk menjalankannya di server web dan masih memiliki fungsi yang cukup normal adalah dengan melakukan ini:

Di hosting Anda, buat struktur file dan direktori yang mirip dengan ini:

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)

(tata letak ini berarti "metadata.json" Anda untuk box1 harus memiliki URL yang mengarah ke sesuatu seperti " http: // yourhost / box / yourname / box1 / box1- $ version1- $ provider.box")

Di .htaccess Anda, pastikan bahwa "metadata.json" disetel untuk indeks Direktori. Sisanya bersifat opsional, untuk cache negatif dan menyembunyikan konten yang sebenarnya:

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"

Di lingkungan Anda, ekspor VAGRANT_SERVER_URL mengarah ke hosting Anda. Perhatikan tidak ada garis miring!

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

Dengan ini (dan semua file dengan konten yang benar), Anda dapat pergi dan menambahkan kotak Anda secara langsung:

vagrant box add yourname/box1

Karena "metadata.json" adalah file indeks untuk direktori box1, itu harus mengarahkan ulang konten ke sana, gelandangan akan mengambilnya, menafsirkan metadata dan mengunduh kotak yang sesuai.

Guto Andreollo
sumber
19

Setelah membaca pertanyaan Anda lagi, Tampaknya Anda mencoba melakukan sesuatu yang sedikit berbeda dari saya - tetapi saya pikir tujuan akhir kami adalah sama.

Saya tidak ingin memanfaatkan layanan Cloud Vagrant untuk hosting kotak dasar saya, tetapi saya ingin dapat mendistribusikan lingkungan pengembangan ke tim pengembang saya, dan memanfaatkan fitur metadata.jsonfile untuk mempertahankan sistem versi untuk lingkungan pengembangan, yang kemudian akan tersedia untuk tim pengembangan saya hanya dengan menggunakan fasilitas yang dibangun menjadi gelandangan.

Dokumentasi gelandangan sangat jarang di daerah ini pada saat penulisan ini (8/5/2014), mungkin karena itu fitur yang relatif baru tetapi saya yakin fakta bahwa VagrantCloud memiliki tingkat pembayaran ada hubungannya dengan itu juga .

Untuk mengetahui cara memanfaatkan metadata.jsonfile ke versi dan mendistribusikan kotak, saya melihat beberapa VM yang tersedia di VagrantCloud. Setelah melihat semua itu, dan membaca beberapa kode gelandangan - menjadi sangat mudah untuk mengetahui bagaimana mencapai tujuan saya.

  • Kemas kotak Anda seperti biasa. Dalam kasus saya, saya hanya mengemas untuk kotak virtual, karena itulah yang akan digunakan pengembang kami untuk menjalankan Vm. Saya juga mengemas Vagrantfile dengan basebox saya yang melakukan beberapa penyediaan untuk lingkungan pengembangan (menyiapkan saham ke folder yang sesuai, beberapa konfigurasi apache dasar, kesalahan logging, dll)
  • Buat metadata.jsonfile untuk menggambarkan kotak dasar Anda, milik saya terlihat mirip dengan ini:

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

Setelah saya membuat metadata.jsonfile saya , saya mengunggahnya ke server lokal yang berjalan di jaringan internal kami ( vagrant.domain.local/metadata.json). Setelah saya melakukan itu, yang tersisa hanyalah mengujinya dengan gelandangan:

# 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, kotak pribadi yang di-host, dibagikan, dan versi jauh, yang tidak memerlukan penggunaan Cloud Awan.

Saat Anda membuat versi baru kotak Anda, Anda akan mengemasnya, dan mengedit metadata.jsonfile. Dari apa yang saya tahu, Anda dapat menggunakan skema versi apa pun yang Anda inginkan, baik versi semantik (1.0.0, 1.0.1, dll) atau hanya bilangan bulat sederhana untuk versi (1, 2, 3, dll). Ketika pengguna kotak Anda vagrant upgelandangan secara otomatis memeriksa file metadata.json Anda untuk versi baru, dan akan meminta mereka vagrant box updateuntuk memperbarui kotak itu.

Anda juga dapat melewati vagrant box add <metadata.json url>and vagrant initbits dengan mendefinisikan base Vagrantfile dengan nama kotak dan url kotak, seperti:

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

Anda bisa mendistribusikan Vagrantfile dengan konten-konten itu, dan semua pengguna hanya bisa melakukannya vagrant up. Meskipun, saya tidak yakin tentang cara kerjanya ketika versi diperbarui.

Jim Rubenstein
sumber
Itu sempurna, terima kasih! Namun ... bagaimana cara menambahkan URL JSON itu ke Vagrantfile?
Brad
Anda tidak perlu melakukannya. Ketika Anda menambahkan kotak, Vagrant mengunduh gambar kotak saat ini dan menyimpan informasinya di ~/.vagrant.d/boxes/<your box name>. Di dalam folder itu ada metadata_urlfile yang direferensikan di sekitar dokumentasi, yang menyimpan URL untuk file JSON Anda yang mendefinisikan versi Anda. Vagrant menangani semua itu secara otomatis, jadi yang harus Anda lakukan adalah vagrant box add <your metadata.json url>, kemudian hanya vagrant init <boxname> && vagrant up, gelandangan yang melakukan sisanya
Jim Rubenstein
Saya mengerti itu, tapi saya mencoba membuatnya semudah mungkin bagi pengembang untuk bangkit dan berjalan. Dengan menambahkan URL kotak di Vagrantfile, tidak vagrant box adddiperlukan. Jika saya bisa mengatur URL file JSON itu di Vagrantfile, itu satu langkah lebih sedikit untuk dev baru yang baru bergabung dengan tim untuk bangkit dan berjalan. Ini berfungsi untuk kotak, tapi saya tidak tahu mengapa itu tidak berfungsi untuk file JSON.
Brad
1
ah, gotcha - saya sebenarnya hanya menemukan solusi untuk itu dengan hanya kentut sekitar. Anda harus menentukan config.vm.boxDAN di config.vm.box_urlmana boxnama kotak Anda, dan box_urlmerupakan URL ke file json Anda.
Jim Rubenstein
1
@JimRubenstein Jawaban yang fantastis - seperti Goldilocks, tidak terlalu pendek, tidak terlalu lama :)
Steve Jansen
9

Vagrant mengharuskan URL metadata kotak disajikan dengan application/jsonjenis konten. Kesalahan yang Anda dapatkan menunjukkan bahwa gelandangan telah menafsirkan URL Anda sebagai kotak biasa.

Pastikan server HTTP Anda mengatur Content-Typeheader dengan tepat. Sebagian besar server HTTP akan secara otomatis mengatur Content-Type header ke application/jsonjika file Anda memiliki ekstensi.json

Nicholas Hinds
sumber
1
Saya tidak tahu mengapa balasan Anda bukan jawabannya karena inilah yang harus saya lakukan untuk membuat provisi lokal bekerja dengan Vagrant.
Gaurav
4

Saya pikir Anda mendapat arahan mereka dicampur ..

Berikut ini diambil dari situs gelandangan:


KOTAK FILE

File kotak yang sebenarnya adalah bagian yang diperlukan untuk Vagrant. Disarankan Anda selalu menggunakan file metadata bersama file kotak, tetapi file kotak langsung didukung untuk alasan warisan di 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. Inti gelandangan itu sendiri hanya membongkar kotak untuk digunakan nanti.

Within the archive, Vagrant does expect a single file: "metadata.json".Ini adalah file JSON yang sama sekali tidak terkait dengan komponen "box metadata" di atas. This file must contain at least the "provider" key with the provider the box is for. Misalnya, jika kotak Anda untuk VirtualBox, metadata.json akan terlihat seperti ini:

{
  "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.


Jadi, saya pikir format file kotak Anda mungkin salah. Entah itu tidak dikompresi dengan format yang direkomendasikan, atau Anda belum menyertakan file metadata.json dalam arsip

Chux Uzoeto
sumber
Untuk yang lain dengan masalah yang sama, jalur metadata.json (di windows) adalah .. Pengguna \ username \ vagrant.d \ box \ boxname \ 0 \ virtualbox \ metadata.json
Nebojsac
1

Anda dapat mencoba https://github.com/sparkoo/boxitory . Ini sederhana satu server jar. Anda arahkan ke direktori di mana Anda memiliki kotak gelandangan Anda dan itu menciptakan antarmuka http yang kompatibel untuk gelandangan. Maka Anda cukup mengarahkannya dari vagrantfile Anda dan Anda selesai. Anda tidak perlu secara manual menangani file json yang menggambarkan kotak Anda, menambahkan versi baru, penyedia, dll. Semuanya dilakukan untuk Anda secara gratis. Cukup tambahkan file kotak baru dan Boxitory langsung mengembalikannya saat diminta.

Michal Vala
sumber