URL hộp Vagrant cho tệp siêu dữ liệu JSON


18

Trong Vagrantfile của tôi, tôi có thể chỉ định URL của hộp:

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

Theo tài liệu gần đây hơn , tôi sẽ có thể tạo tệp JSON chứa URL cho các phiên bản khác nhau của hộp. Tài liệu cũng nói rằng tôi có thể sử dụng URL của tệp JSON này khi chạy vagrant box add. Tôi đã hy vọng có thể sử dụng URL của tệp JSON đó cho config.vm.box_url. Tuy nhiên, điều đó dường như không hoạt động. Khi tôi thử nó, nó coi nó như một tệp hộp:

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.

Có thể bảo Vagrant sử dụng tệp JSON siêu dữ liệu hộp trong Vagrantfile của tôi không? Tôi không muốn phải sử dụng Vagrant Cloud.


Bạn đã bao giờ tìm thấy một giải pháp cho điều này?
Jim Rubenstein

@JimRubenstein Thật không may, không. Đề xuất từ ​​Nicholas có thể hoạt động nhưng tôi khá chắc chắn rằng máy chủ của tôi đã gửi các tiêu đề loại nội dung chính xác cho JSON. Câu trả lời từ Chux có thể chính xác, nhưng tôi chưa bị thuyết phục vì tài liệu này ngụ ý khác. Thật không may, tài liệu của Vagrant khá khủng khiếp xung quanh và không đưa ra nhiều bối cảnh giữa các cấp độ hướng dẫn cơ bản và đóng góp cho dự án và hang-out-on-irc .... ít nhất là đối với tôi.
Brad

Tôi đang thử nghiệm một cái gì đó khi chúng tôi nói về việc xuất bản một hộp + siêu dữ liệu để xem liệu tôi có thể mô phỏng hành vi của đám mây mơ hồ, cục bộ không. Tôi sẽ cho bạn biết làm thế nào nó bật ra.
Jim Rubenstein

Câu trả lời:


8

Kể từ hôm nay (2016-07-12, vagrant 1.8.4), nếu bạn muốn chạy danh mục của riêng mình theo cách thủ công (nghĩa là cập nhật thủ công các hộp và chỉnh sửa tệp metadata.json), nhưng vẫn xử lý nó Giống như một danh mục thực tế, hãy ghi nhớ những điều sau đây:

  • Không cần phải đặt tên tệp là "metadata.json". Nó có thể được đặt tên bất cứ điều gì, miễn là nó chứa các giá trị mong đợi. Tôi đang sử dụng "metadata.json" tại đây để làm rõ các bước tiếp theo bên dưới.

  • mỗi tệp metadata.json chỉ có thể chứa một hộp duy nhất. Nó có thể có nhiều phiên bản và mỗi phiên bản có thể có nhiều nhà cung cấp (virtualbox, vmware, libvirt). Nếu bạn cần có nhiều hơn một hộp (giả sử "fedora" và "ubfox"), bạn cần hai tệp siêu dữ liệu khác nhau.

  • Vagrant hy vọng tệp metadata.json có loại "application / json" (như Nicholas Hinds đã đề cập ở trên. Nếu máy chủ web của bạn không trả lại (hoặc, trả về "text / plain"), vagrant sẽ cho rằng đó là tệp hộp thực tế và cố gắng phân tích nó (và thất bại thảm hại).

  • Atlas của Hashicorp (trước đây là Vagrant Cloud) là ngoại lệ cho điều này, vì các chuyển hướng dẫn bạn đến nội dung được phân phát dưới dạng "văn bản / html". Dự đoán tốt nhất của tôi cho điều này là nó có liên quan đến các chuyển hướng (nhiều hơn về điều này dưới đây).

  • Tệp hộp không cần phải ở cùng một nơi với tệp siêu dữ liệu. Bạn có thể có tệp siêu dữ liệu của mình trong máy chủ web cục bộ và hộp trong Amazon S3, không có vấn đề gì với điều đó.

Vì vậy, theo như tôi nhận được, tôi đã tìm ra cách dễ nhất để làm việc này trên máy chủ web và vẫn có chức năng khá bình thường là làm điều này:

Trên webhost của bạn, tạo một cấu trúc tệp và thư mục tương tự như sau:

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)

(bố cục này có nghĩa là "metadata.json" của bạn cho box1 sẽ phải có các URL trỏ đến một cái gì đó như " http: // yourhost / box / yourname / box1 / box1- $ version1- $ Carrier.box ")

