简单地说,Vagrant让我们可以通过代码的方式快速地、可重复地创建针对不同虚拟环境的虚拟机,包括Virtualbox、AWS、Docker等。它使得我们可以一次性地、自动创建多个环境相同的虚拟机,对于软件开发和测试尤其有用。本文我们将以Virtualbox为例,看看Vagrant的基本使用。
(一)快速入门
首先需要创建一个目录用于存放Vagrantfile文件以及Vagrant在工作中的数据:
mkdir my-vagrant-project
cd my-vagrant-project
然后初始化Vagrant工程:
vagrant init Ubuntu/trusty64
该命令会在当前目录下创建Vagrantfile,并且指定所使用的box为ubuntu/trusty64,该box由Hashicorp官网提供。此时,Vagrant发现box的名字的格式为“用户名/box名”,则会使用“https://atlas.hashicorp.com/用户名/box名”来下载该box。对于非官网提供的box,可以通过以下命令创建:
vagrant init my-box https://boxes.company.com/my.box
其中,my-box为该box的名字,后面的URL为该box的下载地址。接下来就可以启动虚拟机了:
vagrant up
此时Vagrant会先从Hashicorp下载ubuntu/trusty64这个box(如果先前下载过了则跳过),然后启动虚拟机。在默认情况下,Virtualbox将作为provider,当然你也可以使用其他provider,比如以下命令将启动一个hyperv虚拟机:
vagrant up --provider hyperv
登录到虚拟机:
vagrant ssh
此时vagrant将使用默认的用户vagrant以及预设的SSH公钥密钥键值对直接登录虚拟机。
关闭虚拟机:
vagrant halt
删除虚拟机:
vagrant destroy
请注意,vagrant destroy只会删除虚拟机本身,也即你在Virtualbox将看不到该虚拟机,但是不会删除该虚拟机所使用的box。
Vagrant还会在Vagrantfile所在同级目录下创建一个.vagrant隐藏文件夹,该文件夹包含了在本地运行虚拟机的一些信息。如果使用了代码库管理(比如Git),这个.vagrant文件夹应该被ignore掉。
(二)添加和查看所下载的box
Vagrant会将所下载的box保存到~/.vagrant.d/boxes目录下,除了在执行“vagrant up”时Vagrant会下载box外,你也可以单独下载box到本地:
vagrant box add ubuntu/trusty64
这将从Hashicorp官网上下载ubuntu/trusty64这个box,你也可以指定一个另外的URL:
vagrant box add --name mybox
这里的mybox是一个逻辑名字,你可以用该名字来设置Vangrantfile的“config.vm.box”。
你可以在任何时候向Vagrant中添加新的box以备后用,在执行vagrant up时,Vagrant首先检查本地是有存在所需要的box,如果有则直接使用,如果没有则下载。
列出本地所有的box:
vagrant box list
删除某个box:
vagrant box remove box-name
(三)端口转发(Port Forwarding)
在默认情况下,Vagrant所创建的Virtualbox虚拟机使用的是NAT网络类型,即外界是不能直接访问你的虚拟机的,就连Host机器也访问不了。此时,如果你在虚拟机中启动的一个Tomcat来部署网站的测试环境,而又想外界能够访问的话,你需要使用端口转发:
Vagrant.configure("2") do |config|
config.vm.network "forwarded_port", guest: 8080, host: 8888
end
以上代码将Host机的8888端口转发到了虚拟机的8080端口,这样你便可以通过在Host机上访问:8888来访问虚拟机的Tomcat了。对于Virtualbox来说,只有NAT类型的网络类型支持端口转发,这也是为什么Vagrant创建的Virtualbox虚拟机默认都有一个支持NAT的虚拟网卡,原因就是要能够支持Vagrant级别的端口转发。另外,Vagrant在第一次尝试连接虚拟机时使用的也是NAT。
(四)共享文件夹
在默认情况下,Vagrant所创建的虚拟机已经为我们创建了一个共享文件夹,在虚拟机上是/home/vagrant目录,在Host机上则为Vagrantfile所在目录,当然你也可以额外添加另外的共享文件夹:
Vagrant.configure("2") do |config|
config.vm.synced_folder "src/", "/srv/website"
end
第一个参数为Host机器上的目录,第二个参数为虚拟机上的目录。
(五)Provision
简单地说,Provision即通过使用某些工具自动地、批量地为机器安装软件以及配置系统,它省去了人工安装和配置系统时的重复性和易错性,当然还享受了计算机与生俱来的速度。Vagrant提供多种方式对虚拟机进行Provision,包括Shell、Chef、Puppet和Ansible等。以Shell为例,既可以通过直接在Vagrantfile中编写Shell脚本的方式,也可以通过引用外部Shell文件的方式。
直接在Vagrantfile中编写Shell脚本,可以通过“inline”指定脚本内容:
Vagrant.configure("2") do |config|
# ... other configuration
config.vm.provision "shell", inline: "echo hello"
end
通过引用外部脚本文件的方式:
Vagrant.configure("2") do |config|
config.vm.provision "shell", path: "script.sh"
end