vagrant virtualbox provider 加載磁碟

前兩天想練習 LVM,所以試著在既有的 RHEL VM 裡加磁碟,但是事情沒有想的那麼簡單。原本以為就是照 Vagrant Disk Usage 文件的說明,在 Vagrantfile 裡加入

config.vm.disk :disk, size: "100GB"

就可以,但這樣不行,vagrant reload 以後,並沒有磁碟出現。

上網找解決方法,找到這篇:Add a second disk to system using vagrant

才知道是要用 provider 的 customize() 去建立磁碟並加載才行 (參考資料:Add a second disk to system using vagrant):

    tower.vm.provider "virtualbox" do |v|
      file_to_disk1 = "mydisk1.vmdk"
      unless File.exist?(file_to_disk1)
        v.customize [
           "createmedium", "disk", "--filename", file_to_disk1, "--format", "vmdk", "--size", 1024 * 1
         ]
      end
      file_to_disk2 = "mydisk2.vmdk"
      unless File.exist?(file_to_disk2)
        v.customize [
           "createmedium", "disk", "--filename", file_to_disk2, "--format", "vmdk", "--size", 1024 * 1
         ]
      end
      v.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', file_to_disk1]
      v.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 2, '--device', 0, '--type', 'hdd', '--medium', file_to_disk2]
    end

在建立前,先使用 File.exists? 去做檢查磁碟映像檔是否存在,不存在,就呼叫 createmedium 來建立。接著再用 storageattach 加載到 VM 上就可以了。

如果有錯誤訊息,說沒有 SATA Controller,請開啟 VirtualBox 去看該 VM 是不是有 SATA Controller。

參考資料:

  1. vagrant – Set storage size on creation of VM VirtualBox – Unix & Linux Stack Exchange
  2. Vagrant Tricks: Add extra disk to box – real world IT
  3. https://gist.github.com/leifg/4713995

直接用 SSH 登入 vagrant 虛擬機失敗

試著直接使用 SSH 登入 vagrant 開出來的 Ubuntu 虛擬機,會出現錯誤訊息:

SSH Login Failed : Permission denied (publickey,gssapi-keyex,gssapi-with-mic)

可是用 vagrant ssh 卻可以登入,用 vagrant ssh 登入進去查,SSH daemon 有啟動,所以 SSH 服務是沒問題的。後來透過錯誤訊息才查到,是 SSH Daemon 裡的 PasswordAuthentication 被設定為 no 了。所以修改 /etc/ssh/sshd_config ,將 PasswordAuthentication 設定為 yes 後,就可以用 ssh 登入了。

vagrant ssh 之所以可以登入,是因為在初始化虛擬機時,預先產生好 SSH Key,並且把 SSH public key 放到虛擬機裡了。另外一種解決方法,就是使用產生好的 SSH private key 來登入。

ssh -i .vagrant/machines/<your_machine_name>/virtualbox/private_key ubuntu@<your_machine_ip>

參考資料:

Vagrantfile 依版本給設定

上個月因為 vagrant 升級,在 Vagrantfile 裡加了 vb.default_nic_type = “virtio”,但今天同事使用 vagrant up 時,出現錯誤。原來我同事使用的是 vagrant 2.1,而我已經用 vagrant 2.2 了。

之前知道 Vagrantfile 其實是 ruby 語言,因此知道可以在裏面寫程式來處理,在網路上找看看怎麼做,就找到了。關鍵就是利用 Vagrant::VERSION 這個變數。

如果要印出訊息,就直接用 puts ,在執行 vagrant status 等指令時,就會看到。在找這個時,意外看到 vagrant 有 message 系統 (print message after booting vagrant machine with “vagrant up”),可以在指定的情況輸出訊息:

config.vm.post_up_message = "This is the start up message!"

Pro Vagrant

今天翻了 Pro Vagrant 這本書,這本書是 2015 年出版的,到今天書裡已經有些資訊是過時的了。不過裏面介紹了如何使用 vagrant 、如何打包 box 以及使用上的觀念與建議作法,還蠻實用的。

書本的原始碼都在 https://github.com/pro-vagrant

裏面提到的 atlas.hashicorp.com ,現在 Hashicorp 已經不再繼續,並且在 2018/6/27 之後,hashicorp 把 vagrant boxes 都搬到  https://app.vagrantup.com 了,Ubuntu 的 box 都在 https://app.vagrantup.com/ubuntu

作者的網站 http://boxes.gajdaw.pl 也已經消失了。

幾個有用的 plugin:

另外就是知道有 vagrant share 跟 vagrant connect 這兩個子指令,vagrant share 可以讓 VM 有個對外的網址,對方或伙伴就可以用 vagrant connect 連上 VM 提供的服務,說真的,這兩個指令蠻讓我驚訝的。

Vagrant VM 搬家

有同事問,印象中有,就試了一下

  1. 用 vagrant package 會得到 package.box 檔案,複製到另外一台電腦上。
  2. 到另外一台電腦上用 vagrant box add package.box –name “my_new_vm” 加進去。
  3. 建個目錄,用 vagrant init “my_new_vm” 產生 Vagrantfile ,執行 vagrant up 即可。

OpsWork / Terraform / Vagrant 小感

Vagrant 其實不太能拿來跟 OpsWork 或 Terraform 相比,不過有了 push 之後,算是有個堪用的 deploy 方法…

前一陣子看到 Terraform ,只要寫好腳本(或者該說是計劃),這工具就會自動幫你把環境佈署到雲端,比如說,你有 Web application、Web Server、Database、HAProxy … 等等,在腳本描述好關係之後,Terraform 可以自動幫你佈署到 AWS 、DigitalOcean、CloudStack、Docker、Google cloud 、OpenStack、Heroku … 等地方,非常的方便。但如果要用在內部的環境,可能就沒辦法 (除非內部自架了 CloudStack 或 OpenStack)。

OpsWorks 是在 DevOps gitter 裡看到的,Google 了一下,這是 Amazon 提供的服務,做的事情其實跟 Terraform 蠻相近的,跟 Amazon 的服務整合度更高。我是還沒試用過,不知道好不好用。

Vagrant 本身是操作虛擬機器的好幫手,在 Google Altas 時,看到 Vagrant 有提供 push 這子指令,這可以用來做 deploy 。比如說,你在 Vagrantfile 裡描述了 Web application server、Web Server、Database server … 等等,在本地端可以用 vagrant up  啟動,進行驗證,那要實際佈署到遠端時,就可以用 push 來做。push 的對象(或者該說是方式?)可以是 Altas、FTP/SFTP、Heroku 或執行自訂的腳本,所以看起來或許適合我現在的情境。

順便記一些連結:

Use NFS as synced folder in Vagrant

Just note during I use NFS as synced folder in Vagrant.

  1. In your host, you have to install nfs-kernel-server:
    sudo apt-get install nfs-kernel-server
  2. In your Vagrantfile, you have to specify private_network even you want to use public_network.  If you don’t specify private_network, vagrant up will fail.  Then specify synced_folder.
    config.vm.network "private_network", ip: "192.168.33.10"
    config.vm.network "public_network", ip: "192.168.11.2", bridge: "eth0"
    config.vm.synced_folder ".", "/vagrant", type: "nfs"

Reference: