JSON 메타 데이터 파일을위한 방랑 상자 URL


17

Vagrantfile에서 상자의 URL을 지정할 수 있습니다.

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

최신 문서 에 따르면 상자의 다른 버전에 대한 URL이 포함 된 JSON 파일을 만들 수 있어야합니다. 이 문서는 또한 실행할 때이 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.

Vagrant가 Vagrantfile에서 상자 메타 데이터 JSON 파일을 사용하도록 지시 할 수 있습니까? Vagrant Cloud를 사용할 필요는 없습니다.


이것에 대한 해결책을 찾은 적이 있습니까?
Jim Rubenstein

@JimRubenstein 불행히도, 아니. Nicholas의 제안은 효과가 있지만 서버가 이미 JSON의 올바른 콘텐츠 유형 헤더를 보내고 있다고 확신합니다. Chux의 답변은 정확할 수 있지만 설명서에서 달리 암시하는 것처럼 아직 확신하지 않습니다. 불행히도, Vagrant의 문서는 모든 것이 끔찍하며 기본 어휘와 프로젝트에 기여하는 것과 어학에 영향을 미치는 수준 사이에 많은 맥락을 제공하지 않습니다.
Brad

상자 + 메타 데이터를 게시 할 때 로컬에서 방랑자 클라우드의 동작을 모방 할 수 있는지 확인하기 위해 무언가를 테스트하고 있습니다. 어떻게되는지 알려 드리겠습니다.
Jim Rubenstein

답변:


7

오늘 (2016-07-12, vagrant 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"을 반환하는 경우) vagrant는 실제 상자 파일이라고 가정합니다. , 그것을 파싱하려고합니다 (그리고 비참하게 실패합니다).

  • 리디렉션으로 인해 "text / html"로 제공되는 콘텐츠로 연결되므로 Hashicorp의 Atlas (Vagrant Cloud)는 예외입니다. 이것에 대한 가장 좋은 추측은 리디렉션과 관련이 있다는 것입니다 (아래에 더 자세히 설명되어 있음).

  • 상자 파일은 메타 데이터 파일과 같은 위치에있을 필요는 없습니다. 메타 데이터 파일을 로컬 웹 서버에, 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)

