vagrant是什么?

vagrant是一个管理虚拟化软件的软件,vagrant本身并没有虚拟化的能力,它是通过调用虚拟化软件(比如VMWare、Virtual Box等)的API,来实现虚拟化的。


vagrant中的概念


windows上安装vagrant

install-cygwin-3.jpg

vagrant依赖rsync,rsync依赖ssh,并且两个软件包都在net分类下,所以可以将net分类下的软件包全部安装。选择要安装的软件包之后,setup程序就会自动的下载和安装它们。
至此,cygwin就安装完成了。如果想要升级或安装新的软件包,也是使用上面的方法


快速入门

1,建立vagrant项目目录:

mkdir vagrant_project
cd vagrant_project/

2,创建Vagrantfile

vagrant init [name [url]]

并且可以使用vagrant box add命令将一个本地的或远程主机上的box,添加到本地仓库中;也可以使用vagrant box remove命令将一个box从本地仓库移除。

3,创建和启动虚拟机实例

vagrant up

vagrant将VirtualBox作为默认的provider,可以使用vagrant up--provider选项,指定其它的provider,比如以下命令将启动一个hyperv虚拟机:

vagrant up --provider hyperv

在启动虚拟机之后,vagrant会在Vagrantfile所在的目录下,创建.vagrant/隐藏目录。该目录用于保存虚拟机的一些信息,比如ssh的私钥,虚拟机实例的id等

4,登陆虚拟机

vagrant ssh

也可以到.vagrant/目录下找到ssh的私钥(用户名会在vagrant up的标准输出中打印出来),然后通过其他的ssh客户端,使用私钥进行登陆。

5,关闭虚拟机

vagrant halt

6,销毁虚拟机

vagrant destroy

销毁虚拟机只会删除虚拟机本身,不会删除虚拟机所使用的box。


Vagrantfile配置详解

1,网络配置
vagrant支持三种网络配置:

config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "private_network", ip: "192.168.21.4"
config.vm.network "public_network", ip: "192.168.1.120"

在使用桥接的时候,如果宿主机有多张网卡,执行vagrant up时,vagrant会询问将要桥接到哪张网卡,如果不想要这种交互,可以在Vagrantfile中进行配置:

config.vm.network "public_network", bridge: ["Dell Wireless 1802 802.11a/b/g/n Adapter"]

2,在一个Vagrantfile中管理多台虚拟机
在Vagrantfile中,可以使用config.vm.define定义多个不同的虚拟机。下面是一个例子:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
    config.vm.box = "centos7"
    config.vm.synced_folder "../data", "/data"
    config.vm.network "public_network"
    config.vm.provision "shell", path: "provision.sh"

    vms=Array(100..106)
    vms.each do |seq|
        config.vm.define :"hadoop-#{seq}" do |hadoop|
            hadoop.vm.hostname = "hadoop-#{seq}"
            hadoop.vm.network "private_network", ip: "192.168.100.#{seq}"
            # hadoop.vm.network "forwarded_port", guest: "22", host: (3333+seq).to_s
            hadoop.vm.provider "virtualbox" do |vb|
                vb.customize ["modifyvm", :id, "--name", "hadoop-#{seq}"]
                vb.gui = false
                if seq == 100
                    vb.memory = "1024"
                    vb.cpus = "1"
                else
                    vb.memory = "2048"
                    vb.cpus = "2"
                end
            end
        end
    end
end

3,共享目录设置

config.vm.synced_folder "/directory/of/host_machine", "/directory/of/guest_machine"

vagrant是借助rysnc来同步文件的,所以宿主机需要安装rysnc。

4,Provision
Provision是指在虚拟机实例启动之后,通过某些工具自动地、批量地为虚拟机安装软件或进行配置。vagrant提供多种方式对虚拟机进行Provision,包括Shell、Puppet、Chef、Ansible等。
以Shell为例,既可以通过直接在Vagrantfile中编写Shell脚本的方式,也可以通过引用外部Shell文件的方式。
直接在Vagrantfile中编写Shell脚本时,可以通过inline参数指定脚本内容:

config.vm.provision "shell", run: "always", inline: <<-SHELL
    sudo yum install -y net-tools
SHELL

run: "always"表示每次vagrant up的时候,都执行Provision。
下面再看一个引用外部脚本的例子:

config.vm.provision "shell", path: "script.sh

值得特别注意的是,并非每次vagrant up的时候,都会执行Provision。只有在下面3种情况下Provision才会执行:

5,Provider特定配置
不同的Provider具有不同的特性,也存在不同的配置方式。
以Virtualbox为例,可以通过name设置虚拟机的名字,cpus设置虚拟机的CPU数量,memory设置虚拟机的内存:

config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--name", "hadoop_master"]
    vb.gui = false
    vb.memory = "512"
    vb.cpus = "1"
end

同时,Provider的特定配置也可以覆盖vagrant原来的配置:

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

  config.vm.provider "vmware_fusion" do |v, override|
    override.vm.box = "precise64_fusion"
  end
end

6,其它


创建自己的vagrant box

vagrant package --output hadoop_master.box hadoop_master

hadoop_master是虚拟机实例名称,hadoop_master.box是box名。
在创建box的时候,如果虚拟机实例正在运行,vagrant会先halt,然后再export。

将box添加到本地仓库:

vagrant box add hadoop_master hadoop_master.box

查看本地仓库的box列表:

$ vagrant box list
centos7       (virtualbox, 0)
hadoop_master (virtualbox, 0)

创建并且切换到用于测试的项目目录:

mkdir ~/test_vagrant && cd ~/test_vagrant

创建Vagrantfile,并使用刚才新创建的hadoop_master.box作为box:

vagrant init -m hadoop_master

创建,并启动虚拟机:

vagrant up

登陆到虚拟机:

vagrant ssh

可以看到和创建box之前的虚拟机是一模一样的


遇到的问题


参考文档