Vagrant から SoftLayer の仮想サーバを 1度に複数 Provisioning する

##概要
Vagrantfile 1ファイル で SoftLayer の仮想サーバを 1度に複数サーバ Provisioning する方法を検証します。

##前提
下記を参考に、Vagrant - SoftLayer 環境を整備しておいてください。

[Qiita:Vagrant から SoftLayer の仮想サーバを Provisioning する](http://qiita.com/kentarok/items/f58174aa573359e369e4)

##Vagrantfile 準備

今回は2つの仮想サーバを1度にProvisioningしてみます。
準備として、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.define :vagrant01 do |vagrant01|
    vagrant01.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

  config.vm.define :vagrant02 do |vagrant02|
    vagrant02.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         = "vagrant02"
      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

end
```

##Provisioning

では実際に、1度に複数Provisioningします。
標準出力みてると普通に順番に起動しているだけに見えます。

`vagrant up`

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

確認

```
# vagrant status
Current machine states:

vagrant01                 running (softlayer)
vagrant02                 running (softlayer)
```

####Customer Portal での確認

![vagrant_futago.png](https://qiita-image-store.s3.amazonaws.com/0/54436/ad24bb6e-da5e-88d6-87c6-899e56c3f958.png)

####仮想サーバに ssh してみる

名前で `vagrant ssh` することができます。

```
# vagrant ssh vagrant01
[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
logout
# vagrant ssh vagrant02
[root@vagrant02 ~]# uname -a
Linux vagrant02.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@vagrant02 ~]# exit
logout
#
```

####仮想サーバの廃棄

名前を並べることで1度に `vagrant destroy` することも可能です。

```
# vagrant destroy -f vagrant01 vagrant02
==> vagrant02: Destroying the SoftLayer instance...
==> vagrant01: Destroying the SoftLayer instance...

# vagrant status
Current machine states:

vagrant01                 not created (softlayer)
vagrant02                 not created (softlayer)
```

もちろん、Customer Portal でも確認できます。

![vagrant_destroy.png](https://qiita-image-store.s3.amazonaws.com/0/54436/70bc7ea8-54c9-a7f0-6185-1a118e753650.png)



##結果

* Vagrant から SoftLayer の仮想サーバを1度に複数 Provisioning できた
* destroy もできた。

Customer Portal から GUI で 1台1台注文してもいいのですが、大量の台数を注文する場合、結構な時間がかかってしまいます。それが Vagrantfile を準備する手間が必要とはいえ、1コマンドで済むメリットは大きいように思います。どんなサーバを発注するのか、発注したのか、という証跡を Vagrantfile という形で保管しておけるのも魅力ですね。

##課題

* Vagrantfile の中の繰り返し部分をベタ書きしているのがダサい。もう少し綺麗にまとめたい。


##参考

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

* [Vagrantで複数の仮想マシンを起動する](http://nmbr8.com/blog/2014/05/22/how-to-define-and-control-multiple-guest-machines-per-Vagrantfile/)