Vagrantfile 的主要用途是描述用于项目的机器类型,以及如何配置和提供这些机器。
Vagrant 的每个项目运行一个 Vagrantfile,并且 Vagrantfile 应该被提交到版本控制。这允许参与该项目的其他开发人员检查代码,运行 vagrant up
。Vagrantfile 可以在 Vagrant 支持的每个平台上移植。
Vagrantfiles 的语法是 Ruby,但对 Vagrantfile 进行修改并不需要有关 Ruby 编程语言的知识,因为基本上只需要简单的变量赋值。
1. 查找路径
运行 vagrant 命令时,Vagrant 会从当前目录开始依次查找目录树,寻找第一个匹配的 Vagrantfile。假如在 /home/mitchellh/projects/foo
目录中运行 vagrant,会依次在下面的目录中查找 Vagrantfile,直到找到为止:
/home/mitchellh/projects/foo/Vagrantfile
/home/mitchellh/projects/Vagrantfile
/home/mitchellh/Vagrantfile
/home/Vagrantfile
/Vagrantfile
这个特征使得你可以在项目的任何目录中运行 vagrant。
可以设置 VAGRANT_CWD 环境变量指向某个其他路径,来改变 Vagrant 查找 Vagrantfile 文件的起始目录。
2. 加载顺序和合并
必须理解的一个重要概念是 Vagrant 如何加载 Vagrantfile。Vagrant 实际上加载了一系列的 Vagrantfile,并将合并设置。这允许具有不同特异性等级的 Vagrantfile 覆盖之前的设置。Vagrantfile 按以下所示顺序加载。注意,如果在任何步骤中未找到 Vagrantfile,Vagrant 将继续执行下一步。
- 与用于给定机器的 box 一起打包的 Vagrantfile。
- Vagrant 主目录中的 Vagrantfile(默认为
~/.vagrant.d
)。这使你可以为系统用户指定一些默认值。 - 项目目录中的 Vagrantfile。通常,你只需要修改这个 Vagrantfile。
- 多台机器覆盖,如果有多台机器的话。
- 特定 provider 的覆盖,如果有的话。
在每个级别,设置将与之前的值合并。具体细节取决于设置类型。对于大多数设置,较新的设置将覆盖较旧的设置。但是,对于诸如定义网络之类的事情,网络实际上是相互追加。默认情况下,应该假定设置将相互覆盖。如果行为不同,将在相关文档部分注明。
在每个 Vagrantfile 中,可以指定多个 Vagrant.configure
块。所有配置将按照它们定义的顺序在单个 Vagrantfile 中合并。