(이 레이아웃은 box1에 대한 "metadata.json"에 " http : // yourhost / boxes / yourname / box1 / box1- $ version1- $ provider.box" 와 같은 URL을 표시해야 함을 의미합니다 .

.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파일 기능을 사용 하여 개발 환경의 버전 관리 시스템을 유지하고 싶습니다 . 그런 다음 방랑자에 내장 된 시설을 사용하여 개발 팀에서 사용할 수있게됩니다.

이 글을 쓰는 시점 (2014 년 5 월 5 일) 당시에는이 영역에서 방랑 한 문서가 드문 편이지만 아마도 새로운 기능이기 때문에 VagrantCloud에 유료 계층이 있다는 사실도 확신합니다. .

metadata.json파일 을 사용하여 상자를 버전 화하고 배포 하는 방법을 알아보기 위해 VagrantCloud에서 사용 가능한 일부 VM을 살펴 보았습니다. 그것들을 살펴보고 방랑자 코드를 읽은 후-내 목표를 달성하는 방법을 알아내는 것이 매우 쉬워졌습니다.

  • 평소대로 상자를 포장하십시오. 필자의 경우 개발자가 Vm을 실행하는 데 사용하기 때문에 가상 상자 전용 패키징입니다. 또한 개발 환경에 대한 일부 프로비저닝 (적절한 폴더에 대한 공유 설정, 일부 기본 아파치 구성, 오류 로깅 등)을 수행하는베이스 박스로 Vagrantfile을 패키지합니다.
  • 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파일을 편집 합니다. 내가 알 수 있듯이 시맨틱 버전 관리 (1.0.0, 1.0.1 등) 또는 버전 (1, 2, 3 등)에 대한 간단한 정수로 원하는 버전 관리 체계를 사용할 수 있습니다. 박스 사용자가 vagrant upvagrant가 자동으로 metadata.json 파일에서 새 버전을 확인 vagrant box update하면 박스를 업데이트 하라는 메시지가 표시 됩니다.

상자 이름과 상자 URL을 사용하여 기본 Vagrantfile을 정의하여 비트 vagrant box add <metadata.json url>vagrant init비트를 건너 뛸 수도 있습니다 .

# -*- 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에 어떻게 추가합니까?
Brad

필요하지 않습니다. 상자를 추가하면 Vagrant는 현재 상자 이미지를 다운로드하고 정보를에 저장합니다 ~/.vagrant.d/boxes/<your box name>. 해당 폴더 안에는 metadata_url문서 주위에서 참조 되는 파일이 있으며, 여기에는 버전을 정의하는 JSON 파일의 URL이 있습니다. 방랑은 그래서 당신이해야 할 모든이, 그 자동으로 모든 처리 vagrant box add <your metadata.json url>, 그럼 그냥 vagrant init <boxname> && vagrant up, 방랑 나머지는 않습니다
짐 루벤스 타인

이해하지만 개발자가 가능한 한 쉽게 시작할 수 있도록 노력하고 있습니다. Vagrantfile에 상자 URL을 추가하면 vagrant box add필요 하지 않습니다. Vagrantfile에서 해당 JSON 파일의 URL을 설정할 수 있다면 새로운 개발자가 팀에 합류하여 시작하는 단계입니다. 박스에서는 작동하지만 JSON 파일에서는 왜 작동하지 않는지 알 수 없습니다.
Brad

1
아, 잡았다-방금 방금 방황하여 그 해결책을 찾았습니다. 당신은 정의해야 config.vm.boxconfig.vm.box_url위치를 box사용자 상자 이름이며, box_url당신의 JSON 파일에 대한 URL입니다.
Jim Rubenstein

1
@JimRubenstein 환상적인 답변-Goldilocks처럼 짧지 않고 너무 길지 않습니다 :)
Steve Jansen

9

Vagrant는 상자 메타 데이터 URL이 application/json컨텐츠 유형 과 함께 제공되어야합니다 . 오류가 발생하면 방랑자가 URL을 일반 상자로 해석했음을 나타냅니다.

HTTP 서버가 Content-Type헤더를 적절하게 설정하고 있는지 확인하십시오 . 파일 확장명이 있으면 대부분의 HTTP 서버는 자동으로 Content-Type 헤더를 설정합니다application/json.json


1
이것이 Vagrant와 로컬 프로비저닝 작업을 수행하기 위해 정확히 수행해야했기 때문에 귀하의 답변이 왜 대답이 아닌지 모르겠습니다.
Gaurav

4

나는 당신이 그들의 지시 사항을 혼동했다고 생각합니다 ..

다음은 방랑 웹 사이트에서 가져온 것입니다.


상자 파일

실제 박스 파일은 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. 방랑자 코어 자체는 나중에 사용할 수 있도록 상자를 개봉합니다.

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. 예를 들어 상자가 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)는 ..Users \ username \ vagrant.d \ boxes \ boxname \ 0 \ virtualbox \ metadata.json
Nebojsac

1

https://github.com/sparkoo/boxitory 를 시도 할 수 있습니다 . 간단한 하나의 jar 서버입니다. 당신은 당신의 vagrant 박스가있는 디렉토리를 가리키고 vagrant에 대한 호환되는 http 인터페이스를 만듭니다. 그런 다음 단순히 당신의 방랑 파일에서 지적하면 끝납니다. 상자를 설명하고 새 버전, 공급자 등을 추가하는 json 파일을 수동으로 처리하지 않아도됩니다. 모두 무료로 처리됩니다. 새 상자 파일을 추가하기 만하면 요청시 Boxitory가 즉시 파일을 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.