前言

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

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

安裝 DigitalOcean Vagrant Provider

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

$ vagrant plugin install vagrant-digitalocean

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

$ brew install curl-ca-bundle

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

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

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

設定 Vagrant 使用 DigitalOcean

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

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:

$ vagrant up --provider digital_ocean

結語

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