JSON meta veri dosyası için vagrant kutusu URL'si


18

Vagrantfile'mda bir kutunun URL'sini belirtebilirim:

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

Göre daha yeni belgeler , kutunun farklı sürümleri URL'sini içeren bir JSON dosyası oluşturmak mümkün olmalıdır. Belgeler ayrıca çalışırken bu JSON dosyasının URL'sini kullanabileceğimi söylüyor vagrant box add. Bu JSON dosyasının URL'sini kullanabilmeyi umuyordum config.vm.box_url. Ancak, bu işe yaramıyor gibi görünüyor. Denediğimde, bir kutu dosyası gibi davranır:

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'a Vagrant dosyamda bir kutu meta veri JSON dosyası kullanmasını söylemek mümkün mü? Vagrant Cloud kullanmak zorunda kalmam.


Bunun için bir çözüm buldunuz mu?
Jim Rubenstein

@JimRubenstein Maalesef hayır. Nicholas'ın önerisi işe yarayabilir, ancak sunucumun JSON için zaten doğru içerik türü başlıklarını gönderdiğinden eminim. Chux'un cevabı doğru olabilir, ancak belgelerin aksini ima ettiği için henüz ikna olmadım. Ne yazık ki, Vagrant'ın belgeleri her yerde oldukça korkunç ve temel öğretici ve irc-on-ir-on-on-ir-on-out-on-irc seviyeleri arasında çok fazla bağlam vermez .... en azından benim için zaten.
Brad

Ben yerel olarak vagrant bulut davranışını taklit edip edemeyeceğini görmek için bir kutu + meta veri yayınlama hakkında konuşurken bir şey test ediyorum. nasıl ortaya çıktığını size bildireceğim.
Jim Rubenstein

Yanıtlar:


8

Bugün itibariyle (2016-07-12, vagrant 1.8.4), kendi kataloğunuzu manuel olarak çalıştırmak istiyorsanız (yani, kutuları manuel olarak güncellemek ve metadata.json dosyasını düzenlemek), ancak yine de davranmasını istiyorsanız gerçek bir katalog gibi, aşağıdakileri aklınızda bulundurun:

  • Dosyanın "metadata.json" olarak adlandırılmasına gerek yoktur. Beklenen değerleri içerdiği sürece herhangi bir ad verilebilir. Aşağıdaki adımları açıklığa kavuşturmak için burada "metadata.json" kullanıyorum.

  • her metadata.json dosyası yalnızca tek bir kutu içerebilir. Birden çok sürümü olabilir ve her sürümün birden çok sağlayıcısı olabilir (sanal kutu, vmware, libvirt). Birden fazla kutunuz olması gerekiyorsa (örneğin, "fedora" ve "ubuntu") iki farklı meta veri dosyasına ihtiyacınız vardır.

  • Vagrant metadata.json dosyasının bir tür "application / json" olmasını bekler (Nicholas Hinds'ın yukarıda belirtildiği gibi. Web sunucunuz bunu döndürmezse (veya "text / plain" döndürürse), vagrant bunun gerçek bir kutu dosyası olduğunu varsayar ve ayrıştırmayı deneyin (ve sefil bir şekilde başarısız olun).

  • Hashicorp Atlas (eskiden Vagrant Cloud olarak bilinirdi) bunun istisnasıdır, çünkü yönlendirmeler sizi "text / html" olarak sunulan içeriğe yönlendirir. Bunun için en iyi tahminim, yönlendirmelerle ilgili bir şeyleri var (daha fazlası aşağıda).

  • Kutu dosyasının meta veri dosyasıyla aynı yerde olması gerekmez. Meta veri dosyanızı yerel bir web sunucusunda ve Amazon S3'teki kutunuzda sorun yaşayabilirsiniz.

Yani, sahip olduğum kadarıyla, bunu bir web sunucusunda çalışmanın en kolay yolunu buldum ve hala oldukça normal işlevselliğe sahip olmak bunu yapmaktır:

Web barındırıcınızda buna benzer bir dosya ve dizin yapısı oluşturun:

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)

