URL ช่อง Vagrant สำหรับไฟล์ข้อมูลเมตา 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 ใช้ไฟล์ metadata JSON ในไฟล์ Vagrantfile ของฉัน ฉันไม่ต้องการใช้ Vagrant Cloud


คุณเคยพบทางออกสำหรับสิ่งนี้หรือไม่?
Jim Rubenstein

@JimRubenstein น่าเสียดายที่ไม่มี คำแนะนำจาก Nicholas อาจใช้งานได้ แต่ฉันค่อนข้างแน่ใจว่าเซิร์ฟเวอร์ของฉันกำลังส่งส่วนหัวประเภทเนื้อหาที่ถูกต้องสำหรับ JSON คำตอบจาก Chux อาจแม่นยำ แต่ฉันยังไม่มั่นใจเนื่องจากเอกสารมีความหมายเป็นอย่างอื่น น่าเสียดายที่เอกสารของ Vagrant นั้นค่อนข้างแย่มาก ๆ และไม่ได้ให้บริบทอะไรมากมายระหว่างการสอนพื้นฐานและการมีส่วนร่วมในการทำโปรเจ็กต์และการแฮงเอาท์ในระดับต่างๆ ... อย่างน้อยสำหรับฉัน
แบรด

ฉันกำลังทดสอบบางอย่างในขณะที่เราพูดถึงการเผยแพร่กล่อง + ข้อมูลเมตาเพื่อดูว่าฉันสามารถเลียนแบบพฤติกรรมของคลาวด์คนจรจัดในพื้นที่หรือไม่ ฉันจะให้คุณรู้ว่ามันจะเปิดออก
Jim Rubenstein

คำตอบ:


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" (ตามที่ Nicholas Hinds ได้กล่าวไว้ข้างต้นหากเว็บเซิร์ฟเวอร์ของคุณไม่ส่งคืน (หรือส่งคืน "text / plain") คนจรจัดจะถือว่าเป็นไฟล์กล่องจริง และลองแยกวิเคราะห์มัน (และล้มเหลวอย่างน่าสังเวช)

  • Atlas ของ Hashicorp (สิ่งที่เคยเป็น Vagrant Cloud) เป็นข้อยกเว้นสำหรับสิ่งนี้เนื่องจากการเปลี่ยนเส้นทางนำคุณไปสู่เนื้อหาที่ทำหน้าที่เป็น "text / 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 / boxes / 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/2557) น่าจะเป็นเพราะมันเป็นคุณสมบัติที่ค่อนข้างใหม่ แต่ฉันมั่นใจว่าข้อเท็จจริงที่ว่า VagrantCloud มีระดับที่ต้องชำระเงินมีบางสิ่งที่เกี่ยวข้องกับเรื่องนี้ด้วย .

