JSON मेटाडेटा फ़ाइल के लिए वैग्रंट बॉक्स URL


18

मेरे Vagrantfile में, मैं एक बॉक्स का URL निर्दिष्ट कर सकता हूं:

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

हाल ही के दस्तावेज़ के अनुसार , मुझे एक JSON फ़ाइल बनाने में सक्षम होना चाहिए जिसमें बॉक्स के विभिन्न संस्करणों के URL शामिल हैं। दस्तावेज़ीकरण यह भी कहता है कि मैं इस JSON फ़ाइल के URL का उपयोग कर सकता हूं vagrant box add। मैं उस JSON फ़ाइल के URL का उपयोग करने में सक्षम होने की उम्मीद कर रहा था 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.

क्या वैग्रैंट को मेरे वैग्रांटफाइल में बॉक्स मेटाडेटा JSON फाइल का उपयोग करना संभव है? मुझे नहीं बल्कि वैग्रैंट क्लाउड का उपयोग करना होगा।


क्या आपने कभी इसके लिए कोई समाधान खोजा?
जिम रुबेनस्टीन

@JimRubenstein दुर्भाग्य से, नहीं। निकोलस का सुझाव काम कर सकता है, लेकिन मुझे पूरा यकीन है कि मेरा सर्वर पहले से ही JSON के लिए सही सामग्री प्रकार हेडर भेज रहा है। चुक्स से उत्तर सटीक हो सकता है, लेकिन मैं अभी तक आश्वस्त नहीं हूं क्योंकि दस्तावेज अन्यथा निकलता है। दुर्भाग्य से, वैग्रांट का प्रलेखन चारों ओर बहुत भयानक है और बुनियादी-ट्यूटोरियल और योगदान-से-प्रोजेक्ट-और-हैंग-आउट-ऑन-irc स्तरों के बीच ज्यादा संदर्भ नहीं देता है .... कम से कम मेरे लिए वैसे भी।
ब्रैड

मैं कुछ परीक्षण कर रहा हूं जैसा कि हम एक बॉक्स + मेटाडेटा के प्रकाशन पर बोलते हैं, यह देखने के लिए कि क्या मैं स्थानीय रूप से योनि बादल के व्यवहार की नकल कर सकता हूं। मैं आपको बताता हूँ कि यह कैसे निकला।
जिम रुबेंस्टीन

जवाबों:


8

आज के अनुसार (२०१६-० ,-१२, आवारा १..4.४), यदि आप अपनी खुद की कैटलॉग को मैन्युअल तरीके से चलाना चाहते हैं (अर्थात, मैन्युअल रूप से बक्से को अपडेट कर रहे हैं और मेटाडेटा.जॉसन फ़ाइल को एडिट कर रहे हैं), लेकिन फिर भी इसका व्यवहार है एक वास्तविक सूची की तरह, निम्नलिखित बातों का ध्यान रखें:

  • फ़ाइल को "मेटाडेटा.जॉन" नाम देने की कोई आवश्यकता नहीं है। इसे कुछ भी नाम दिया जा सकता है, जब तक इसमें अपेक्षित मान शामिल हैं। मैं नीचे दिए गए चरणों को स्पष्ट करने के लिए यहां "मेटाडाटा.जसन" का उपयोग कर रहा हूं।

  • प्रत्येक मेटाडेटा.जॉन फ़ाइल में केवल एक ही बॉक्स हो सकता है। इसके कई संस्करण हो सकते हैं, और प्रत्येक संस्करण में कई प्रदाता (वर्चुअलबॉक्स, vmware, libvirt) हो सकते हैं। यदि आपको एक से अधिक बॉक्स रखने की आवश्यकता है (कहते हैं, "फेडोरा" और "उबंटू") आपको दो अलग मेटाडेटा फ़ाइलों की आवश्यकता है।

  • वैग्रांत को मेटाडेटा.जेसन फ़ाइल की अपेक्षा है कि एक प्रकार का "एप्लिकेशन / जोंस" हो (जैसा कि निकोलस ने ऊपर उल्लेख किया है। यदि आपका वेबसर्वर इसे वापस नहीं करता है (या, "टेक्स्ट / प्लेन" लौटाता है), तो यह मान लेंगे कि यह एक वास्तविक बॉक्स फ़ाइल है। , और इसे पार्स करने का प्रयास करें (और बुरी तरह असफल रहें)।

  • हैशिकॉर्प के एटलस (जो वैग्रैंट क्लाउड हुआ करता था) इसका अपवाद है, क्योंकि रीडायरेक्ट आपको "टेक्स्ट / html" के रूप में दी गई सामग्री तक ले जाता है। इसके लिए मेरा सबसे अच्छा अनुमान है कि इसका रीडायरेक्ट के साथ कुछ करना है (नीचे इस पर अधिक)।

  • बॉक्स फ़ाइल को मेटाडेटा फ़ाइल के समान स्थान पर होने की आवश्यकता नहीं है। आपके पास अपनी मेटाडेटा फ़ाइल एक स्थानीय वेबसर्वर में हो सकती है, और अमेज़ॅन एस 3 में बॉक्स, इससे कोई समस्या नहीं है।

इसलिए, जहां तक ​​मुझे मिला, मुझे वेबसर्वर पर यह काम करने का सबसे आसान तरीका मिला और अभी भी बहुत सामान्य कार्यक्षमता है इसे करने के लिए:

अपनी वेबहोस्ट पर, इसके समान एक फ़ाइल और निर्देशिका संरचना बनाएँ:

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)

