Vagrant is a tool for building and managing virtual machine environments in a single workflow. With an easy-to-use workflow and focus on automation, Vagrant lowers development environment setup time, increases production parity, and makes the “works on my machine” excuse a relic of the past.
Vagrant是一个在单一工作流中创建和管理虚拟机环境的工具。通过简单易用的工作流和对自动化的关注,Vagrant可以减少开发环境的配置时间,增加生产平价,并且使得"works on my machine"这个借口成为过去。

为什么使用Vagrant

Vagrant提供了一种易于配置、可复用、编写的工作环境。它是建立在行业标准技术和单一一致工作流控制的基础上,可以使得你和你团队的生产力和灵活性最大化。
Vagrang是站在了巨人的肩膀上实现了这些需求。配置的虚拟机是基于VirtualBox, VMware, AWS和其他的一些提供商。然后,行业标准配置工具(如shell脚本,Cher或者Puppte),可以自动在虚拟机上安装和配置软件。

如果你是一名开发者,只要你创建了一个Vagrantfile,然后只要运行vagrant up,你配置的软件都会自动安装好。你还可以把Vagrantfile传给你团队里面的其他人,这样你们团队人都可以在一个相同的环境里面进行开发了。可以对"works on my machine"说再见了。
如果你是一名运维或者DevOps开发,Vagrant可以给你一个一次性环境和一致的工作流程,用于开发和测试脚本。你可以在本地虚拟化技术如VirtualBox或者VMware上快速测试shell脚本,Chef或者Puppet。然后使用相同的配置去远程机器上测试。

QuickStart

安装

去https://www.vagrantup.com/downloads.html ,下载系统对应版本的Vagrant安装即可

相关命令

  • vagrant init centos/7
    初始化Vagrantfile,init后面的名字可以在https://app.vagrantup.com/boxes/search 里面找到,可以选择很多系统。一个Vagrantfile可以配置多台虚拟机
  • vagrant up [name]
    启动虚拟机,可以加上name,name是Vagrantfile里面虚拟机的名称(下面的命令里面的name也是一样),那么就只启动name这台机器。不然默认是Vagrantfile里面的机器都启动。
    -provider=vmware_fusion,加上-provider参数可以指定只有什么虚拟器。但是要注意vagrant要使用vmware的虚拟机的脚本是收费的,所以还是推荐virtual box。
  • vagrant ssh [name]
    ssh到虚拟机
  • vagrant suspend [name]
    暂停虚拟机
  • vagrant halt [name]
    关闭虚拟机
  • vagrant destroy [name]
    删除虚拟机
  • vagrant plugin list
    列出所有的vagrant插件
  • vagrant plugin install vagrant-scp
    安装插件,因为网络原因,可能会需要一点时间。

Vagrantfile配置

一个简单Vagrantfile例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.require_version ">= 1.6.0"

boxes = [
    {
        # 虚拟机的名称,ip,内存和cpu
        :name => "docker-node1",
        :eth1 => "192.168.205.10",
        :mem => "1024",
        :cpu => "1"
    },
    {
        :name => "docker-node2",
        :eth1 => "192.168.205.11",
        :mem => "1024",
        :cpu => "1"
    }
]

Vagrant.configure(2) do |config|
  # 系统版本
  config.vm.box = "centos/7"

  boxes.each do |opts|
      config.vm.define opts[:name] do |config|
        config.vm.hostname = opts[:name]
        config.vm.provider "vmware_fusion" do |v|
          v.vmx["memsize"] = opts[:mem]
          v.vmx["numvcpus"] = opts[:cpu]
        end

        config.vm.provider "virtualbox" do |v|
          v.customize ["modifyvm", :id, "--memory", opts[:mem]]
          v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
        end

        config.vm.network :private_network, ip: opts[:eth1]
      end
  end

  # 映射外部文件夹
  config.vm.synced_folder "../../lab001", "/home/vagrant/lab001"

  # 运行外部脚本(比如安装软件等)
  config.vm.provision "shell", privileged: true, path: "./setup.sh"
end

插件

vagrant-vbguest

vagrant up的时候可能会遇到vagrant was unable to mount VirtualBox shared folders的错误,安装了这个插件再vagrant up应该就好了

vagrant-scp

可以给vagrant虚拟机传文件
vagrant scp ../lab005/ docker-node1:/home/vagrant/lab005,可以把本地的lab005传送到docker-node1这台虚拟机里面

参考资料

  1. vagrant文档:https://www.vagrantup.com/docs/index.html
  2. vagrant的所有镜像:https://app.vagrantup.com/boxes/search
  3. unable to mount VirtualBox shared folders错误:https://github.com/scotch-io/scotch-box/issues/296
  4. vagrant-scp主页:https://github.com/invernizzi/vagrant-scp