Vagrant
Vagrant 是一款用於管理和配置虛擬化開發環境的工具。
Vagrant 包含「服務商」 (providers) 概念。此概念直接映射到虛擬化引擎及其 API。在所有服務商中,VirtualBox 的普及率最高且支持最為完善。如需使用libvirt、lxc 或 vmware 等其他引擎,需安裝相應的插件。
Vagrant 主要通過聲明式的 Vagrantfile 來定義虛擬機。只需編寫單個 Vagrantfile,即可定義多台虛擬機
安裝
配置
可以通過環境變量來管理 Vagrant。如需查看完整的選項列表,參見官方文檔。
例如,若要更改 Vagrant 存儲大文件的路徑,需將 VAGRAN_HOME 設置為合適的目錄(默認路徑為 ~/.vagrant.d)。
插件
Vagrant 採用中間件架構,以提供強大的插件支持。
使用 Vagrant 內置的插件管理器安裝插件。如需同時安裝多個插件,需在命令後依次指定:
$ vagrant plugin install vagrant-vbguest vagrant-share
vagrant-libvirt
Vagrant failed to properly resolve required dependencies
為避免此兼容性問題,可根據官方文檔的說明,通過 Podman 或 Docker 使用容器鏡像作為替代方案。
此插件為 Vagrant 增加了 libvirt 服務商支持。使用此服務商前,必須先安裝並配置好 libvirt 及其相關軟體包(如 QEMU)。
安裝此插件前,務必確認已安裝 base-devel包 並已啟動 libvirtd.service。隨後執行:
$ vagrant plugin install vagrant-libvirt
插件安裝完成後,即可使用 libvirt 服務商:
$ vagrant up --provider=libvirt
若遇到依賴版本不匹配的問題,可設置以下環境變量以忽略 gem 版本限制:
export VAGRANT_DISABLE_STRICT_DEPENDENCY_ENFORCEMENT=1
若遇到 ruby-libvirt 構建失敗的問題,可嘗試執行以下命令(根據需要將命令中的 lib 替換為 lib64):
$ CONFIGURE_ARGS='with-ldflags=-L/opt/vagrant/embedded/lib with-libvirt-include=/usr/include/libvirt with-libvirt-lib=/usr/lib' \
GEM_HOME=~/.vagrant.d/gems \
GEM_PATH=$GEM_HOME:/opt/vagrant/embedded/gems \
PATH=/opt/vagrant/embedded/bin:$PATH \
vagrant plugin install vagrant-libvirt
若需查看更多故障排除指南,請參考[1]。
vagrant-lxc
先從官方倉庫安裝 lxc包,隨後執行:
$ vagrant plugin install vagrant-lxc
接下來,按照官方倉庫的指引配置 lxc。配置完成後,可通過如下 Vagrantfile 使用此插件:
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure("2") do |config|
config.vm.define "main" do |config|
config.vm.box = 'http://bit.ly/vagrant-lxc-wheezy64-2013-10-23'
config.vm.provider :lxc do |lxc|
lxc.customize 'cgroup.memory.limit_in_bytes', '512M'
end
config.vm.provision :shell do |shell|
shell.path = 'provision.sh'
end
end
end
provision.sh 文件應為放置在 Vagrantfile 同級目錄下的 Shell 腳本。在此腳本中編寫所需的初始化配置。例如,若要卸載上述 box 中自帶的 puppet,可編寫如下內容:
rm /etc/apt/sources.list.d/puppetlabs.list apt-get purge -y puppet facter hiera puppet-common puppetlabs-release ruby-rgen
配置自動化
通過使用「配置器」 (Provisioners),可在執行 vagrant up 的過程中自動安裝軟體、修改並自動化配置。最常見的配置器為 puppet包。
Vagrant 基礎鏡像
以下是獲取各種用途(開發、測試或生產環境) Vagrant 基礎鏡像 (vagrant base boxes) 的站點列表:
- 維護良好且持續更新的 Arch Linux x86_64 Vagrant 基礎鏡像。
- Vagrant Cloud - HashiCorp 的官方 Vagrant 鏡像站點。在此可瀏覽用戶提交的鏡像或上傳自製鏡像。單個 Vagrant Cloud 鏡像可通過版本控制支持多個服務商。
- vagrantbox.es - Vagrant 基礎鏡像列表。此項目由 Gareth Rushgrove (@garethr) 發起,託管於 Heroku 並使用 Nginx 服務。其背後故事參見:Vagrantbox.es 的故事。
- Puppet Labs Vagrant Boxes - 由 Puppet Labs 團隊製作、開箱即用的預製 Vagrant 鏡像。
- Vagrant Ubuntu Cloud Images - 自 2013 年 1 月起上線。Canonical 尚未正式推廣(現已停止生命周期 (EOL) 或標準支持 (EOSS))
- Github 上的 packer-arch 項目 - 提供配置文件,以便使用 packer包 基於官方 ISO 鏡像構建輕量級 Arch Linux Vagrant 鏡像。
故障排除
主機與 Vagrant 虛擬機之間無法 Ping 通(僅主機網絡模式)
有時會出現僅主機網絡 (host-only networking) 無法正常工作的問題。表現為主機在 vboxnet 接口上沒有 IP 地址,主機無法 Ping 通 Vagrant 虛擬機,虛擬機也無法 Ping 通主機。根據 kevin1024 在此討論串中的提示,安裝 net-tools包 軟體包即可解決。
無法從 Arch 主機系統通過網絡訪問虛擬機
自 1.8.4 版本起,Vagrant 似乎仍在通過已棄用的 route 命令來配置連接至虛擬機的橋接路由。若未安裝 route,將因缺少相應路由而導致無法從主機系統訪問虛擬機。解決方法如前文所述,安裝包含 route 命令的 net-tools包 軟體包即可。
執行 "vagrant up" 停滯在 NFS 掛載階段 (Mounting NFS shared folders...)
安裝 nfs-utils包 軟體包可能會解決此問題。
同時務必確認連接未被 iptables包 或 nftables包 攔截。若同時使用 libvirt 和 firewalld,須為 libvirt 區域(zone)放行 nfs(nfs3)、rpc-bind 和 mountd 服務。
掛載 NFS 共享文件夾報錯:mount.nfs: requested NFS version or transport protocol is not supported
安裝 nfs-utils包 軟體包。編輯 /etc/nfs.conf 並取消以下幾行的注釋,以啟用(v3 和)UDP 支持:
[nfsd] vers3=y udp=y
隨後Restart nfs-server.service 以立即應用更改。
啟動網絡"default"報錯:internal error: Failed to initialize a valid firewall backend
通常原因為未安裝防火牆依賴。安裝 iptables包 和 dnsmasq包 軟體包,隨後重啟 libvirtd.service 單元。
無法通過 SSH 連接至 Vagrant 客戶機
檢查 BIOS 中是否已經開啟虛擬化支持。雖然 Vagrant 提示虛擬機已啟動,但這並不意味著虛擬化一切正常。部分 Vagrant 鏡像(例如 tantegerda1/archlinux)在未開啟 CPU 虛擬化時,仍能運行到 SSH 階段才報錯
報錯:Could not get preferred machine for domain
Error while creating domain: Error saving the server: Call to virDomainDefineXML failed: could not get preferred machine for domain
檢查 BIOS 中是否已開啟虛擬化支持。