เพื่อหาวิธีใช้metadata.jsonไฟล์เป็นเวอร์ชันและแจกจ่ายกล่องฉันดูที่ VMs บางส่วนที่มีอยู่ใน VagrantCloud หลังจากดูสิ่งเหล่านั้นและอ่านรหัสคนจรจัด - มันค่อนข้างง่ายที่จะคิดออกว่าจะบรรลุเป้าหมายของฉันได้อย่างไร

  • ทำกล่องของคุณตามปกติ ในกรณีของฉันฉันบรรจุเฉพาะกล่องเสมือนเพราะนั่นคือสิ่งที่นักพัฒนาของเราจะใช้ในการเรียกใช้ Vm ฉันยังแพ็คเกจ Vagrantfile ด้วย basebox ของฉันซึ่งทำการตั้งค่าบางอย่างสำหรับสภาพแวดล้อมการพัฒนา (การตั้งค่าการแชร์ไปยังโฟลเดอร์ที่เหมาะสมการตั้งค่า 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ไฟล์ จากสิ่งที่ฉันสามารถบอกได้คุณสามารถใช้ชุดรูปแบบการกำหนดรุ่นใดก็ได้ที่คุณต้องการไม่ว่าจะเป็นการกำหนดเวอร์ชันแบบ semantic (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ที่มีเนื้อหาเหล่านั้นและผู้ใช้ทุกคนก็จะสามารถที่จะ แม้ว่าฉันไม่แน่ใจเกี่ยวกับวิธีการทำงานเมื่อมีการปรับปรุงรุ่น


สมบูรณ์แบบขอบคุณมาก! อย่างไรก็ตาม ... ฉันจะเพิ่ม JSON URL นั้นใน Vagrantfile ได้อย่างไร
แบรด

คุณไม่จำเป็นต้อง เมื่อคุณเพิ่มกล่อง Vagrant จะดาวน์โหลดอิมเมจกล่องปัจจุบันและเก็บข้อมูล~/.vagrant.d/boxes/<your box name>ไว้ ภายในโฟลเดอร์นั้นมีmetadata_urlไฟล์ที่ถูกอ้างอิงรอบเอกสารซึ่งเก็บ URL สำหรับไฟล์ JSON ของคุณที่กำหนดเวอร์ชันของคุณ คนจรจัดจัดการทุกสิ่งโดยอัตโนมัติดังนั้นสิ่งที่คุณต้องทำคือvagrant box add <your metadata.json url>แค่vagrant init <boxname> && vagrant upคนจรจัดก็ทำสิ่งที่เหลืออยู่
Jim Rubenstein

ฉันเข้าใจว่า แต่ฉันพยายามทำให้ง่ายที่สุดเท่าที่จะเป็นไปได้สำหรับนักพัฒนาที่จะเริ่มต้นใช้งาน โดยการเพิ่ม URL ของกล่องใน Vagrantfile ไม่vagrant box addจำเป็น หากฉันสามารถตั้งค่า URL ของไฟล์ JSON นั้นใน Vagrantfile นั่นเป็นขั้นตอนที่น้อยกว่าสำหรับผู้พัฒนารายใหม่เพียงแค่เข้าร่วมทีมเพื่อเริ่มต้นใช้งาน มันใช้งานได้กับกล่อง แต่ฉันไม่สามารถเข้าใจได้ว่าทำไมมันไม่ทำงานกับไฟล์ JSON
แบรด

1
อ้า gotcha - ฉันเพิ่งพบวิธีแก้ปัญหาโดยเพียงแค่ตดไปรอบ ๆ คุณต้องกำหนดconfig.vm.boxและconfig.vm.box_urlที่ไหนboxชื่อกล่องของคุณและbox_urlเป็น URL ไปยังไฟล์ json ของคุณ
Jim Rubenstein

1
คำตอบ @JimRubenstein Fantastic - เช่นเดียวกับ Goldilocks ไม่สั้นเกินไปไม่ยาวเกินไป :)
สตีฟ Jansen

9

Vagrant ต้องการให้ URL เมตะดาต้าบ็อกซ์แสดงขึ้นพร้อมกับapplication/jsonประเภทเนื้อหา ข้อผิดพลาดที่คุณได้รับบ่งชี้ว่าคนจรจัดตีความ URL ของคุณเป็นช่องปกติ

ตรวจสอบว่าเซิร์ฟเวอร์ HTTP ของคุณตั้งค่าContent-Typeส่วนหัวอย่างเหมาะสม เซิร์ฟเวอร์ HTTP ส่วนใหญ่จะตั้งค่าContent-Type ส่วนหัวโดยอัตโนมัติapplication/jsonหากไฟล์ของคุณมีนามสกุล.json


1
ฉันไม่รู้ว่าทำไมคำตอบของคุณไม่ใช่คำตอบเพราะนี่คือสิ่งที่ฉันต้องทำเพื่อให้การจัดเตรียมในพื้นที่ทำงานกับ Vagrant
Gaurav

4

ฉันคิดว่าคุณมีคำสั่งผสมกัน ..

สิ่งต่อไปนี้นำมาจากเว็บไซต์คนจรจัด:


กล่องไฟล์

ไฟล์ box จริงเป็นส่วนที่จำเป็นสำหรับ 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. แกน Vagrant นั้นจะแกะกล่องออกมาเพื่อใช้ในภายหลังเท่านั้น

Within the archive, Vagrant does expect a single file: "metadata.json".นี่เป็นไฟล์ JSON ที่ไม่เกี่ยวข้องกับส่วนประกอบ "box metadata" ด้านบนทั้งหมด This file must contain at least the "provider" key with the provider the box is for. ตัวอย่างเช่นหากกล่องของคุณมีไว้สำหรับ VirtualBox metadata.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.


ดังนั้นฉันคิดว่ารูปแบบไฟล์กล่องของคุณอาจผิด ไม่ได้ถูกบีบอัดด้วยรูปแบบที่แนะนำหรือคุณไม่ได้รวมไฟล์ metadata.json ภายในไฟล์เก็บถาวร


สำหรับผู้อื่นที่มีปัญหาเดียวกันพา ธ metadata.json (ใน windows) คือ .. ผู้ใช้ \ ชื่อผู้ใช้ \ vagrant.d \ boxes \ boxname \ 0 \ virtualbox \ metadata.json
Nebojsac

1

คุณสามารถลองhttps://github.com/sparkoo/boxitory มันเป็นเซิร์ฟเวอร์ jar ง่าย ๆ คุณชี้ไปที่ไดเรกทอรีที่คุณมีกล่องคนจรจัดของคุณและมันจะสร้างอินเตอร์เฟซที่เข้ากันได้ http สำหรับคนจรจัด จากนั้นคุณเพียงแค่ชี้จากไฟล์ vagrant ของคุณและคุณทำเสร็จแล้ว คุณไม่ต้องจัดการไฟล์ json ที่อธิบายถึงกล่องของคุณด้วยตนเองเพิ่มเวอร์ชันใหม่ผู้ให้บริการและอื่น ๆ ทั้งหมดนี้ทำเพื่อคุณฟรี เพียงเพิ่มไฟล์ box ใหม่และ Boxitory จะส่งคืนทันทีเมื่อมีการร้องขอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.