VagrantからConoHaを使う

[ConoHa](https://www.conoha.jp)は、おなじみOpenStackベースのクラウドです。APIも使えて、ほぼOpenStack互換です。VagrantにはOpenStackに対応した[Provider](https://github.com/ggiamarchi/vagrant-openstack-provider)があるのですが、[こちらのブログ](http://blog.kyanny.me/entry/2015/08/07/035110)の通りそのままでは動きません。

OpenStackはあくまでコンポーネントの集まりで、組み合わせや設定などでだいぶ違うんですね・・・。
上記のProviderは[RackSpace](http://www.rackspace.com/)向けなのでそのままでは動きません。

というわけで、forkしてConoHa向けのProviderを作ってみました。

- [vagrant-conoha](https://github.com/hironobu-s/vagrant-conoha)
 
## プラグインの機能

* VPSの作成、起動、停止、破棄が行えます
* ConoHaの各リージョンをサポートしています
* VPS作成時にプランとインストールイメージを選択できます
* SSHキーペアの自動作成、それを使ったSSH接続が行えます
* コントロールパネルから登録済みのSSHキーペアを使うこともできます。
* インストールイメージ一覧、VPSプランの一覧、ネットワーク、サブネットの一覧を取得するコマンドが用意されています
* その他Vagrantの各コマンドが使用できます(provisionなど)

 
## 使い方

あらかじめVagrant1.2以降をインストールしておきます。

### プラグインのインストール

```console
$ vagrant plugin install vagrant-conoha
```

**(2016/06/13) 最新版1.8.3ではインストールに失敗するようです。1.8.4で修正されるそうなので、それまでは一つ前のバージョン(1.8.1)を使って下さい https://github.com/hironobu-s/vagrant-conoha/issues/2**

### ConoHa APIアカウントの作成

ConoHaのAPIを使うため、APIユーザーの作成をします。これは以下のオフィシャルのドキュメントの[3]まで進めればOKです。

[APIを使用するためのトークンを取得する](https://www.conoha.jp/conoben/archives/10025)

[4]でAPI接続するためのテナント情報などを確認します。これは次のステップで必要になります。

### Vagrantfileの作成

以下の内容でVagrantfileを作成します。ConoHaのAPIに接続するための情報や、インスタンスのスペックとイメージ(UbuntuとかCentOSとか)などを設定します。

設定ファイルの各パラメータの解説は[こちら](https://github.com/hironobu-s/vagrant-conoha/blob/master/source/Vagrantfile)

```ruby
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box       = 'conoha'
  config.ssh.username = 'root'
  config.ssh.pty      = true

  config.vm.provider :conoha do |conoha|
    conoha.openstack_auth_url = 'https://identity.tyo1.conoha.io/v2.0'

    conoha.username           = 'gncu*******'
    conoha.password           = '***********'
    conoha.tenant_name        = 'gnct*******'

    conoha.flavor             = 'g-1gb'
    conoha.image              = 'vmi-ubuntu-14.04-amd64'
    conoha.region             = "tyo1"
    conoha.admin_pass         = "AdminPass123*"
    conoha.metadata           = {
      instance_name_tag: "vagrant_conoha"
    }
    conoha.security_groups    = [
      "default",
      "gncs-ipv4-all",
      "gncs-ipv6-all"
    ]
    # conoha.keypair_name       = "hironobu-key"

  end
  # config.ssh.private_key_path = "~/.ssh/id_rsa"
end
```

### 実行

早速vagrant upしましょう。providerにconohaを指定します。

```console
# vagrant up --provider=conoha

Bringing machine 'default' up with 'conoha' provider...
==> default: Finding flavor for server...
==> default: Finding image for server...
==> default: Launching a server with the following settings...
==> default:  -- Tenant          : gnct*******
==> default:  -- Name            : default
==> default:  -- Flavor          : g-1gb
==> default:  -- FlavorRef       : 7eea7469-0d85-4f82-8050-6ae742394681
==> default:  -- Image           : vmi-ubuntu-14.04-amd64
==> default:  -- ImageRef        : 2b03327f-d453-4c7d-91c9-8b9924b6ea88
==> default:  -- KeyPair         : vagrant-generated-5i4746gl
==> default: Waiting for the server to be built...
==> default: Waiting for SSH to become available...
Connection to 133.130.***.*** closed.
==> default: The server is ready!
==> default: Rsyncing folder: /home/hiro/dev/work/vagrant/ => /vagrant
```

「The server is ready!」ということで準備OKです。ステータスを確認しましょう。

```console
# vagrant status

Current machine states:

default                   active (conoha)

The server is up and running. Run `vagrant ssh` to access it.
```

「active」ですね。あとはsshやprovisionなど、Vagrantの機能を活用できます。

ためしにsshしてみましょう。

```console
# vagrant ssh

Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.16.0-36-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Thu Aug 27 19:49:00 JST 2015

  System load:  0.08              Processes:           96
  Usage of /:   3.1% of 48.11GB   Users logged in:     0
  Memory usage: 6%                IP address for eth0: 133.130.52.164
  Swap usage:   0%

  Graph this data and manage this system at:
    https://landscape.canonical.com/

root@133-130-***-***:~#
```

いい感じです！

使い終わったらインスタンスを破棄します。ConoHaはインスタンスを削除しないと課金されるので注意です(停止ではだめです)。

```console
# vagrant destroy
==> default: Deleting server...
==> default: Waiting for the server to be deleted...
```

## vagrant-conohaの変更点

オリジナルのvagrant-openstack-providerとの相違点などは

### fixed ipへの対応

RackSpaceはfloating ipというIPアドレスをプールする仕組みを使っています。一方ConoHaはfixed ipという、インスタンス毎に固定IPを割り振る方法を採用しています。vagrant-openstack-providerはfloating ipのみの対応だったので、fixed ip対応の実装に変えてます。

### Storage Serviceの名前の違い

KeyStoneからServiceCatalogという、OpenStackコンポーネントの一覧のようなものが取れるのですが、StorageService(cinder)のtypeが、RackSpaceは"volume"で、ConoHaは"volumev2"となっています。これはvolumev2が正しいらしいですが、私はよく知りませんｗ ともかく、この違いに対応しています。

### admin_passパラメータへの対応

ConoHaのAPIはインスタンス作成時にrootパスワードを指定する機能があります。これはConoHa独自のパラメータです。これに対応しています。



## おわりに

やっぱり、いちいちAPI叩くのも面倒なのでVagrantから扱えると楽ですな( ´ ω ` )

バグレポートやPull Requestお待ちしています。