Trên .htaccess của bạn, đảm bảo rằng "metadata.json" được đặt cho chỉ mục Thư mục. Phần còn lại là tùy chọn, cho bộ đệm âm và ẩn nội dung thực tế:

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"

Trên môi trường của bạn, xuất VAGRANT_SERVER_URL trỏ đến webhost của bạn. Lưu ý không có dấu gạch chéo!

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

Với vị trí này (và tất cả các tệp có nội dung chính xác), bạn có thể đi và thêm hộp của mình trực tiếp:

vagrant box add yourname/box1

Vì "metadata.json" là tệp chỉ mục cho thư mục box1, nên nó sẽ chuyển hướng nội dung ngay đến nó, vagrant sẽ chọn nó, giải thích siêu dữ liệu và tải xuống hộp thích hợp.


19

Sau khi đọc lại câu hỏi của bạn, có vẻ như bạn đang cố gắng làm điều gì đó khác một chút so với tôi - nhưng tôi nghĩ mục tiêu cuối cùng của chúng tôi là như nhau.

Tôi không muốn sử dụng dịch vụ Vagrant Cloud để lưu trữ các hộp cơ sở của mình, nhưng tôi muốn có thể phân phối môi trường phát triển cho nhóm nhà phát triển của mình và sử dụng các tính năng của metadata.jsontệp để duy trì hệ thống phiên bản cho môi trường phát triển, mà sau đó sẽ có sẵn cho nhóm phát triển của tôi chỉ bằng cách sử dụng các tiện ích được tích hợp sẵn.

Tài liệu mơ hồ thực sự thưa thớt ở khu vực này tại thời điểm viết bài này (8/5/2014), có lẽ vì đó là một tính năng tương đối mới nhưng tôi chắc chắn rằng VagrantCloud có một tầng trả phí cũng có liên quan đến nó .

Để tìm ra cách sử dụng metadata.jsontệp cho phiên bản và phân phối các hộp, tôi đã xem xét một số máy ảo có sẵn trên VagrantCloud. Sau khi xem qua những thứ đó, và đọc một số mã mơ hồ - nó trở nên khá dễ dàng để tìm ra cách thực hiện mục tiêu của tôi.

  • Đóng gói hộp của bạn như bình thường. Trong trường hợp của tôi, tôi chỉ đóng gói cho hộp ảo, vì đó là những gì các nhà phát triển của chúng tôi sẽ sử dụng để chạy Vm. Tôi cũng gói Vagrantfile với basebox của mình để cung cấp một số điều khoản cho môi trường phát triển (thiết lập chia sẻ cho các thư mục phù hợp, một số cấu hình apache cơ bản, ghi nhật ký lỗi, v.v.)
  • Tạo một metadata.jsontệp để mô tả hộp cơ sở của bạn, của tôi trông giống như thế này:

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

Khi tôi tạo metadata.jsontệp của mình , tôi đã tải nó lên một máy chủ cục bộ đang chạy trên mạng nội bộ của chúng tôi ( vagrant.domain.local/metadata.json). Khi tôi đã làm điều đó, tất cả những gì còn lại là để kiểm tra nó một cách mơ hồ:

# 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, một hộp riêng được lưu trữ, chia sẻ và phiên bản từ xa, không yêu cầu sử dụng Đám mây Vagrant.

Khi bạn tạo các phiên bản mới của hộp, bạn sẽ đóng gói và chỉnh sửa metadata.jsontệp. Từ những gì tôi có thể nói, bạn có thể sử dụng bất kỳ lược đồ phiên bản nào bạn muốn, đó là phiên bản ngữ nghĩa (1.0.0, 1.0.1, v.v.) hoặc chỉ là các số nguyên đơn giản cho các phiên bản (1, 2, 3, v.v.). Khi người dùng hộp của bạn vagrant uptự động kiểm tra tệp metadata.json của bạn để biết phiên bản mới và sẽ nhắc họ làm gì vagrant box updateđể cập nhật hộp.

Bạn cũng có thể bỏ qua các bit vagrant box add <metadata.json url>vagrant initbit bằng cách xác định Vagrantfile cơ sở với tên hộp và url hộp, như vậy:

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

Bạn có thể phân phối Vagrantfile với những nội dung đó và tất cả người dùng sẽ có thể vagrant up. Mặc dù vậy, tôi không chắc về cách thức hoạt động khi các phiên bản được cập nhật.


Thật hoàn hảo, cảm ơn! Tuy nhiên ... làm cách nào để thêm URL JSON đó vào Vagrantfile?
Brad

