Vagrant から SoftLayer の仮想サーバを Provisioning する



##概要
CentOS6.5上に、Vagrant と Vagrant Softlayer Plug-in の導入方法を検証します。
加えて、Vagrantfile を作成し、実際に Vagrant から SoftLayer の仮想サーバ（Public Cloud Instances）を Provisioning する方法を検証します。

###Vagrantとは…
![vagrant.png](https://qiita-image-store.s3.amazonaws.com/0/54436/74d7dea7-d8e1-71ed-6886-27e176bfdfeb.png)

Vagrantは、様々な仮想環境をCUIから簡単に構築・管理するツールです。
Vagrantを使うことによって、数行程度のコマンドで様々な仮想環境を作ることができます。
仮想環境は、VirtualBox/VMWare/KVMなどの仮想化ソフトから、AWS/Softlayer/AzureなどIaaSまで対応しています。

* [公式](https://www.vagrantup.com/)
* [Vagrant日本語ドキュメント](http://lab.raqda.com/vagrant/)

###Softlayerとは…
![softlayer.jpg](https://qiita-image-store.s3.amazonaws.com/0/54436/b7951997-0ba0-bd2f-3898-c92ab79b4587.jpeg)

>ソフトレイヤー社は2005年にアメリカ合衆国テキサス州ダラスで創業。SaaS、PaaSの基盤となるIaaSを仮想共有型、物理専有型などで提供し、クラウドコンピューティングの全域で事業を展開。 2013年7月8日にIBMが買収完了を発表。引用：[Wikipedia](http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC)

* [公式](http://www.softlayer.com/)
* [Customer Portal](https://control.softlayer.com/)
* [日本IBM公式](http://www.ibm.com/cloud-computing/jp/ja/softlayer.html)

##前提
Softlayer上に仮想サーバ（Public Cloud Instances）をProvisioningする関係上、Softlayer周りの手続が済んでいることが前提です。

* SoftLayer に Account を持っていること
* SoftLayer の APIKey を取得していること
* SoftLayer に RSA公開鍵 を登録していること
* SoftLayer に SSL-VPN で接続できること

APIKey の取得は Customer Portal から可能です。
　[Account]Tab → [Users] → [APIKey]

RSA公開鍵 の登録、SSL-VPN接続 は下記を参考にしてください。
[ソフトレイヤー探検隊:第10回 プロビジョニング・スクリプトとSSH鍵でのログイン](https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/W2e55790226f1_47d0_a63b_84202b05783a/page/SoftLayer%20Tips%20%E3%83%97%E3%83%AD%E3%83%93%E3%82%B8%E3%83%A7%E3%83%8B%E3%83%B3%E3%82%B0%E3%83%BB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A8SSH%E9%8D%B5%E3%81%A7%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3)


##仮想サーバ注文
まず、Vagrant を導入する仮想サーバ（Public Cloud Instances、以下Vagrantサーバ）を注文します。手元にある Linux マシンに Vagrant を導入するのでも構いませんが、手っ取り早く、ここでも SoftLayer上の仮想サーバ を利用します。

VagrantサーバのSpec は 最低限の下記でOKです。

* CPU：1 core
* Memory：1 GB
* OS：CentOS 6.x - Minimal Install (64 bit) 
* DataCenter： どこでも
* ProvisioningScript： [ProvisioningScript for CentOS](https://raw.githubusercontent.com/kentarok/provisioning/master/centos_basic_config)
* SSLKey: 登録済のKeyを指定

ProvisioningScript で git や openssl の 導入をしています。また、Password 認証禁止のおまじないもかけているので、SSLKeyも指定してあげてください。

ProvisioningScript と SSLKey の詳細は下記を参考にしてください。
[ソフトレイヤー探検隊:第10回 プロビジョニング・スクリプトとSSH鍵でのログイン](https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/W2e55790226f1_47d0_a63b_84202b05783a/page/SoftLayer%20Tips%20%E3%83%97%E3%83%AD%E3%83%93%E3%82%B8%E3%83%A7%E3%83%8B%E3%83%B3%E3%82%B0%E3%83%BB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A8SSH%E9%8D%B5%E3%81%A7%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3)

##環境セットアップ
注文した Vagrantサーバ に root で Login できたら いよいよ Vagrant 環境のセットアップです。

###ruby 環境整備
Vagrant の導入・稼働には ruby が必要なので環境を整備します。

####rbenv/ruby-build 導入
ruby の導入には rbenv/ruby-build が便利です。
github から導入します。

`cd /opt`
`git clone git://github.com/sstephenson/rbenv.git`
`git clone git://github.com/sstephenson/ruby-build.git`

####rbenv/ruby-build 設定
ruby-build のセットアップと 環境変数を定義します。

`cd ruby-build`
`sudo ./install.sh`
`echo 'export RBENV_ROOT="/opt/rbenv"' >> /etc/profile`
`echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> /etc/profile`
`echo 'eval "$(rbenv init -)"' >> /etc/profile`
`source /etc/profile`

rbenv を実行し、バージョンを確認してみます。

```
# rbenv
rbenv 0.4.0-98-g13a474c
```

####ruby 導入
執筆時点（2014.09.17）での Stable Version である 2.1.2 を導入します。

`rbenv install 2.1.2`
`rbenv global 2.1.2`

ruby 2.1.2 が使えるようになりました。

```
# rbenv version
2.1.2 (set by /opt/rbenv/version)
# ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
```

####bundler 導入
ruby 入れたので、bundler も入れます。

入れたら、確認。

`gem install bundler`
`rbenv rehash`

```
# gem list bundler
bundler (1.7.3)
```

###Vagrant 導入

執筆時点（2014.09.17）で最新の Vagrant を導入します。
最新版の確認先は [こちら](https://www.vagrantup.com/downloads.html) です。

`sudo rpm -Uvh https://dl.bintray.com/mitchellh/vagrant/vagrant_1.6.5_x86_64.rpm`

確認します。

```
# vagrant version
Installed Version: 1.6.5
Latest Version: 1.6.5
```

###SoftLayer plug-in 導入

softlayer plug-in は vagrant コマンドから簡単に導入可能です。`NOKOGIRI～` のおまじないは試行錯誤の結果なので、忘れずに記述してください。

`NOKOGIRI_USE_SYSTEM_LIBRARIES=1 vagrant plugin install vagrant-softlayer`

確認。

```
# vagrant plugin list
vagrant-login (1.0.1, system)
vagrant-share (1.1.1, system)
vagrant-softlayer (0.3.3)
```

###Vagrant 設定
Vagrant の SoftLayer plug-in まで導入が済んだので、設定を進めます。

####環境変数定義
Vagrantfile に 直接 APIKey を記述するのが気持ち悪いので（好みですが…）、環境変数に定義します。当然、それぞれの環境の Username と API Key に読み替えてください

`echo 'SL_USERNAME=SL??????' >> /etc/profile`
`echo 'SL_API_KEY="1234567890abcdefghijk"' >> /etc/profile`
`source /etc/profile`

####Vagrantfile 初期化
適当なディレクトリに移動し、Default の Vagrantfile を作成します。

`mkdir /vagrant`
`cd /vagrant`
`vagrant init`

```
# vagrant init
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```

####Vagrantfile 設定

Vagrant で SoftLayerの仮想サーバを Provisiong するために、Vagrantfile を下記に置き換えます。

```ruby:Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "dummy"
  config.vm.box_url = "https://github.com/audiolize/vagrant-softlayer/raw/master/dummy.box"
  config.vm.synced_folder ".", "/vagrant", type: "rsync", disabled: true
  config.ssh.private_key_path = "/root/.ssh/id_rsa"
  config.ssh.username = "root"

  config.vm.provider :softlayer do | sl, override |
    sl.api_key          = ENV['SL_API_KEY']
    sl.username         = ENV['SL_USERNAME']
    sl.datacenter       = "hkg02"
    sl.dedicated        = false
    sl.hourly_billing   = true
    sl.hostname         = "vagrant01"
    sl.domain           = "domain.jp"
    sl.start_cpus       = 1
    sl.max_memory       = 1024
    sl.local_disk       = true
    sl.disk_capacity    = { 0 => 25 }
    sl.network_speed    = 10
    sl.operating_system = "CENTOS_6_64"
    sl.ssh_key          = [ "APIKEY" ]
    override.ssh.username = "root"
  end
end
```

　
各設定値の詳細は下記を参考にしてください。
[VagrantでSoftLayerを操作する](http://niccloud.niandc.ne.jp/?p=749)
　

* `sl.api_key` `sl.username` は先ほど定義した環境変数を指定します
* `sl.ssh_key` は CustmerPortal に登録した SSL公開鍵 を指定します
* `config.ssh.private_key_path` は `sl.ssh_key` と対になる 秘密鍵を指定します
* `config.vm.synced_folder` は無効化しています。課題で触れる『[【補足】Synced Foldersのエラー対応](http://nmbr8.com/blog/2014/05/22/how-to-define-and-control-multiple-guest-machines-per-Vagrantfile/)』の為です


##Provisioning

いよいよ、Vagrant で 仮想サーバ を注文してみます。
先ほど設定したVagrantfileと同じディレクトリ上でコマンドを実行します。

`vagrant up`

成功しました。

```
# vagrant up
Bringing machine 'vagrant01' up with 'softlayer' provider...
==> vagrant01: Creating a new SoftLayer instance...
==> vagrant01: Waiting for instance provisioning. This may take a few minutes...
==> vagrant01: SoftLayer instance successfully provisioned!
==> vagrant01: Waiting for machine to boot. This may take a few minutes...
    vagrant01: SSH address: 119.81.167.234:22
    vagrant01: SSH username: root
    vagrant01: SSH auth method: private key
==> vagrant01: Machine booted and ready!

# vagrant status
Current machine states:

vagrant01                 running (softlayer)
```

###Customer Portal での確認
Customer Portal でも 新しい仮想サーバが確認できます。

![vagrant_single.png](https://qiita-image-store.s3.amazonaws.com/0/54436/074d46e6-842c-861f-6ff7-11e31c184777.png)


###仮想サーバに ssh してみる
sshログインも vagrant 経由でできます。

`vagrant ssh`

```
# vagrant ssh
[root@vagrant01 ~]# uname -a
Linux vagrant01.domain.jp 2.6.32-431.23.3.el6.x86_64 #1 SMP Thu Jul 31 17:20:51 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
[root@vagrant01 ~]# exit
#
```

###仮想サーバの廃棄
放っておくと、どんどんお金がかかってしまうので作った仮想サーバを破棄します。
破棄も vagrant から実行します。

作るのも 1 command なら、棄てるのも 1 command です。

`vagrant destroy`

```
# vagrant destroy
    vagrant01: Are you sure you want to destroy the 'vagrant01' VM? [y/N] y
==> vagrant01: Destroying the SoftLayer instance...
# vagrant status
Current machine states:

vagrant01                 not created (softlayer)
```

※失敗したことはないですが、一応 CustomerPortal からも仮想サーバが表示されないことを確認することをお勧めします。

##結果
* CentOS6.5 上に SoftLayer を操作できる Vagrant 環境を整備できました
* 実際に、Vagrant から SoftLayer に仮想サーバの Provisioning ができました

Vagrant から SoftLayer を操れるようになると、Chef との組み合わせも容易になりますし、Jenkins との連携もやりやすくなります。Let's インフラCI!!


##課題

* Vagrant が 仮想サーバの PublicIPに対して ssh しようとするので、PrivateIPに対してするような設定の組み込み
* Synced Foldersのエラー対応検討（参考：[【補足】Synced Foldersのエラー対応](http://nmbr8.com/blog/2014/05/22/how-to-define-and-control-multiple-guest-machines-per-Vagrantfile/))


##参考
下記サイトを参考にさせて頂きました。ありがとうございました。

* [VagrantでSoftLayerを操作する](http://niccloud.niandc.ne.jp/?p=749)
* [github: audiolize/vagrant-softlayer](https://github.com/audiolize/vagrant-softlayer)

##関連

* [Vagrant から SoftLayer の仮想サーバを 1度に複数 Provisioning する](http://qiita.com/kentarok/items/efcbee0b708a3d71aef3)