Vagrant BoxをVagrant Cloudへ登録

やりたいこと

  • Vagrant Cloudへboxを登録する

Vagrant BoxのホスティングがAtlasのサービスから分離されてVagrant Cloudになった. 今後はVagrant Cloud APIを利用してVagrant Boxの登録をおこなう.

Vagrant Boxの作成はPackerでVagrant Boxファイルを作成を参照.

トークンの生成

Setting → Security の Authentication Tokensで生成できる. Descriptionにトークンを認識するための記述を入力し,Generate tokenボタンを押す.

トークンの生成

一度だけトークンが表示されるので適切なところに保存しておく.

APIを利用しても生成可能.

curl \
  --header "Content-Type: application/json" \
  https://app.vagrantup.com/api/v1/authenticate \
  --data '
    {
      "token": {
        "description": "Login from cURL"
      },
      "user": {
        "login": "USERNAME",
        "password": "PASSWORD"
      }
    }
  '

# レスポンス例
{
  "description": "Login from cURL",
  "token": "qwlIE1qBVUafsg.atlasv1.FLwfJSSYkl49i4qZIu8R31GBnI9r8DrW4IQKMppkGq5rD264lRksTqaIN0zY9Bmy0zs",
  "token_hash": "7598236a879ecb42cb0f25399d6f25d1d2cfbbc6333392131bbdfba325eb352795c169daa4a61a8094d44afe817a857e0e5fc7dc72a1401eb434577337d1246c",
  "created_at": "2017-10-18T19:16:24.956Z"
}

USERNAMEPASSWORDはVagrant Cloudのものを入力する.

Vagrant Boxの登録

ここからはAPIを利用する方法だけ触れる.

新しいBoxの作成

公開したいBoxについて一回だけ実行すれば良い.

curl \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer VAGRANT_CLOUD_TOKEN" \
  https://app.vagrantup.com/api/v1/boxes \
  --data '
    {
      "box": {
        "username": "USERNAME",
        "name": "BOXNAME",
        "short_description": "My dev box",
        "description": "My development Vagrant box",
        "is_private": false
      }
    }
  '

VAGRANT_CLOUD_TOKENはアクセストークン.

公開する場合はis_privatefalseにする. trueでも作成できるが,vagrantコマンドなどで実際にアクセスする場合には有料プランに変更する必要がある.

新しいバージョンの作成

公開しているVagrant Boxを更新する場合に毎回実行する.

curl \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer VAGRANT_CLOUD_TOKEN" \
  https://app.vagrantup.com/api/v1/box/USERNAME/BOXNAME/versions \
  --data '{ "version": { "version": "VERSION" } }'

VERSIONで適切なバージョンを指定する.

新しいプロバイダーの作成

プロバイダーを指定する.

  • VirtualBox
  • VMware
  • Docker
  • Hyper-V

が対応している.その他にもカスタムで作ることもできる. 例えば,Parallelsなども利用できる.

今回はVirtualBoxを使うことにする.

curl \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer VAGRANT_CLOUD_TOKEN" \
  https://app.vagrantup.com/api/v1/box/USERNAME/BOXNAME/version/VERSION/providers \
  --data '{ "provider": { "name": "virtualbox" } }'

Boxのアップロード

ビルドしたVagrant Boxファイルをアップロードする.

# アップロード用URLの取得
response=$(curl \
  --header "Authorization: Bearer VAGRANT_CLOUD_TOKEN" \
  https://app.vagrantup.com/api/v1/box/USERNAME/BOXNAME/version/VERSION/provider/virtualbox/upload)
# jqを使ってアップロード用URLを抽出
upload_path=$(echo $response | jq .upload_path | sed 's/"//g')

# アップロード
curl $upload_path --request PUT --upload-file BOXPATH

# レスポンス例
{
  "upload_path": "https://archivist.hashicorp.com/v1/object/630e42d9-2364-2412-4121-18266770468e"
}

BOXPATHにはBoxファイルへのパスを指定する.

今回はアップロードを失敗することが多かった. 最終的にはいつの間にかアップロードされていた. 原因不明.今後の課題.

リリース

vagrantコマンドからアクセスできるようにリリースする.

curl \
  --header "Authorization: Bearer VAGRANT_CLOUD_TOKEN" \
  https://app.vagrantup.com/api/v1/box/USERNAME/BOXNAME/version/VERSION/release \
  --request PUT

これで,

vagrant init USER/BOX
vagrant up

で利用できる. 旧版を導入済みの場合はvagrant box update USER/BOXで更新できる.

今後の課題

参考