(bu düzen, box1 için "metadata.json" dosyanızın URL'lerinin " http: // yourhost / boxes / adınız / box1 / box1- $ version1- $ sağlayıcı.box" gibi bir şeye işaret etmesi gerektiği anlamına gelir )

.Htaccess dosyanızda, "metadata.json" dosyasının Dizin dizini için ayarlandığından emin olun. Kalanı negatif önbellek ve gerçek içeriği gizlemek için isteğe bağlıdır:

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"

Ortamınızda, web barındırıcınızı işaret eden VAGRANT_SERVER_URL dosyasını dışa aktarın. Sondaki eğik çizgiye dikkat edin!

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

Bu yerdeyken (ve doğru içeriğe sahip tüm dosyalar) gidip kutunuzu doğrudan ekleyebilirsiniz:

vagrant box add yourname/box1

"Metadata.json" box1 dizini için dizin dosyası olduğundan, içeriği doğrudan ona yönlendirmelidir, vagrant dosyayı alacak, meta verileri yorumlayacak ve uygun kutuyu indirecektir.


19

Sorunuzu tekrar okuduktan sonra, benden farklı bir şey yapmaya çalışıyorsunuz gibi görünüyor - ama bence son hedefimiz aynı.

Temel kutularımı barındırmak için Vagrant Cloud hizmetini kullanmak istemiyorum, ancak geliştirme ekibime bir geliştirme ortamı dağıtabilmek ve geliştirme ortamına yönelik metadata.jsonbir sürümleme sistemi sağlamak için dosyanın özelliklerini kullanmak istiyorum , bu da geliştirme ekibim için sadece vagrant içine yerleştirilmiş olan tesisler kullanılarak erişilebilir olacak.

Vagrant dokümantasyonu, bu yazı sırasında bu alanda gerçekten seyrek (8/5/2014), muhtemelen nispeten yeni bir özellik çünkü VagrantCloud'un ücretli bir katmanı olduğu gerçeğinden eminim .

metadata.jsonKutuyu sürüm ve dağıtım için nasıl kullanacağımı anlamak için VagrantCloud'da bulunan bazı VM'lere baktım. Bunları inceledikten ve bazı vagrant kodunu okuduktan sonra - hedefime nasıl ulaşacağımı anlamak oldukça kolay oldu.

  • Kutunuzu normal şekilde paketleyin. Benim durumumda, sadece sanal kutu için paketleme yapıyorum, çünkü geliştiricilerimiz Vm'yi çalıştırmak için kullanacaklar. Ayrıca, geliştirme ortamı için bazı provizyonlar yapan uygun bir Vagrantfile paketim var (uygun klasörlere paylaşımlar, bazı temel apache yapılandırmaları, hata günlüğü vb.)
  • metadata.jsonTemel kutunuzu tanımlamak için bir dosya oluşturun , benimki şuna benzer:

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

Dosyamı oluşturduktan sonra metadata.json, dahili ağımızda ( vagrant.domain.local/metadata.json) çalışan yerel bir sunucuya yükledim . Bunu yaptıktan sonra, geriye kalan tek şey vagrant ile test etmekti:

# 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 kullanılmasını gerektirmeyen, uzaktan barındırılan, paylaşılan ve sürümlendirilmiş bir özel kutu.

Kutunuzun yeni sürümlerini oluştururken kutuyu paketlersiniz ve metadata.jsondosyayı düzenlersiniz . Söyleyebileceğim kadarıyla, semantik sürümleme (1.0.0, 1.0.1, vb.) Veya sürümler (1, 2, 3, vb.) Kutu kullanıcılarınız vagrant upvagrant, metadata.json dosyanızı yeni bir sürüm için otomatik olarak kontrol ettiğinde ve kutuyu vagrant box updategüncellemek için kendilerinden izin isteyecektir .

Ayrıca kutu adı ve kutu url'si ile bir taban Vagrantfile tanımlayarak vagrant box add <metadata.json url>ve vagrant initbitlerini atlayabilirsiniz, şöyle:

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

Bu içeriklerle bir Vagrant dosyası dağıtabilirsiniz ve tüm kullanıcılar bunu yapabilir vagrant up. Yine de, sürümler güncellendiğinde bunun nasıl çalıştığından emin değilim.


Mükemmel, teşekkürler! Ancak ... bu JSON URL'sini Vagrantdosyasına nasıl ekleyebilirim?
Brad

Gerek yok. Kutuyu eklediğinizde Vagrant geçerli kutu görüntüsünü indirir ve bilgileri saklar ~/.vagrant.d/boxes/<your box name>. Bu klasörün içinde, metadata_urlsürümlerinizi tanımlayan JSON dosyanızın URL'sini barındıran dokümantasyon etrafında referans verilen dosya bulunur. Serseri kolları otomatik olarak bu nedenle tüm yapmanız gereken hepsi bu vagrant box add <your metadata.json url>, o zaman sadece vagrant init <boxname> && vagrant up, serseri dinlenme yapar
Jim Rubenstein

Bunu anlıyorum, ancak geliştiricilerin kalkmasını ve çalışmasını mümkün olduğunca kolaylaştırmaya çalışıyorum. Vagrantdosyasına bir kutu URL'si ekleyerek, buna gerek yoktur vagrant box add. Vagrant dosyasında bu JSON dosyasının URL'sini ayarlayabilirsem, yeni bir geliştiricinin ayağa kalkıp çalışmaya başlaması için daha az bir adım. Kutular için çalışır, ancak neden JSON dosyası için çalışmadığını anlayamıyorum.
Brad

1
ah, gotcha - aslında sadece osuruklayarak bir çözüm buldum. Eğer tanımlamak zorunda config.vm.boxVE config.vm.box_urlnereye boxKutun adıdır ve box_urlsizin json dosyası URL'dir.
Jim Rubenstein

1
@JimRubenstein Fantastik cevap - tıpkı Goldilocks gibi, çok kısa değil, çok uzun değil :)
Steve Jansen

