web-dev-qa-db-ja.com

JSONメタデータファイルのVagrant Box URL

私のVagrantfileで、ボックスのURLを指定できます。

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

より最近のドキュメント によると、ボックスのさまざまなバージョンのURLを含むJSONファイルを作成できるはずです。ドキュメントには、vagrant box addを実行するときにこのJSONファイルのURLを使用できるとも記載されています。その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を使用する必要はありません。

18
Brad

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

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

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

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

  • 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)

(このレイアウトは、box1の「metadata.json」に、「 http:// yourhost/boxes/yourname/box1/box1- $ version1- $ provider」のような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はそれを取得し、メタデータを解釈して適切なボックスをダウンロードします。

8
Guto Andreollo

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

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

Vagrant Cloudの使用を必要としない、リモートでホストされ、共有およびバージョン管理されたプライベートボックスであるVoila。

ボックスの新しいバージョンを作成したら、パッケージ化してmetadata.jsonファイルを編集します。私が言えることから、セマンティックバージョニング(1.0.0、1.0.1など)またはバージョンの単純な整数(1、2、3など)のいずれのバージョン管理スキームでも使用できます。ボックスのユーザーがvagrant up vagrantを使用すると、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を実行できるようになります。ただし、バージョンが更新されたときにどのように機能するかはわかりません。

19
Jim Rubenstein

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

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

9
Nicholas Hinds

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

以下は、浮浪者の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 Core自体は、後で使用するためにボックスを解凍するだけです。

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ファイルが含まれていません

4
Chux Uzoeto

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

1
Michal Vala