Bạn không cần. Khi bạn thêm hộp Vagrant tải xuống hình ảnh hộp hiện tại và lưu thông tin vào ~/.vagrant.d/boxes/<your box name>. Trong thư mục đó có metadata_urltệp được tham chiếu xung quanh tài liệu, chứa URL cho tệp JSON xác định các phiên bản của bạn. Vagrant xử lý tất cả những thứ đó một cách tự động, vì vậy tất cả những gì bạn phải làm là vagrant box add <your metadata.json url>, sau đó vagrant init <boxname> && vagrant up, chỉ là , Vagrant làm phần còn lại
Jim Rubenstein

Tôi hiểu điều đó, nhưng tôi đang cố gắng làm cho các nhà phát triển dễ dàng nhất có thể để bắt đầu và chạy. Bằng cách thêm URL hộp trong Vagrantfile, không vagrant box addcần thiết. Nếu tôi có thể đặt URL của tệp JSON đó trong Vagrantfile, thì đó là một bước ít hơn cho một nhà phát triển mới chỉ cần tham gia nhóm để bắt đầu và chạy. Nó hoạt động cho các hộp, nhưng tôi không thể hiểu tại sao nó không hoạt động cho tệp JSON.
Brad

1
ah, gotcha - tôi thực sự chỉ tìm thấy một giải pháp cho điều đó bằng cách xì hơi xung quanh. bạn phải xác định config.vm.boxVÀ tên hộp của bạn config.vm.box_urlở đâu boxbox_urllà URL của tệp json.
Jim Rubenstein

1
@JimRubenstein Câu trả lời tuyệt vời - giống như Goldilocks, không quá ngắn, không quá dài :)
Steve Jansen

9

Vagrant yêu cầu các URL siêu dữ liệu hộp được cung cấp cùng với application/jsonloại nội dung. Lỗi bạn nhận được chỉ ra rằng vagrant đã hiểu URL của bạn như một hộp thông thường.

Đảm bảo máy chủ HTTP của bạn đang đặt Content-Typetiêu đề phù hợp. Hầu hết các máy chủ HTTP sẽ tự động đặt Content-Type tiêu đề thành application/jsonnếu tệp của bạn có phần mở rộng.json


1
Tôi không biết tại sao câu trả lời của bạn không phải là câu trả lời vì đây chính xác là những gì tôi cần làm để khiến việc cung cấp địa phương hoạt động với Vagrant.
Gaurav

4

Tôi nghĩ rằng bạn đã có chỉ thị của họ trộn lẫn ..

Sau đây được lấy từ trang web vagrant:


HỘP

Tệp hộp thực tế là phần bắt buộc cho Vagrant. Bạn nên luôn luôn sử dụng tệp siêu dữ liệu cùng với tệp hộp, nhưng tệp hộp trực tiếp được hỗ trợ vì lý do cũ trong 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. Lõi Vagrant chỉ giải nén các hộp để sử dụng sau.

Within the archive, Vagrant does expect a single file: "metadata.json".Đây là một tệp JSON hoàn toàn không liên quan đến thành phần "siêu dữ liệu hộp" ở trên. This file must contain at least the "provider" key with the provider the box is for. Ví dụ: nếu hộp của bạn là VirtualBox, metadata.json sẽ trông như thế này:

{
  "nhà cung cấp": "hộp ảo"
}

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.


Vì vậy, tôi nghĩ định dạng tệp hộp của bạn có thể sai. Nó không được nén với định dạng được đề xuất hoặc bạn chưa bao gồm tệp metadata.json trong kho lưu trữ


Đối với những người khác có cùng vấn đề, đường dẫn metadata.json (trong windows) là ..Users \ username \ vagrant.d \ box \ boxname \ 0 \ virtualbox \ metadata.json
Nebojsac

1

Bạn có thể thử https://github.com/sparkoo/boxective . Đó là một máy chủ jar đơn giản. Bạn trỏ nó vào thư mục nơi bạn có các hộp vagrant và nó tạo giao diện http tương thích cho vagrant. Sau đó, bạn chỉ cần chỉ nó từ vagrantfile của bạn và bạn đã hoàn tất. Bạn không phải xử lý thủ công các tệp json mô tả các hộp của mình, thêm phiên bản mới, nhà cung cấp, v.v ... Tất cả đều được thực hiện miễn phí cho bạn. Chỉ cần thêm tệp hộp mới và Boxective trả lại ngay lập tức khi được yêu cầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.