9

Vagrant, kutu meta veri URL'lerinin application/jsoniçerik türüyle sunulmasını gerektirir . Aldığınız hata, vagrant'ın URL'nizi normal bir kutu olarak yorumladığını gösterir.

HTTP sunucunuzun Content-Typeüstbilgiyi uygun şekilde ayarladığından emin olun . Çoğu HTTP sunucusu, dosyanızda uzantı varsa Content-Type başlığı otomatik olarakapplication/json.json


1
Cevabınızın neden cevap olmadığını bilmiyorum, çünkü Vagrant ile yerel provizyon çalışmasını sağlamak için tam olarak yapmam gereken şey buydu.
Gaurav

4

Bence onların direktifleri karıştı.

Aşağıdakiler vagrant web sitesinden alınmıştır:


KUTU DOSYASI

Gerçek kutu dosyası Vagrant için gereken bölümdür. Her zaman bir kutu dosyasının yanında bir meta veri dosyası kullanmanız önerilir, ancak doğrudan kutu dosyaları Vagrant'ta eski nedenlerle desteklenir.

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 çekirdeğin kendisi daha sonra kullanılmak üzere kutuları açar.

Within the archive, Vagrant does expect a single file: "metadata.json".Bu, yukarıdaki "kutu meta verileri" bileşeniyle tamamen alakasız bir JSON dosyasıdır. This file must contain at least the "provider" key with the provider the box is for. Örneğin, kutunuz VirtualBox içinse metadata.json şöyle görünecektir:

{
  "sağlayıcı": "sanal kutu"
}

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.


Yani, kutu dosya biçiminizin muhtemelen yanlış olduğunu düşünüyorum. Ya önerilen biçimle sıkıştırılmamış ya da arşive metadata.json dosyası eklemediniz


Aynı sorunu olan diğer kullanıcılar için metadata.json yolu (pencerelerde) ..Kullanıcılar \ kullanıcı adı \ vagrant.d \ kutuları \ kutuadı \ 0 \ virtualbox \ metadata.json
Nebojsac

1

Https://github.com/sparkoo/boxitory adresini deneyebilirsiniz . Basit bir kavanoz sunucusu. Eğer vagrant kutuları var dizine işaret ve vagrant için uyumlu http arayüzü oluşturur. Sonra sadece vagrant dosyasından işaret ve bitti. Kutularınızı tanımlayan, yeni sürümler, sağlayıcılar vb. Ekleyerek json dosyalarını elle işlemeniz gerekmez. Sadece yeni bir kutu dosyası ekleyin ve Boxitory istendiğinde anında geri döndürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.