Vagrant简易教程

Vagrant是什么

Vagrant是一个软件,可以自动化虚拟机的安装和配置流程。目前市面上个人PC的主流操作系统不是Windows就是MacOS。对于这些用户,如果需要用Linux环境进行开发或学习,使用虚拟机无疑是最方便的选择。而Vagrant更进一步,可以让你通过编写一个Vagrantfile来控制虚拟机的启动、虚拟机网络环境的配置、虚拟机与主机间的文件共享,以及启动后自动执行一些配置脚本,比如自动执行一个shell script来安装一些必备的开发工具,如Mysql。这意味着,当你需要在多台机器间同步开发进度时,只需要同步Vagrantfile,就可以保证各台机器拥有一致的开发环境。另外,即便对于计算机小白用户,Vagrant也是一个利器。以前我们为了学习一门语言,必须先手动安装这门语言的编译环境。这期间的各种痛苦想必各位深有体会。有了Vagrant后,我们可以下载别人写好的Vagrantfile,然后运行vagrant up,vagrant就会自动下载虚拟机镜像,自动加载镜像并配置虚拟机,然后交给我们一个即开即用的学习环境。这样,由于使用了教师调试好的学习环境,小白们就可以免受环境相关的各种Bug的困扰,这无疑会提高学习效率。

这个教程总结了Vagrant的基本使用方法。

术语

  1. 终端:Windows中指CMD、PowerShell等,MacOS中指Terminal。
  2. ~:指操作系统的HOME路径。比如Windows10中,假设用户名为abc,那么~实际对应的应该是C:\Users\abc\
  3. []:后文会见到形如commandA [commandB [commandC]]的指令。一般写在[]的都是可选指令。而嵌套的[]则表示,更深一级的可选指令只有在上一级的可选指令得到指定后才能指定。比如,之前的指令中,commandC只有在commandB存在时才能出现。

Vagrant的依赖程序

既然是配置虚拟机,那么自然需要虚拟机程序和被虚拟的操作系统镜像(Image)。前者常用的选择有VirtualBox和VMWare,后者则包括Ubuntu、FreeBSD等等。Vagrant称前者为provider,称后者为box。原则上,我们可以自由搭配providerbox,但由于VirtualBox开源且免费,Vagrant将其作为默认的provider。所以,一般会先安装VirtualBox,再安装Vagrant。

Vagrant的基本概念

假设我们使用VirtualBox作为provider。

安装好Vagrant后,新建一个空文件夹,将其路径视作项目的根路径。然后运行终端并进入这个路径,键入vagrant init,此文件夹中会多出一个Vagrantfile。用文本编辑器打开后,会发现该文件由ruby语言编写,且大部分行都被注释掉。一般未注释的内容如下:

Vagrant.configure("2") do |config|
    config.vm.box = "base"
end 

解释如下:

  1. do...end结构在ruby中称为块(block),可以简单理解为Vagrant.configure("2")执行到某一步时程序被挂起,并将一个需要配置的对象交给块,由块内的语句进行具体配置,当块内的语句依次执行完后,配置好的对象又被交回给Vagrant.configure("2"),之前被挂起的程序则继续执行直到完毕。
  2. .configure("2")中的2是指配置文件的语法规则的版本。虽然是基于ruby,Vagrantfile仍然有一套自己的语法细则。按照时间先后来说,目前(2016年7月)有V1与V2两套配置语法。自然新的语法更先进。所以目前最新版本的Vagrant(1.8.4)默认使用V2规则。也许未来还会有V3、V4……
  3. config.vm.box直译过来即“配置虚拟机盒子”,因此这一步指定将要使用哪个虚拟机镜像(box)。接下来详细解释下Vagrant如何管理boxes。

Box

先回忆下虚拟机的基本使用方法。一般我们会从网上下载某个虚拟机的安装镜像到本地,文件名为***.iso,然后使用VirtualBox加载镜像并安装操作系统到虚拟机中,期间可能涉及到网卡、USB等虚拟硬件的配置。之后就可以正常的使用这个虚拟的系统了。这一过程基本类似于使用安装盘在一台真实的电脑上安装系统。但Vagrant使用的镜像并不是待安装的系统镜像,而是从虚拟机中导出的、对已经安装配置好的操作系统的快照,以.box作为扩展名。这类似于Windows中完整的系统备份所产生的镜像文件。.box文件不过是个压缩文件包,里面除了基础数据的镜像外,还包括一些元数据文件,用来指导Vagrant将系统镜像正确的加载到对应的provider中。因此,每个.box都有自己对应的provider。我们当然可以从最原始的安装镜像开始,一步步制作自己的.box镜像。但这一过程比较麻烦,详情可参见官方文档CREATING A BASE BOX。幸运的是,Vagrant官网提供了许多制作好的box文件。参见https://atlas.hashicorp.com/boxes/search。选择时注意box与provider的对应关系。

接下来介绍如何添加box文件到Vagrant的box管理系统中。

