クラウド系ProviderのVagrant BoxをATLASで公開してみる

クラウド系のProviderを使用していると毎回同じような設定をVagrantfileに書く事になりがちです。
Box化することで共通項目をまとめVagrantfileに記述しなければならない項目を減らす事ができます。
また、[ATLAS](https://atlas.hashicorp.com/)で公開することで設定内容を共有できるようにしてみます。

# Boxの作成

以前の記事と同様の方法でBoxを作成します。

[vagrant-cloudstackで複数VMの起動&Boxの作成 - Qiita](http://qiita.com/atsaki/items/13b27fb686af5bee5547)

今回は例としてCloudStack（IDCFクラウド）で、最小スペックでVagrant用テンプレートのBoxを作成してみます。

* テンプレート
    * CentOS 6.6 64-bit for Vagrant 
* サービスオファリング
    * light.S1

まず、Box用のディレクトリを作成します。

```bash
$ mkdir idcfcloud_centos_6.6
$ cd idcfcloud_centos_6.6
```

このディレクトリの中に以下のような内容で```Vagrantfile``` と```metadata``` ファイルを作成します。

```rb:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.provider :cloudstack do |cloudstack|

    cloudstack.host    = "compute.jp-east.idcfcloud.com"
    cloudstack.path    = "/client/api"
    cloudstack.port    = "443"
    cloudstack.scheme  = "https"

    cloudstack.api_key    = "#{ENV['CLOUDSTACK_API_KEY']}"
    cloudstack.secret_key = "#{ENV['CLOUDSTACK_SECRET_KEY']}"

    cloudstack.zone_name             = "tesla"
    cloudstack.template_name         = "CentOS 6.6 64-bit for Vagrant"
    cloudstack.service_offering_name = "light.S1"
    cloudstack.network_type          = "Advanced"
    cloudstack.network_name          = "network1"
  end
end
```

```json:metadata.json
{
    "provider": "cloudstack"
}
```

tarコマンドで作成した2つのファイルを固めればBoxの完成です。

```bash
$ tar cfvz idcfcloud_centos_6.6.box  Vagrantfile metadata.json
```

# Boxの登録

作成したBoxをATLASに登録します。

ATLASのアカウント作成・Boxの登録方法は以下の記事が画像付きで分かりやすかったので、そちらを参照してください。
タイトルはVagrant Cloudですが、画面はATLASになっています。

プロバイダ名は使用しているプロバイダに応じて変更する必要があります。
今回の例ではproviderに```virtualbox``` の代わりに```cloudstack``` を入力して下さい。

[Vagrant Cloudにサインインしたついでにboxを登録してみる - Qiita](http://qiita.com/miyamoto_ta/items/4f592fe62b81ce933133)

# Boxの公開

登録されたBoxはリリースされるまで公開されません。
以下の画面で```Release Version``` を押すとリリースされます。

![スクリーンショット 2015-02-15 13.14.24.png](https://qiita-image-store.s3.amazonaws.com/0/15114/77c92957-4c2e-78d8-4952-a1e55e585c7c.png)

公開範囲を限定したい場合にはSettingsでPrivateにチェックをいれると所有者と許可されたメンバー以外からアクセスできなくなります。

![スクリーンショット 2015-02-15 13.23.56.png](https://qiita-image-store.s3.amazonaws.com/0/15114/eba8ba60-e237-463c-b708-5529ef6e4802.png)

# Boxの使用

## vagrant-cloudstackのインストール

CloudStack Providerを使用するために```vagrant-cloudstack``` をインストールしておきます。

```bash
$ vagrant plugin install vagrant-cloudstack
```

## Boxの取得

通常と同じく```vagrant box add``` コマンドでBoxを取得する事ができます。

```bash
$ vagrant box add atsaki/idcfcloud_centos_6.6 
```

公開範囲が限定されているBoxを取得するためには```vagrant login``` コマンドでATLASにログインしておく必要があります。

```bash
$ vagrant login
$ vagrant box add atsaki/idcfcloud_vagrant_centos_6.6
```

## Boxの中身の確認

取得されたBoxは```~/.vagrant.d/boxes``` 下に配置されます。

**他人が作成したBoxを使用する場合にはVagrantfileの中身をみて設定に問題がないか確認しておきましょう。**

```bash
.
├── atsaki-VAGRANTSLASH-idcfcloud_centos_6.6
│   ├── 0.0.1
│   │   └── cloudstack
│   │       ├── Vagrantfile
│   │       └── metadata.json
│   └── metadata_url
```

## Boxを利用して仮想マシンを起動する

取得したBoxを使用するVagrantfileを作成します。
SSHでログインするための設定等を必要に応じて追記しておきます。

```rb:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "atsaki/idcfcloud_centos_6.6"

  config.ssh.private_key_path = "#{ENV['VAGRANT_SSH_PRIVATE_KEY']}"
  config.ssh.port             = "22"

  config.vm.provider :cloudstack do |cloudstack|
    cloudstack.pf_ip_address_id = "#{ENV['CLOUDSTACK_PF_IP_ADDRESS_ID']}"
    cloudstack.pf_public_port   = "22"
    cloudstack.pf_private_port  = "22"
    cloudstack.keypair          = "#{ENV['CLOUDSTACK_SSH_KEYPAIR']}"
  end
end
```

Vagrantfileの中で参照してる環境変数を設定します。Box内で使用している環境変数についても設定する必要があります。

```bash
$ export VAGRANT_SSH_PRIVATE_KEY=YOUR_SSH_PRIVATE_KEY
$ export CLOUDSTACK_API_KEY=YOUR_API_KEY
$ export CLOUDSTACK_SECRET_KEY=YOUR_SECRET_KEY
$ export CLOUDSTACK_PF_IP_ADDRESS_ID=YOUR_PF_IP_ADDRESS_ID
$ export CLOUDSTACK_SSH_KEYPAIR=YOUR_SSH_KEYPAIR
```

環境変数の設定は[dotenv](https://github.com/bkeepers/dotenv)や[direnv](https://github.com/zimbatm/direnv)を使用すると、設定を一度書けば
自動で設定されるようになるので楽です。

Vagrantfileの作成、環境変数の設定が完了すれば```vagrant up``` コマンドで仮想マシンを起動できます。

```bash
$ vagrant up --provider=cloudstack
```

## Boxの設定を上書きする

Boxの設定で変更したい箇所がある場合にはVagrantfileで上書きすることができます。
設定の優先度については以下のドキュメントを参照してください。

http://docs.vagrantup.com/v2/vagrantfile/

例えば、service offeringの設定を上書きする事で仮想マシンのスペックを変更することができます。

```rb:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "atsaki/idcfcloud_centos_6.6"

  config.ssh.private_key_path = "#{ENV['VAGRANT_SSH_PRIVATE_KEY']}"
  config.ssh.port             = "22"

  config.vm.provider :cloudstack do |cloudstack|
    cloudstack.service_offering_name = "light.S2" # ここで上書き
    cloudstack.pf_ip_address_id = "#{ENV['CLOUDSTACK_PF_IP_ADDRESS_ID']}"
    cloudstack.pf_public_port   = "22"
    cloudstack.pf_private_port  = "22"
    cloudstack.keypair          = "#{ENV['CLOUDSTACK_SSH_KEYPAIR']}"
  end
end
```

# 参考資料

* [vagrant-cloudstackで複数VMの起動&Boxの作成 - Qiita](http://qiita.com/atsaki/items/13b27fb686af5bee5547)
* [Vagrant Cloudにサインインしたついでにboxを登録してみる - Qiita](http://qiita.com/miyamoto_ta/items/4f592fe62b81ce933133)