Vagrant入门

Vagrant是一个简单易用的部署工具,用英文说应该是orchestration tool。它能帮助开发人员迅速的构建一个开发环境,帮助测试人员构建测试环境。python

Vagrant的基本工做原理大体以下:linux

  1. 首先,经过读取配置文件,获知用户须要的环境的操做系统、网络配置、基础软件等信息;
  2. 而后,调用虚拟化管理软件的API(VMWare Fusion,Oracle VirtualBox, AWS, OpenStack等)为用户建立好基础环境;
  3. 最后,调用用户定义的安装脚本(shell,puppet,chef)安装好相应的服务和软件包;

Vagrant的主要应用场景

  • 开发环境部署
    做为开发人员可能会涉及到不一样的开发语言和不一样的包依赖,搭建开发环境老是一件很麻烦的事情,有些语言有强有力的项目构建工具支持,好比Java的Maven,而有些语言则没有这么方便的工具,好比Python。特别是随着时间的推移,开发环境也会变得很混乱。
    Vagrant经过脚本文件的描述建立一个虚拟机实例,并经过shell脚本或puppet配置好开发环境,解决了开发环境的自动化搭建。同时,vagrant建立的开发环境也能被轻松的清理和共享,特别是对于一个团队,构建标准的开发环境将变得很轻松。
  • 测试环境部署
    对于测试环节中的集成测试,特别是分布式系统的集成测试,测试环境的搭建也是一个费时费力的工做。Vagrant支持多个实例的部署,能够在单机上建立多个虚拟机实例进行自动化的集成测试。若是单机的测试环境还不够大,也能够将这个工做交给AWS和OpenStack这样的云去完成。

Vagrant的主要概念

  • Provider
    Provider指的是为Vagrant提供虚拟化支持的具体软件,好比vmware或virtual box。
  • Box
    Box表明虚拟机镜像。Vagrant根据Porvider的不一样提供了不少的基础镜像(经过url从s3上获取),用户能够根据本身的需求使用vagrant package制做属于本身的box。
  • Project
    一个目录和目录中的Vagrantfile就组成了vagrant的一个项目,项目下能够有子项目,子项目中的Vagrantfile配置将继承和重写父项目的配置。项目的虚拟机实例并不会存储在这个目录(存储在~/.vagrant.d/box下),因此能够经过git等版本管理工具来管理项目。
  • Vagrantfile
    Vagrant的配置文件,使用Ruby的语法描述。里面定义了项目所使用的box,网络,共享目录,provision脚本等。当vagrant up命令运行时,将读取当前目录的Vagrantfile。
  • Provisioning
    Provisioning指的是虚拟机实例启动后,所须要完成的基础配置工做,好比说安装LAMP服务等。Vagrant支持使用shell,puppet,chef来完成provisioning工做。
  • Plugin
    Vagrant提供了插件机制,能够很好的扩展对宿主机OS, GuestOS,Provider,Provisioner的支持,好比vagrant的aws和openstack支持都是经过plugin来实现的。

QuickStart

安装Provider

咱们使用VirtualBox做为虚拟化的Provider,下载并安装VirtualBox便可。https://www.virtualbox.org/wiki/Downloadsgit

安装Vagrant

Vagrant提供了windows,mac,deb和rpm的安装包,下载最新版本1.3.5的安装便可。Ubuntu软件仓库的版本是1.0.1的,比较老了,在读取配置文件的时候可能会遇到问题,因此不建议直接从仓库安装。shell

http://downloads.vagrantup.com/ubuntu

建立项目

建立一个文件夹,并进入vim

mkdir linux-dev
cd linux-dev

初始化项目windows

vagrant init precise64 http://files.vagrantup.com/precise64.box

运行玩命令后,咱们应该会发如今当前目录下出现了Vagrantfile文件,内容以下:ruby

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

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # All Vagrant configuration is done here. The most common configuration
  # options are documented and commented below. For a complete reference,
  # please see the online documentation at vagrantup.com.

  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "precise64"

  # The url from where the 'config.vm.box' box will be fetched if it
  # doesn't already exist on the user's system.
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"

...

这个文件有详细的注释和说明,其中config.vm.box指定了所使用的box,若是该box不存在于本地,vagrant将会自动从config.vm.box_url处下载并添加到本地。网络

从名字能够看出这个box是一个ubuntu server 12.04 64位的virtual box镜像。less

配置provisioning脚本

咱们一般在安装完操做系统后但愿能装一些软件或作一些配置,provisioning脚本正好能完成这个工做。好比完成操做系统安装后自动安装vim和git。

编辑Vagrantfile,添加一行

  # The url from where the 'config.vm.box' box will be fetched if it
  # doesn't already exist on the user's system.
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"
  # 添加下面的这行
  config.vm.provision "shell", path: "provision.sh"

这一行指定了provision使用shell脚本,shell脚本位于与Vagrantfile同目录下的provision.sh

建立provision.sh

sudo apt-get install vim git -y

启动实例

在linux-dev目录下运行vagrant up,vagran就会启动由该目录下Vagrantfile指定的虚拟机实例。

首先,vagrant会去本地查找box,若是没有就从远程下载(从s3上下载很慢,能够先用迅雷离线下载到本地,而后再经过vagrant box add命令来添加);

而后,vagrant就会启动虚拟机,作一些网络配置,并将当前目录挂载到虚拟机的/vagrant下,使其能在虚拟机和物理机直接共享。

最后,vagrant会开始provisioning的过程,为虚拟机配置基础的软件(只在第一次启动时进行,之后可经过vagrant provision命令触发)。

AlexYang-mba:linux-dev alex$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'precise64'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for machine to boot. This may take a few minutes...
[default] Machine booted and ready!
[default] The guest additions on this VM do not match the installed version of
VirtualBox! In most cases this is fine, but in rare cases it can
cause things such as shared folders to not work properly. If you see
shared folder errors, please update the guest additions within the
virtual machine and reload your VM.

Guest Additions Version: 4.2.0
VirtualBox Version: 4.3
[default] Mounting shared folders...
[default] -- /vagrant
vagrant provision

[default] Running provisioner: shell...
[default] Running: /var/folders/cy/jfbhmrh95bx7q5nqvg6h4qv00000gn/T/vagrant-shell20131023-1280-yxw9sy
stdin: is not a tty
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
  git-man liberror-perl libgpm2 libpython2.7 patch vim-runtime

SSH登录

使用vagrant ssh命令能够登录到虚拟机上,进行相应的操做,好比:

vagrant@precise64:~$ ls -lah /vagrant/
total 16K
drwxr-xr-x  1 vagrant vagrant  170 Oct 23 07:54 .
drwxr-xr-x 24 root    root    4.0K Oct 23 07:19 ..
-rw-r--r--  1 vagrant vagrant   32 Oct 23 07:54 provision.sh
drwxr-xr-x  1 vagrant vagrant  102 Oct 23 05:51 .vagrant
-rw-r--r--  1 vagrant vagrant 4.6K Oct 23 07:45 Vagrantfile

关闭实例

关闭实例可使用三种方式vagrant suspending, vagrant halt, vagrant destroy。

  • suspending,暂停虚拟机,保存虚拟机当前的状态(内存和磁盘均不释放),可使用vagrant up命令恢复运行;
  • halt,关机,虚拟机中止运行,可是虚拟机实例保留,不销毁,能够理解为是正常的关机;
  • destroy,销毁虚拟机,虚拟机的实例被销毁;

相关资源

官网:http://www.vagrantup.com

文档: http://docs.vagrantup.com/v2/

Box:http://www.vagrantbox.es/

相关文章
相关标签/搜索