Vagrant

来自 ArchWiki

Vagrant 是一个用于管理和配置虚拟化开发环境的工具。

Vagrant 具有“提供程序”的概念,它映射到虚拟化引擎及其 API。最流行和得到良好支持的提供程序是 Virtualbox;存在 插件 用于 libvirtlxcvmware 等。

Vagrant 使用主要声明式的 Vagrantfile 来定义虚拟化机器。单个 Vagrantfile 可以定义多个机器。

安装

安装 vagrant 软件包。

配置

Vagrant 通过 环境变量 进行配置。请参阅 官方文档 中的完整选项列表。

例如,要更改 Vagrant 存储其“可能很大”文件的位置,请将 VAGRANT_HOME 设置为合适的目录。(默认值为 ~/.vagrant.d)。

插件

Vagrant 具有中间件架构,为强大的 插件 提供支持。

插件可以使用 Vagrant 的内置插件管理器进行安装。您可以指定要安装的多个插件

$ vagrant plugin install vagrant-vbguest vagrant-share

vagrant-libvirt

注意: libvirt 插件与 Arch 仓库中 vagrant 软件包当前附带的 ruby gems 不兼容(这些 gems 是最新的)。这可能会导致错误,例如 Vagrant failed to properly resolve required dependencies

为了在没有此类问题的情况下使用此插件,另一种方法是通过 Podman 或 Docker 使用容器镜像,如官方文档 [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

请参阅 [2] 以获取更多故障排除信息。

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 脚本。执行任何适当的设置;例如,删除 puppet,它已打包在上面的 box 中

rm /etc/apt/sources.list.d/puppetlabs.list
apt-get purge -y puppet facter hiera puppet-common puppetlabs-release ruby-rgen

配置

配置器允许您在 vagrant up 过程中自动安装软件、更改和自动化配置。最常见的配置器是 puppet

Vagrant 的基础 Box

这里列出了获取各种 Vagrant 基础 Box 的位置,用于不同的目的:开发、测试,甚至生产。

  • Vagrant Cloud 是 HashiCorp 官方的 Vagrant Box 站点。您可以浏览用户提交的 Box 或上传您自己的 Box。单个 Vagrant Cloud Box 可以支持具有版本控制的多个提供程序。
  • Bento 是一个项目,它封装了用于构建 Vagrant 基础 Box 的 Packer 模板。模板的子集被构建并发布到 Vagrant Cloud 上的 bento org
  • Vagrant Ubuntu 云镜像——自 2013 年 1 月以来一直存在。由于某种原因,Canonical 尚未正式推广它,可能仍处于 beta 阶段。请记住,这些是原始镜像,如果没有 Chef 或 Puppet,则不是很有用。

故障排除

主机和 Vagrant Box 之间无 ping (仅主机网络)

有时仅主机网络无法正常工作。主机在 vboxnet 接口上没有 ip,主机无法 ping Vagrant Box,也无法从 Vagrant Box ping 通主机。通过安装旧的 net-tools 可以解决此问题,如 kevin1024 在 此帖 中所述

虚拟机无法从 Arch 主机操作系统进行网络访问

从 1.8.4 版本开始,Vagrant 似乎使用已弃用的 route 命令来配置到虚拟网络接口的路由,该接口桥接到虚拟机。如果未安装 route,则由于缺少合适的路由,您将无法从主机操作系统访问虚拟机。如上所述,解决方案是安装包含 route 命令的 net-tools 软件包。

'vagrant up' 卡在 NFS 挂载 (正在挂载 NFS 共享文件夹...)

安装 nfs-utils 软件包可能会解决此问题。

确保连接未被 iptablesnftables 阻止。如果您将 libvirtfirewalld 一起使用,请为 libvirt 区域启用 nfs (nfs3)、rpc-bindmountd

挂载 NFS 共享文件夹: mount.nfs: 请求的 NFS 版本或传输协议不受支持

安装 nfs-utils 软件包。通过编辑 /etc/nfs.conf 并取消注释以下行来启用(v3 和)UDP 支持

[nfsd]
vers3=y
udp=y

重启 nfs-server.service 以立即应用更改。

启动网络 'default' 时出错: 内部错误: 初始化有效的防火墙后端失败

防火墙依赖项很可能未安装。 安装 iptables-nftdnsmasq 软件包并重启 libvirtd.service 单元。

无法 SSH 连接到 Vagrant 虚拟机

检查 BIOS 中是否启用了虚拟化。因为 Vagrant 报告 vm 虚拟机已启动,您可能会认为虚拟化一切正常,但某些 Vagrant Box(例如 tantegerda1/archlinux)允许您一直进入 ssh 阶段,然后 cpu 虚拟化功能的缺乏才会给您带来麻烦。

无法获取域的首选机器

Error while creating domain: Error saving the server: Call to virDomainDefineXML failed: could not get preferred machine for domain

检查 BIOS 中是否启用了虚拟化。

参见