(इस लेआउट का अर्थ है कि 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" बॉक्स 1 डायरेक्टरी के लिए इंडेक्स फाइल है, इसलिए इसे सही से कंटेंट को रीडायरेक्ट करना चाहिए, योनि इसे उठाएगा, मेटाडेटा की व्याख्या करेगा और उपयुक्त बॉक्स डाउनलोड करेगा।


19

अपने प्रश्न को फिर से पढ़ने के बाद, ऐसा लगता है कि आप मुझसे कुछ अलग करने की कोशिश कर रहे हैं - लेकिन मुझे लगता है कि हमारा अंतिम लक्ष्य एक ही है।

मैं अपने बेस बॉक्स की मेजबानी के लिए वैग्रैंट क्लाउड सेवा का उपयोग नहीं करना चाहता, लेकिन मैं अपनी देव टीम को एक विकास वातावरण वितरित करने में सक्षम होना चाहता हूं, और metadata.jsonविकास पर्यावरण के लिए एक वर्जनिंग सिस्टम बनाए रखने के लिए फ़ाइल की सुविधाओं का उपयोग करना चाहता हूं , जो तब मेरी विकास टीम को केवल योनि में निर्मित सुविधाओं का उपयोग करके उपलब्ध होगा।

इस लेख (8/5/2014) के समय में इस क्षेत्र में आवधिक दस्तावेज वास्तव में विरल है, क्योंकि संभवतः यह एक अपेक्षाकृत नई विशेषता है, लेकिन मुझे यकीन है कि वैग्रैंटक्लाउड का भुगतान किया गया टियर इसके साथ कुछ करना है। ।

metadata.jsonफ़ाइल को संस्करण और वितरित करने के लिए फ़ाइल का उपयोग कैसे करें, यह जानने के लिए , मैंने VagrantCloud पर उपलब्ध कुछ VMs पर एक नज़र डाली। उन लोगों को देखने के बाद, और कुछ योनि कोड को पढ़ने के बाद - यह पता लगाना बहुत आसान हो गया कि मुझे अपना लक्ष्य कैसे पूरा करना है।

  • अपने बॉक्स को वैसा ही पैकेज करें जैसा आप सामान्य रूप से देते हैं। मेरे मामले में, मैं केवल वर्चुअल बॉक्स के लिए पैकेजिंग कर रहा हूं, क्योंकि हमारे डेवलपर्स Vm को चलाने के लिए उपयोग कर रहे हैं। मैं अपने बेसबॉक्स के साथ एक वैग्रांटफाइल भी पैकेज करता हूं जो विकास के माहौल के लिए कुछ प्रावधान करता है (उचित फ़ोल्डर में शेयर सेट करना, कुछ बुनियादी अपाचे कॉन्फ़िगर करना, त्रुटि लॉगिंग, आदि)
  • 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

वोइला, एक दूरस्थ रूप से होस्ट किया गया, साझा और संस्करणित, निजी बॉक्स जिसे वैग्रैंट क्लाउड के उपयोग की आवश्यकता नहीं है।

जैसे ही आप अपने बॉक्स के नए संस्करण बनाते हैं, आप इसे पैकेज करेंगे, और metadata.jsonफ़ाइल को संपादित करेंगे । जो मैं बता सकता हूं, उसमें से आप जो भी वर्जनिंग स्कीम चाहते हैं, उसका उपयोग सिमेंटिक वर्जनिंग (1.0.0, 1.0.1, आदि) कर सकते हैं या संस्करणों (1, 2, 3, आदि) के लिए बस पूरी सरल संख्या। जब आपका बॉक्स उपयोगकर्ता अपने vagrant upआप ही नए संस्करण के लिए आपकी मेटाडेटा.जॉन फ़ाइल की जाँच कर लेता है, और उन्हें vagrant box updateबॉक्स को अपडेट करने के लिए संकेत देगा ।

तुम भी छोड़ सकते हैं vagrant box add <metadata.json url>और vagrant initबॉक्स नाम और बॉक्स यूआरएल के साथ एक आधार Vagrantfile को परिभाषित है, तो तरह से बिट्स:

# -*- 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फ़ाइल होती है जिसे प्रलेखन के आसपास संदर्भित किया जाता है, जो आपकी JSON फ़ाइल के लिए URL रखती है जो आपके संस्करणों को परिभाषित करती है। Vagrant सब कुछ अपने आप संभालता है, इसलिए आपको vagrant box add <your metadata.json url>बस इतना करना है , फिर vagrant init <boxname> && vagrant up, बस बाकी है
जिम Rubenstein

मैं समझता हूं कि, लेकिन मैं डेवलपर्स के लिए जितना संभव हो उतना आसान बनाने की कोशिश कर रहा हूं। Vagrantfile में एक बॉक्स URL जोड़कर, कोई vagrant box addज़रूरत नहीं है। अगर मैं उस JSON फ़ाइल के URL को Vagrantfile में सेट कर सकता हूं, तो एक नए देव के लिए यह एक कम कदम है कि वह टीम में शामिल हो जाए। यह बॉक्स के लिए काम करता है, लेकिन मैं यह पता नहीं लगा सकता कि यह JSON फाइल के लिए काम क्यों नहीं करता है।
ब्रैड

1
आह, गच्चा - मुझे वास्तव में बस हल करने से ही पता चल गया। आपको परिभाषित करना है config.vm.boxऔर आपका बॉक्स नाम config.vm.box_urlकहां boxहै, और box_urlआपकी जसन फाइल का URL है।
जिम रुबेंस्टीन

1
@JimRubenstein शानदार जवाब - गोल्डीलॉक्स की तरह, न बहुत छोटा, न बहुत लंबा :)
स्टीव जाॅनसन

