Vagrant 是個相當方便的工具,可以用來整備 (provision) 開發、測試所需的服務器, 隨著它開始支援不同的雲端虛擬機供應商,甚至也可以使用它來整備生產環境。 雖然在雲端虛擬機整備這塊跟 Ansible 或者 Saltstack 有所重疊,但由於可以支援從開發、測試到生產環境的整備,Vagrant 還是值得探討更多應用的可能性。

除了本地虛擬機外,Vagrant 也可以支援多種不同的雲端虛擬機平台,像是 DigitalOcean, Amazon EC2, 等等。 但沒有支援 Linode 這點倒是讓山姆鍋有點不能理解,因為像是 Ansible 或者 Saltstack 都有支援 Linode。 不管如何,本文介紹如何讓 Vagrant 可以部署虛擬機到 DigitalOcean 這個平台上。

安裝 DigitalOcean Vagrant Provider

Vagrant 的虛擬機支援是藉由 Provider 插件來提供,由於它本身不內建支援 DigitalOcean, 需要使用這個 DigitalOcean Vagrant Provider 。 安裝上還算簡單,只要使用下列指令:

1
$ vagrant plugin install vagrant-digitalocean

如果您跟山姆鍋一樣都是使用 Mac 系統的話,還需要安裝一個 CA bundle 套件讓 Vagrant 可以透過 SSL 跟 DigitalOcean 系統通訊。 使用 Homebrew 安裝這個套件最簡單,只要使用:

1
$ brew install curl-ca-bundle

安裝完這個套件,將下列環境變數加入您的~/.bash_profile 中:

1
export SSL_CERT_FILE=/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt

記得要開啟新的 shell 視窗或者 source ~/.bash_profile 來讓設定生效。

設定 Vagrant 使用 DigitalOcean

跟其它 Vagrant 專案一樣,需要在 Vagrantfile 中修改設定:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Vagrant.configure('2') do |config|

config.vm.provider :digital_ocean do |provider, override|
override.ssh.private_key_path = '~/.ssh/id_rsa'
override.vm.box = 'digital_ocean'
override.vm.box_url = "https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box"

provider.client_id = 'YOUR CLIENT ID'
provider.api_key = 'YOUR API KEY'

provider.image = "Ubuntu 12.10 x64"
provider.region = "New York 2"
end
end

其中,‘YOUR_CLIENT_ID’ 是您在 DigitalOcean 的 Client ID; ‘YOUR API KEY’ 則是存取 DigitalOcean 需要的祕鑰,如果還沒有,您可以產生新的祕鑰。

可以使用的參數有:

  • provider.image - 欲使用的系統映像 (image) 名稱, 例如: Ubuntu 12.10 x64,這也是預設值。
  • provider.region - 新建立的 Droplet 要位於哪個區域,預設是 `New York 2`。
  • provider.size - 指定虛擬機的容量規格,預設是 `512MB`。
  • provider.private_networking - 指定是否支援私有網路,不是每個區域都支援,預設是 `false`。
  • provider.ssh_key_name - 用來認證 Droplet 連線的 SSH key 的名稱,預設是 `Vagrant`。
  • provider.setup - 只是是否需要建立新的使用者帳戶,預設是 `true`。

部署虛擬機

跟部署其它虛擬機其實沒有太大的不同,只是需要額外指定使用的 Provider:

1
$ vagrant up --provider digital_ocean

結語

從本文不難看出,除了需要另外安裝 Provider 插件外,跟使用其它虛擬機技術沒有太大差異 (跟使用的 Provider 有關)。針對 DigitalOcean Vagrant Provider 要注意的是: 它目前只能從現有的系統映像來建立新的 droplet(DigitalOcean 的 VM), 尚不支援使用 snapshot 來建立。這也就是說, 使用的映像沒有預先安裝像是 Puppet/Chef 這種來進一步配置系統的工具! 關於如何處理這個問題,山姆鍋會另外寫一篇文章來說明。