Vagrant 基本設定

如何管理 Vagrant boxes?

如果在網路上找到了一個適合的 box (e.g. bento/debian-8.6) 想要下載並新增到本機,可以使用 vagrant box add <box_name> <box_url> 並選擇自己需要的版本,舉例來說:

  1. $ vagrant box add bento/debian-8.6 https://atlas.hashicorp.com/bento/boxes/debian-8.6
  2. ==> box: Loading metadata for box 'https://atlas.hashicorp.com/bento/boxes/debian-8.6'
  3. This box can work with multiple providers! The providers that it
  4. can work with are listed below. Please review the list and choose
  5. the provider you will be working with.
  6. 1) parallels
  7. 2) virtualbox
  8. 3) vmware_desktop
  9. Enter your choice: 2
  10. ==> box: Adding box 'bento/debian-8.6' (v2.3.0) for provider: virtualbox
  11. box: Downloading: https://atlas.hashicorp.com/bento/boxes/debian-8.6/versions/2.3.0/providers/virtualbox.box
  12. ==> box: Successfully added box 'bento/debian-8.6' (v2.3.0) for 'virtualbox'!

下載完成後,檢查一下目前所有安裝在本機的 Vagrant boxes:

  1. $ vagrant box list
  2. bento/debian-8.6 (virtualbox, 2.3.0)
  3. bento/ubuntu-14.04 (virtualbox, 201708.22.0)

同理,如果要移除不再需要的 box,可以使用 vagrant box remove <box_name>

  1. $ vagrant box remove bento/debian-8.6

透過 vagrant box list 確定一下 box 已經被成功移除:

  1. $ vagrant box list
  2. bento/ubuntu-14.04 (virtualbox, 201708.22.0)

透過 Vagrantfile 配置測試環境

還記得在上一個章節內我們在初始化 Vagrant 時系統自動產生的 Vagrantfile 嗎?現在把這個檔案打開,你應該會看到以下結果:

  1. # -*- mode: ruby -*-
  2. # vi: set ft=ruby :
  3. # All Vagrant configuration is done below. The "2" in Vagrant.configure
  4. # configures the configuration version (we support older styles for
  5. # backwards compatibility). Please don't change it unless you know what
  6. # you're doing.
  7. Vagrant.configure("2") do |config|
  8. # The most common configuration options are documented and commented below.
  9. # For a complete reference, please see the online documentation at
  10. # https://docs.vagrantup.com.
  11. # Every Vagrant development environment requires a box. You can search for
  12. # boxes at https://vagrantcloud.com/search.
  13. config.vm.box = "bento/ubuntu-14.04"
  14. # Disable automatic box update checking. If you disable this, then
  15. # boxes will only be checked for updates when the user runs
  16. # `vagrant box outdated`. This is not recommended.
  17. # config.vm.box_check_update = false
  18. # Create a forwarded port mapping which allows access to a specific port
  19. # within the machine from a port on the host machine. In the example below,
  20. # accessing "localhost:8080" will access port 80 on the guest machine.
  21. # NOTE: This will enable public access to the opened port
  22. # config.vm.network "forwarded_port", guest: 80, host: 8080
  23. # Create a forwarded port mapping which allows access to a specific port
  24. # within the machine from a port on the host machine and only allow access
  25. # via 127.0.0.1 to disable public access
  26. # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
  27. # Create a private network, which allows host-only access to the machine
  28. # using a specific IP.
  29. # config.vm.network "private_network", ip: "192.168.33.10"
  30. # Create a public network, which generally matched to bridged network.
  31. # Bridged networks make the machine appear as another physical device on
  32. # your network.
  33. # config.vm.network "public_network"
  34. # Share an additional folder to the guest VM. The first argument is
  35. # the path on the host to the actual folder. The second argument is
  36. # the path on the guest to mount the folder. And the optional third
  37. # argument is a set of non-required options.
  38. # config.vm.synced_folder "../data", "/vagrant_data"
  39. # Provider-specific configuration so you can fine-tune various
  40. # backing providers for Vagrant. These expose provider-specific options.
  41. # Example for VirtualBox:
  42. #
  43. # config.vm.provider "virtualbox" do |vb|
  44. # # Display the VirtualBox GUI when booting the machine
  45. # vb.gui = true
  46. #
  47. # # Customize the amount of memory on the VM:
  48. # vb.memory = "1024"
  49. # end
  50. #
  51. # View the documentation for the provider you are using for more
  52. # information on available options.
  53. # Enable provisioning with a shell script. Additional provisioners such as
  54. # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  55. # documentation for more information about their specific syntax and use.
  56. # config.vm.provision "shell", inline: <<-SHELL
  57. # apt-get update
  58. # apt-get install -y apache2
  59. # SHELL
  60. end

簡單來說,Vagrantfile 就是每一台的虛擬機的規格表。雖然乍看之下這個檔案長得有些驚悚,但仔細研究後會發現目前真正有用到的配置其實只有以下短短幾行而已:

  1. Vagrant.configure("2") do |config|
  2. config.vm.box = "bento/ubuntu-14.04"
  3. end

而這段程式碼就是告訴 Vagrant 我們想要用 bento/ubuntu-14.04 當作我們這台虛擬機的 box。每次我們啟動或部署 Vagrant 虛擬機時就是依據這一份設置文件來進行配置。其他在註解內的文字是一般我們在開發時常常用到的配置選項,隨著開發需要的不同,我們可以在這個配置文件中客製化我們的開發環境,並分享給團隊其他成員。

如何管理 Vagrant 虛擬機?

首先,我們可以使用 vagrant status 來確認當前 Vagrant 主機的運作狀況:

  1. $ vagrant status
  2. Current machine states:
  3. default running (virtualbox)
  4. The VM is running. To stop this VM, you can run `vagrant halt` to
  5. shut it down forcefully, or you can run `vagrant suspend` to simply
  6. suspend the virtual machine. In either case, to restart it again,
  7. simply run `vagrant up`.

我們可以清楚發現雖然虛擬機已經成功運行,但主機名稱顯示為 default。這種模糊的名稱在管理主機數量多起來後常常會造成開發者的困擾。為了避免混淆,我們可以先用 vagrant halt 將目前的虛擬機暫停或是使用 vagrant destroy 直接摧毀。接下來,在 Vagrantfile 中加入下列設置來替我們的虛擬機命名:

  1. config.vm.define "server"

接著在重新啟動一個新的主機後檢查其狀況:

  1. $ vagrant up
  2. $ vagrant status
  3. Current machine states:
  4. server running (virtualbox)
  5. The VM is running. To stop this VM, you can run `vagrant halt` to
  6. shut it down forcefully, or you can run `vagrant suspend` to simply
  7. suspend the virtual machine. In either case, to restart it again,
  8. simply run `vagrant up`.

將虛擬器命名除了方便我們在開發時清楚了解每個虛擬主機的功用,在未來我們也可以直接透過每個主機的別名進行操作。