Seth Vargo 是一位开源程序员,毕业于卡内基梅隆大学。他专注于 Ruby 开发,曾为 Chef、CustomInk 和 HashiCorp 工作。在今年的 All Things Open 会议上,Seth 将会谈论 Vagrant。但是,Vagrant 是什么?为什么你应该关注它?
在本次访谈中了解更多。
什么是 Vagrant?
Vagrant 是一款用于创建和配置轻量级、可重现和可移植开发环境的工具。Vagrant 提供了一个统一的接口,用于使用命令行控制一个或多个虚拟机的生命周期。由于 Vagrant 是平台无关的,你可以与任何人共享同一个 Vagrantfile;无论他们使用 Windows、Linux 还是 Mac,都没有关系。
Vagrant 支持多种虚拟化技术,包括 VirtualBox 和 VMware。Vagrant 的可插拔特性使得社区能够为其他虚拟化技术提供支持,包括 Parallels、Amazon Web Services 和 libvrt。
Vagrant 如何帮助 Ruby 开发?它对其他类型的开发有用吗?
由于 Vagrant 是用 Ruby 编写的,用户经常认为 Vagrant 仅对 Ruby 开发有用。事实并非如此。Vagrant 对几乎任何开发环境都很有用。
根据敏捷成本曲线,在生产环境中修复错误的估计成本是在开发环境中修复同一错误的 150 倍。虽然软件(算法)错误很容易识别并编写快速测试,但它们并不是生产环境中发生的唯一类型的错误。第二常见的错误在于生产系统的配置,特别是生产系统和开发环境之间的配置差异。即使采用完美和精确的工程设计,软件包或操作系统版本的差异也可能在部署时导致灾难性后果。因此,人们通常会推动提高开发环境和生产环境之间的一致性。
Vagrant 是实现这一目标的完美工具,因为它使开发人员能够在其本地机器上使用他们熟悉的相同工具和编辑器,但在虚拟化层使用与生产环境相同的操作系统和软件包。结合像 Packer 这样的工具,可以在不牺牲本地开发技术的情况下实现近乎完美的生产环境一致性。换句话说,开发人员的工作流程不会受到干扰。
即使生产环境一致性不是问题,Vagrant 仍然是一个非常有用的工具。项目通常有许多依赖项需要在开发之前安装和配置。Docker 在这个领域越来越受欢迎;用户只需在项目存储库中使用预配置的 Dockerfile 运行 Docker 即可。Vagrant 的工作方式非常相似,但由于它位于虚拟化层,因此提供了额外的隔离层。如果你需要虚拟硬件(例如 USB 端口、音频或高级网络)、对 Linux 以外的操作系统的支持,或者虚拟化相对于容器化技术提供的额外隔离层,Vagrant 是一个绝佳的选择。
事实上,它们并非互斥。Vagrant 支持构建和运行 Docker,既可以作为提供者,也可以作为配置器。这意味着 Vagrant 可以创建 Docker 镜像,然后自动运行它们。如果你的系统无法原生运行 Docker,Vagrant 将自动配置一个能够运行 Docker 的虚拟机,并设置所有正确的连接返回到你的主机。这样,你既可以获得虚拟化的隔离性,又可以获得容器化的灵活性和速度。
最后,Vagrant 与你或你的组织可能已经使用的工具进行了深度集成。例如,Vagrant 对几乎所有主要的配置管理提供商都提供一流的支持,包括 Ansible、CFEngine、Chef、Puppet 和 SaltStack。例如,如果你已经使用 Chef 来配置你的基础设施,只需在 Vagrantfile 中添加几行代码,Vagrant 就会在你的本地开发环境中使用相同的 cookbooks 来配置生产环境基础设施。
你是什么时候“认可” Vagrant 的?作为用户,你是否立刻看到了它的价值,还是它的价值是逐渐显现的?
当我刚开始学习软件开发时,我经常搞砸。我认为搞砸是人的本性;这是一种很好的学习技巧。不幸的是,有时你会把你的本地系统搞砸到无法修复的地步。当我进入配置管理领域时,灾难发生的可能性大大增加。一方面,我非常兴奋地学习和探索一项新技术。另一方面,我非常害怕因为一个简单的错别字或误解,我需要那天第 50 次重装我的笔记本电脑。这种恐惧最终战胜了我,我停止了创新和迭代。即使我是一个人工作,我的反馈时间也增加了,我的周期减少了,我很快就变得没有效率;对搞砸自己机器的恐惧已经超过了我学习的意愿。
就在这时,我遇到了 Vagrant。
Vagrant 为我提供了快速迭代整个系统的能力,而无需接触我自己的系统。当时我是一个贫穷的大学生,Vagrant 和 VirtualBox 都是完全免费和开源的。这非常符合我的预算(0 美元)!
随着我对 Vagrant 的进一步探索,我也开始在我的软件项目中使用它。当我开始在一个团队中工作时,Vagrantfile 被证明是非常宝贵的。设计师可以启动一个网站,而无需安装任何东西。质量保证 (QA) 可以测试网站的 Beta 版本,而无需知道如何设置它。新开发人员可以在几个小时内而不是几天内入职。意识到所有这些都是由软件实现的,这是一个令人惊叹的时刻。
你喜欢的编程语言是什么?
这是一个难题。我的第一个答案是“所有语言”。我是一名多语言软件工程师,但目前我最常使用 Go 和 Ruby。我从不让我的经验或当前的技术决定未来技术的使用。对于一个新项目,我喜欢尝试新的编程语言。
你管理 Vagrant 开发机器的工作流程是什么?
我有一个 Vagrantfile,它为虚拟机创建配置。我通常使用 shell 脚本,但对于更复杂的情况,我将使用带有内置 Chef provision 的 Chef cookbook。所有代码都位于我的本地机器上,我使用 Sublime Text、iTerm,以及五年积累的 shell 快捷方式和自定义设置。我的本地机器与 Vagrant 创建的虚拟机共享一个文件夹。代码在 VM 中执行,但源文件在我的本地机器上控制。
你使用什么版本控制系统?
我主要使用 Git,尽管我过去也使用过 SVN 和 Mercurial。
新 Vagrant 用户常犯的最大错误是什么?
与其说是错误,不如说是一种误解,我认为许多 Vagrant 用户认为它对于他们的用例来说太重了,他们会求助于 shell 脚本或 README 中的说明。这种方法的问题在于它很快就会过时,它是操作系统特定的,并且往往会导致“在我的机器上可以工作”这句话。
新用户应该什么时候开始使用 Vagrant?立即开始,还是这是一个应该逐步掌握的高级工具?
Vagrant 是为初学者设计的,但功能强大到足以满足最有经验的开发人员的需求。Vagrant 为新用户定义了一条快乐的路径,它将所有旋钮调整到最可能的配置。这可能并不总是最快、最安全或性能最高的配置,但它是最有可能在用户无需自定义任何内容的情况下工作的配置。Vagrant 的工作流程应该始终是
$ vagrant up
高级用户有能力调整这些旋钮,使 Vagrant 更安全、性能更高、更自定义。Vagrant 将几乎所有配置选项作为 Vagrantfile DSL 的一部分公开,并且 它们都有文档记录。
这一切都是为了说明 Vagrant 会随着用户一起发展。随着开发需求的变化,Vagrant 能够适应,因此尽早采用 Vagrant 并让它与项目一起成长并没有什么坏处。
你是如何参与开源的?
当我在卡内基梅隆大学读本科时,我有两位教授是开源的支持者:Larry Heimann 教授和 Jeria Quesenberry 教授。我参与了许多开源项目,并回馈社区。我的第一个实习是在 T 恤公司 CustomInk,他们也是开源的支持者,既是消费者又是生产者。我在那里工作期间有机会参与许多开源项目。从那时起,我只为生产开源软件的组织工作。
演讲者访谈
本文是 All Things Open 演讲者访谈 系列的一部分。All Things Open 是一个探索企业中的开源、开放技术和开放网络的会议.
3 条评论