基本语法:vagrant box add {title} {url}。其中,title是box文件在Vagrant中的名字,必须唯一。url是box的物理地址,可以是一个网址,也可以是本地的一个文件路径。当url是网址时,vagrant会调用内置的下载模块从服务器下载镜像到本地,Vagrant官网中提供的box都只能通过指定网址在线安装。无论是哪种方式,原始的box文件都会被放在~\.vagrant.d路径下。指令vagrant box list可以查看所有已添加的box。

添加完box后,便可以将Vagrantfile中的config.vm.box赋值为该box的title。另外,你还可以更灵活的指定box。比如,vagrant init的完整指令是vagrant init [options] [name [url]]。再比如,Vagranfile中也可以给config.vm.box_url赋值。

回忆之前自动生成的Vagrantfile,config.vm.box被默认赋值为base。这意味着当Vagrant调用名为base的box且发现本地没有时,它会自动远程安装一个box并命名为base

Up

前面的章节解释了选项config.vm.box。实际上,Vagrantfile中有大量的选项可以指定。其中,比较重要的有config.vm.share_folderconfig.vm.networkconfig.vm.provision等。这一节略过不表。

写好Vagrantfile后,在项目的根目录下运行vagrant up,Vagrant便会依据Vagrantfile中的指令来搭建虚拟机环境。

第一步当然是载入box文件。之前说过,添加到Vagrant系统中的box会被统一保存在文件夹~\.vagrant.d。而这一步,则是根据指定的box文件中的元数据,使用相关的provider来载入系统镜像。这意味着系统镜像的数据又被复制一遍,并交给provider管理。也就是说,如果我们使用同一个box创建N个开发环境,那么同一份基础数据会被复制N遍。这种处理方式固然造成数据的冗余,但优点也很突出,即保证了每个开发环境的独立性。另外,vagrant up只有在第一次执行时才会复制box镜像。而且这之后,如果打开provider程序(这里指VirtualBox),你会看到虚拟机中多了一个以项目所在文件夹的名字为前缀命名的系统镜像。

第一步之后,Vagrant还会进一步完成文件夹共享、网络通信等项目的配置。注意到,除了第一次的up会完整的执行所有指令外,为了节省启动成本,除非显示指定,此后的up中Vagrant会自动跳过那些不需要反复执行的配置指令。

up的逆操作是destroy。顾名思义,在项目的根目录下运行vagrant destroy,Vagrant会将box从provider中卸载并删除。但destroy并不会清楚共享文件夹中的内容。所谓共享文件夹,即虚拟机与宿主机间共享的一个文件夹。任何一方均可对该文件夹操作,其更改对另一方实时可见。

Provision

这一步相当于自动执行“安装各类软件”、“调整系统设置”等步骤。其实,这一步的操作结果可以被打包到box中,从而完全避免Provision。比如,我们既可以在Provision中安装Python,也可以直接将一个已经安装好Python的系统打包为box,然后使用该box创建虚拟机。两种方式各有优劣,显然前者更灵活、更轻量。毕竟,不是所有打包到box中的功能都为用户所需。使用Provision可以最大限度的“按需定制”。

在这一步,Vagrant会可能需要调用第三方的Provision System,比如Chef、Puppet。而最基本的Provision可以通过shell script来指定,反映在Vagrantfile中,便是如下的代码:

Vagrant.configure("2") do |config|
  ...
  config.vm.provision "shell", inline: "echo Hello, World"
  config.vm.provision "shell", path: "script.sh"
  ...
end

其中,inline表示script直接写在Vagrantfile中,而path则表示script被写在指定的文件中。

Provision可以说是自动装机的核心步骤,Vagrant则提供了一个方便的接口。

小结

这个教程旨在帮助小白们更好的理解拿到手的Vagrantfile。未来可能会结合自己的使用经验添加章节。欢迎评论。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容

  • 开发需要在各种系统上进行开发任务,运维则需要在各种系统上学习工具使用。因此,虚拟机恐怕也是 IT 人员最常使用的工...
    李广慧阅读 5,432评论 3 24
  • 1,介绍Vagrant 我们做web开发的时候经常要安装各种本地测试环境,比如apache,php,mysql,r...
    meng_philip123阅读 2,421评论 0 12
  • 最近服务器老是宕机,学习的时候很多环境有需要集群,忍无可忍的情况下终于决定自己装一波虚拟机宫学习使用。本人系统为D...
    行书以鉴阅读 1,850评论 0 1
  • 留下诗文,梅凉为你写长评以来 这应该是最让我觉得棘手的诗评,搞不好我就要遭遇诗评路上第一个滑铁卢。 路人锋 的诗不...
    梅凉阅读 561评论 29 17
  • 1.早上,给在汽车站的残疾人捐款一元。 2.晚上回家,给一个躺在天悦酒店的乞丐捐款一元。 3.晚上回家,给南门公园...
    心灵陪伴阅读 88评论 0 0