vagrant完全教程

vagrant是什么?

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


vagrant中的概念

  • Provider
    为vagrant提供虚拟化支持的具体的软件,比如VMWare或Virtual Box
  • Box
    虚拟机镜像,vagrant根据Provider的不同提供了很多基础镜像。用户也可以根据需求使用vagrant package制作属于自己的Box
  • Project
    项目是由一个目录及该目录下的Vagrantfile组成的。项目中可以包含子项目,子项目的Vagrantfile配置文件会继承和重写父项目的配置。项目的虚拟机实例并不会存储在项目目录下,而是存储在~/.vagrant.d/box/下
  • Vagrantfile
    vagrant的配置文件,使用ruby语法描述。里面定义了该项目所使用的box,网络,共享目录,Provision脚本等。当执行vagrant up命令时,会读取当前目录的Vagrantfile
  • Provision
    虚拟机实例启动后,所需完成的基础配置工作,比如安装LAMP等。vagrant支持使用shell,puppet,chef来完成Provisioning工作
  • Plugin
    用于扩展对宿主机OS、GuestOS、Provider、Provisioner的支持,比如vagrant的aws和openstack支持都是通过Plugin来实现的

windows上安装vagrant

  • 安装cygwin
    • cygwin官网下载setup-x86.exe(用于32位版本的windows)或setup.x86_64.exe(用于64位版本的windows)
    • 运行上一步下载的可执行文件
      1.jpg
    • 一直下一步,直到Choose Download Site(s)页面
      2.jpg
      选择一个较快的下载站点,然后下一步
    • 在Select Packages页面选择要安装的软件包
      3.jpg
      vagrant依赖rsync,rsync依赖ssh,并且两个软件包都在net分类下,所以可以将net分类下的软件包全部安装。选择要安装的软件包之后,setup程序就会自动的下载和安装它们。
      至此,cygwin就安装完成了。如果想要升级或安装新的软件包,也是使用上面的方法
  • 安装vagrant
    vagrant官网下载安装即可
  • 安装virtualbox
    virtualbox官网下载安装即可

快速入门

1,建立vagrant项目目录:

mkdir vagrant_project  
cd vagrant_project/  

2,创建Vagrantfile

vagrant init [name [url]]  
  • 当使用vagrant init name形式的时候,vagrant会去本地仓库(~/.vagrant.d/boxes/)中寻找box
  • 当使用vagrant init 用户名/box名形式的时候,vagrant会去官网下载box(https://atlas.hashicorp.com/用户名/boxes/box名)
  • 当使用非本地仓库,并且非官网的box的时候,可以使用vagrant init box-name box-url形式,其中box-name用来指定box的名字,box-url用来指定box的下载地址

并且可以使用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支持三种网络配置:

  • 端口映射(forwarded port)
    用于将宿主机的端口映射到虚拟机的端口上。比如,可以通过下面的配置实现,将宿主机的8080端口映射到虚拟机的80端口上:
config.vm.network "forwarded_port", guest: 80, host: 8080  
  • 私有网络(host-only)
    只有宿主机能访问虚拟机。如果多个虚拟机在同一网段,那么虚拟机之间也是可以互相访问的。所有的虚拟机都只有一个出口,那就是宿主机。
config.vm.network "private_network", ip: "192.168.21.4"  
  • 公有网络(bridge)
    虚拟机和宿主机享受相同的待遇,虚拟机相当于局域网中的一台独立的主机。从vagrant 1.3之后,也可以设置静态ip:
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定义多个不同的虚拟机。下面是一个例子:

  1 # -*- mode: ruby -*-
  2 # vi: set ft=ruby :
  3
  4 Vagrant.configure("2") do |config|
  5     config.vm.box = "centos7"
  6     config.vm.synced_folder "../data", "/vagrant_data"
  7     config.vm.network "public_network"
  8     config.vm.provision "shell", inline: <<-SHELL
  9         sudo yum install -y net-tools
 10     SHELL
 11
 12     config.vm.define :hadoop_master do |master|
 13         master.vm.hostname = "hadoop-master"
 14         master.vm.network "private_network", ip: "192.168.30.2"
 15         master.vm.network "forwarded_port", guest: "22", host: "2222"
 16         master.vm.provider "virtualbox" do |vb|
 17             vb.customize ["modifyvm", :id, "--name", "hadoop_master"]
 18             vb.gui = false
 19             vb.memory = "512"
 20             vb.cpus = "1"
 21         end
 22     end
 23
 24     config.vm.define :hadoop_slave_1 do |slave_1|
 25         slave_1.vm.hostname = "hadoop-slave-1"
 26         slave_1.vm.network "private_network", ip: "192.168.30.3"
 27         slave_1.vm.network "forwarded_port", guest: "22", host: "2223"
 28         slave_1.vm.provider "virtualbox" do |vb|
 29             vb.customize ["modifyvm", :id, "--name", "hadoop_slave_1"]
 30             vb.gui = false
 31             vb.memory = "1024"
 32             vb.cpus = "2"
 33         end
 34     end
 35
 36     config.vm.define :hadoop_slave_2 do |slave_2|
 37         slave_2.vm.hostname = "hadoop-slave-2"
 38         slave_2.vm.network "private_network", ip: "192.168.30.4"
 39         slave_2.vm.network "forwarded_port", guest: "22", host: "2224"
 40         slave_2.vm.provider "virtualbox" do |vb|
 41             vb.customize ["modifyvm", :id, "--name", "hadoop_slave_2"]
 42             vb.gui = false
 43             vb.memory = "1024"
 44             vb.cpus = "2"
 45         end
 46     end
 47 end
 48

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才会执行:

  • 首次执行vagrant up
  • 执行vagrant provision
  • 执行vagrant reload --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,其它

  • config.vm.box = "box-name"
    该名称就是vagrant init后面跟的名字
  • config.vm.hostname="guest-os-hostname"
    用来设置虚拟机的主机名

创建自己的vagrant box

vagrant package --output hadoop_master.box hadoop_master  

hadoopmaster是虚拟机实例名称,hadoopmaster.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之前的虚拟机是一模一样的


遇到的问题

  • vagrant up的时候,出现mount: unknown filesystem type 'vboxsf'
    解决方法是使用vagrant plugin install vagrant-vbguest命令,安装vbguest插件。

参考文档

感谢浏览tim chow的作品!

如果您喜欢,可以分享到: 更多

如果您有任何疑问或想要与tim chow进行交流

可点此给tim chow发信

如有问题,也可在下面留言: