JSONメタデータファイルのVagrantボックスURL


18

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.

VagrantfileでボックスメタデータJSONファイルを使用するようにVagrantに指示することは可能ですか?Vagrant Cloudを使用する必要はありません。


これに対する解決策を見つけましたか?
ジムルーベンスタイン

@JimRubenstein残念ながら、いいえ。Nicholasからの提案は機能する可能性がありますが、サーバーが既にJSONの正しいコンテンツタイプヘッダーを送信していると確信しています。Chuxからの答えは正確かもしれませんが、ドキュメントがそうでないことを暗示しているので、私はまだ確信していません。残念なことに、Vagrantのドキュメントはいたるところで非常にひどく、基本的なチュートリアルレベルとプロジェクトへの貢献レベル、ircにハングアウトレベルの間のコンテキストをあまり提供していません。
ブラッド14

ボックス+メタデータの公開について話しているときに何かをテストして、ローカルでvagrantクラウドの動作を模倣できるかどうかを確認しています。どうなるか教えてあげましょう。
ジムルーベンスタイン14

回答:


8

本日(2016-07-12、vagrant 1.8.4)で、手動で(つまり、ボックスを手動で更新し、metadata.jsonファイルを編集して)独自のカタログを実行したいが、それでも動作させる場合実際のカタログのように、次のことに注意してください。

  • ファイルに「metadata.json」という名前を付ける必要はありません。期待される値が含まれている限り、任意の名前を付けることができます。ここで「metadata.json」を使用して、以下の手順を明確にします。

  • 各metadata.jsonファイルには、1つのボックスのみを含めることができます。複数のバージョンを持つことができ、各バージョンは複数のプロバイダー(virtualbox、vmware、libvirt)を持つことができます。複数のボックス(「fedora」と「ubuntu」など)が必要な場合は、2つの異なるメタデータファイルが必要です。

  • Vagrantは、metadata.jsonファイルのタイプが「application / json」(上記のNicholas Hindsのようになります。Webサーバーがそれを返さない(または「text / plain」を返す)場合、vagrantはそれが実際のボックスファイルであると想定します、それを解析してみてください(そして惨めに失敗します)。

  • HashicorpのAtlas(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)

(このレイアウトは、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"

ご使用の環境で、Webホストを指すVAGRANT_SERVER_URLをエクスポートします。末尾のスラッシュに注意してください!

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

これを配置すると(および正しい内容のすべてのファイル)、ボックスを直接追加できます:

vagrant box add yourname/box1

"metadata.json"はbox1ディレクトリのインデックスファイルであるため、コンテンツを直接リダイレクトする必要があり、vagrantはそれを取得し、メタデータを解釈して適切なボックスをダウンロードします。


19

もう一度質問を読んだ後、あなたは私とは少し違うことをしようとしているようです-しかし、私たちの最終目標は同じだと思います。

ベースボックスをホストするためにVagrant Cloudサービスを利用したくありませんが、開発環境を開発チームに配布し、metadata.jsonファイルの機能を利用して開発環境のバージョン管理システムを維持できるようにしたい、その後、Vagrantに組み込まれた機能を使用するだけで、開発チームが利用できるようになります。

この記事の執筆時点(2014年8月5日)で、この分野ではVagrantのドキュメントは非常にまばらです。これはおそらく比較的新しい機能であるためですが、VagrantCloudに有料の階層があるという事実は、それと関係があると確信しています。

metadata.jsonファイルを使用してボックスをバージョニングおよび配布する方法を理解するために、VagrantCloudで利用可能ないくつかのVMを調べました。それらに目を通し、浮浪者コードのいくつかを読んだ後-私の目標を達成する方法を見つけることはかなり簡単になりました。

  • 通常どおりに箱を梱包します。私の場合、私たちの開発者がVmを実行するために使用するものであるため、私は仮想ボックスのみをパッケージ化しています。また、開発環境のプロビジョニング(適切なフォルダーへの共有のセットアップ、いくつかの基本的なApache構成、エラーロギングなど)を行う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に追加するにはどうすればよいですか?
ブラッド14

する必要はありません。ボックスを追加すると、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不要です。そのJSONファイルのURLをVagrantfileに設定できれば、チームに参加して新しいDevを立ち上げて実行するための手順が1つ少なくなります。それはボックスで動作しますが、JSONファイルで動作しない理由がわかりません。
ブラッド14

1
ああ、私は実際にちょうどおならをすることでそれに対する解決策を見つけました。config.vm.boxAND を定義する必要があります。config.vm.box_urlここboxで、ボックス名box_urlは、jsonファイルへのURLです。
ジムルーベンシュタイン14

1
@JimRubenstein素晴らしい答え-ゴルディロックスのように、短すぎず、長すぎない:)
スティーブヤンセン

9

Vagrantでは、ボックスメタデータURLがapplication/jsonコンテンツタイプとともに提供される必要があります。表示されているエラーは、VagrantがURLを通常のボックスとして解釈したことを示しています。

HTTPサーバーがContent-Typeヘッダーを適切に設定していることを確認してください。ほとんどのHTTPサーバーは、ファイルに拡張子がある場合に自動的にContent-Type ヘッダーを設定しapplication/jsonます.json


1
これがVagrantでローカルプロビジョニングを機能させるために必要なことであるため、返信が答えではない理由がわかりません。
ガウラフ14

4

あなたは彼らの指令を混同したと思う..

以下は、Vagrant Webサイトからのものです。


ボックスファイル

実際のボックスファイルは、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ファイルです。This file must contain at least the "provider" key with the provider the box is for。たとえば、ボックスがVirtualBox用である場合、metadata.jsonは次のようになります。

{
  「provider」:「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パス(ウィンドウ内)は..Users \ username \ vagrant.d \ boxes \ boxname \ 0 \ virtualbox \ metadata.json
Nebojsac

1

https://github.com/sparkoo/boxitoryを試すことができます。単純な1つのjarサーバーです。Vagrantボックスがあるディレクトリをポイントすると、Vagrantの互換性のあるhttpインターフェイスが作成されます。次に、vagrantfileからポイントするだけで完了です。ボックスを記述し、新しいバージョンやプロバイダーなどを追加するjsonファイルを手動で処理する必要はありません。すべて無料で行われます。新しいボックスファイルを追加するだけで、Boxitoryは要求されたときに即座にそれを返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.