9

वैग्रांट के लिए आवश्यक है कि बॉक्स मेटाडेटा URL को application/jsonसामग्री प्रकार के साथ परोसा जाए । आपको जो त्रुटि मिल रही है वह इंगित करती है कि योनि ने आपके URL की नियमित बॉक्स के रूप में व्याख्या की है।

सुनिश्चित करें कि आपका HTTP सर्वर Content-Typeहेडर को उचित रूप से सेट कर रहा है। यदि आपकी फ़ाइल में एक्सटेंशन है तो अधिकांश HTTP सर्वर Content-Type हेडर को स्वतः सेट कर देगाapplication/json.json


1
मुझे नहीं पता कि आपका जवाब क्यों नहीं है क्योंकि यह वही है जो मुझे वैग्रंट के साथ स्थानीय प्रावधान काम करने के लिए करना था।
गौरव

4

मुझे लगता है कि आपको उनके निर्देश मिले हैं।

निम्नलिखित योनि वेबसाइट से लिया गया है:


डिब्बे जैसी फ़ाइल

वास्तविक बॉक्स फ़ाइल वैग्रंट के लिए आवश्यक भाग है। यह अनुशंसा की जाती है कि आप हमेशा एक बॉक्स फ़ाइल के साथ एक मेटाडेटा फ़ाइल का उपयोग करें, लेकिन प्रत्यक्ष बॉक्स फ़ाइलें वैग्रांत में विरासत के कारणों के लिए समर्थित हैं।

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। उदाहरण के लिए, यदि आपका बॉक्स वर्चुअलबॉक्स के लिए था, तो मेटाडेटा.जॉन इस तरह दिखेगा:

{
  "प्रदाता": "वर्चुअलबॉक्स"
}

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 पथ (विंडोज़ में) है ..User \ username \ vagrant.d \ बक्से \ boxname \ 0 \ virtualbox \ metadata.json
Nebojsac

1

आप https://github.com/sparkoo/boxitory पर कोशिश कर सकते हैं । यह सरल एक जार सर्वर है। आप इसे उस निर्देशिका की ओर इंगित करते हैं, जहाँ आपके पास अपने आवारा बक्से हैं और यह योनि के लिए संगत http इंटरफ़ेस बनाता है। फिर आप बस इसे अपने व्रान्टाइल से इंगित करें और आपका काम हो गया। आपको मैन्युअल रूप से अपने बक्से का वर्णन करने वाली जसन फ़ाइलों को संभालना नहीं है, नए संस्करणों, प्रदाताओं आदि को जोड़ना है, यह सब आपके लिए मुफ्त में किया गया है। बस नई बॉक्स फ़ाइल जोड़ें और बॉक्सरी अनुरोध किए जाने पर तुरंत इसे वापस कर देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.