跳至內容

Vagrant

出自 Arch Linux 中文维基

Vagrant 是一款用於管理和配置虛擬化開發環境的工具。

Vagrant 包含「服務商」 (providers) 概念。此概念直接映射到虛擬化引擎及其 API。在所有服務商中,VirtualBox 的普及率最高且支持最為完善。如需使用libvirt、lxc 或 vmware 等其他引擎,需安裝相應的插件。

Vagrant 主要通過聲明式的 Vagrantfile 來定義虛擬機。只需編寫單個 Vagrantfile,即可定義多台虛擬機

安裝

安裝 vagrantAUR 軟體包。

配置

可以通過環境變量來管理 Vagrant。如需查看完整的選項列表,參見官方文檔。

例如,若要更改 Vagrant 存儲大文件的路徑,需將 VAGRAN_HOME 設置為合適的目錄(默認路徑為 ~/.vagrant.d)。

插件

Vagrant 採用中間件架構,以提供強大的插件支持。

使用 Vagrant 內置的插件管理器安裝插件。如需同時安裝多個插件,需在命令後依次指定:

$ vagrant plugin install vagrant-vbguest vagrant-share

vagrant-libvirt

注意:因 Arch 倉庫中最新版 vagrantAUR 包附帶的 ruby gem 存在兼容性問題,當前可能導致 libvirt 插件報錯,例如:Vagrant failed to properly resolve required dependencies

為避免此兼容性問題,可根據官方文檔的說明,通過 Podman 或 Docker 使用容器鏡像作為替代方案。

注意:此問題現已修復(至少自 vagrant 2.4.5-1 版本起已恢復正常)

此插件為 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 使用此插件:

這篇文章的某些內容需要擴充。

原因:此處使用的是任意鏡像。後續應補充透明倉庫的連結,或添加如何構建自定義鏡像的說明。 (在 Talk:Vagrant 中討論)
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) 的站點列表:

  • Vagrant Cloud - HashiCorp 的官方 Vagrant 鏡像站點。在此可瀏覽用戶提交的鏡像或上傳自製鏡像。單個 Vagrant Cloud 鏡像可通過版本控制支持多個服務商。
  • Bento - 一個封裝了用於構建 Vagrant 基礎鏡像的 Packer 模板的項目。部分模板已構建並發布至 Vagrant Cloud 上的 bento 組織。
  • Vagrant Ubuntu Cloud Images - 自 2013 年 1 月起上線。Canonical 尚未正式推廣(現已停止生命周期 (EOL) 或標準支持 (EOSS))

故障排除

主機與 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 中是否已開啟虛擬化支持。

另見