BeginMan blog

wks-01:Vagrant学习

为了丰富周末生活,制定了一项计划,就是每周研究一门新技术,目标是入门。那么这周的计划学习虚拟化环境的工具Vagrant

目录:

  1. Vagrant简介
  2. 作用
  3. 配置
  4. 入门
  5. 实战
  6. 总结

一.Vagrant简介

Vagrant的英文释义如下,真没想到有人会以此命名。

这个工具在作用在ABOUT VAGRANT讲的就是:

Vagrant是一个工具来构建完整的开发环境。通过一套易用的工作流和自动化,vagrant能减少开发环境配置的时间,and makes the “works on my machine” excuse a relic of the past.

Vagrant是叫做Mitchell Hashimoto的大神2010写的,那个时候我是个刚上大学的菜B。这个是Mitchell的编外项目(side-project),也就是业余时间写的项目

看他Twitter的背景图竟然是Golang的代码,瞬间觉得很高大上。关键的是他和我一样帅,令我很欣慰,果断Follow.

二.作用

可能我在小公司呆久了,不知道大公司的套路(开发套路),看博客说大公司要同一开发环境,我觉得也是,很有必要,这样提升开发效率,较低BUG的风险。

关于Vagrant的作用,总结几点:

(1).Vagrant能很快的虚拟和正式环境一样的虚拟开发环境,这个与Docker思想一致,就是为了解决线上线下环境问题导致的BUG。

以前我习惯在电脑上通过VMware,VritualBox等装虚拟机,通过CentOs.iso等操作系统镜像来搞一个系统,但是这一流程太痛苦了,OS文件太大,几个G,又要配置虚拟环境又要安装操作系统等,可能一下午就过去了。有时候就想有没有方便点的,一下子就能搞一套配置好了的开发环境的。现在领悟了,有两套方案Vagrant和Docker,关于它两者的区别,见下面。

(2).提供了可配置、轻量级的便携式虚拟开发环境

  • 可在宿主和虚拟机上共享目录,实现宿主环境coding, 虚拟机run.
  • 将打包好的packages(如开发工具、代码库、配置环境等)直接拿过来用,省去重新搭建环境的烦恼。

三.配置

需要安装VirtualBox和Vagrant。直接官网安装就行。关于具体的配置过程参考: Vagrant安装配置

Vagrant配置流程如下:

首先选择在VM上使用的操作系统,一个打包好的操作系统在Vagrant中称为Box。在vagrantbox.esDiscover Vagrant Boxes选择操作系统作为Base Box。

$ vagrant -h
Usage: vagrant [options] <command> [<args>]

    -v, --version                    Print the version and exit.
    -h, --help                       Print this help.

Common commands:
     box             管理box,安装、删除等
     connect         连接到远程共享的vagrant环境
     destroy         停止和删除vagrant机器的所有痕迹(traces)
     global-status   输出这个用户的Vagrant environments状态
     halt            停止vagrant machine
     help            显示子命令的帮助
     init            通过Vagrantfile文件初始化一个新的Vagrant环境
     login           登录到HashiCorp's Atlas
     package         打包一个正运行的vagrant环境到box
     plugin          管理插件: install, uninstall, update, etc.
     port            显示有关客户端的端口映射信息
     powershell      通过powershell远程连接到机器
     provision       提供vagrant machine
     push            在环境中部署代码到一个已配置的目的地   
     rdp             通过RDP连接机器
     reload          重启vagrant机器, 导入新的Vagrantfile配置文件.
     resume          摘要一个已暂停的vagrant机器
     share           分享Vagrant environment
     snapshot        管理快照: saving, restoring, etc.
     ssh             通过SSH连接
     ssh-config      输出OpenSSH有效配置连接到机器
     status          输出vagrant machine的状态
     suspend         暂停
     up              开始并提供vagrant环境
     version         打印版本

For help on any individual command run `vagrant COMMAND -h`

Additional subcommands are available, but are either more advanced
or not commonly used. To see all subcommands, run the command
`vagrant list-commands`.

首先在hashicorp注册账号。

$ vagrant login -c
You are not currently logged in. Please run `vagrant login` and provide
your login information to authenticate.

# 注册后,登录
$ vagrant login 

但是TM还是报错:

$ cd vagrant
$ vagrant init hashicorp/precise64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'hashicorp/precise64' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
The box 'hashicorp/precise64' could not be found or
could not be accessed in the remote catalog. If this is a private
box on HashiCorp's Atlas, please verify you're logged in via
`vagrant login`. Also, please double-check the name. The expanded
URL and error message are shown below:

URL: ["https://atlas.hashicorp.com/hashicorp/precise64"]
Error:

我可是按照官网getting started教程来的啊,官网的东西一般不会出错的,何况我已经注册了账号且登录了。

我的环境是:OS X/Vagrant 1.8.7, Google的一大圈,终于找到靠谱的答案了:

Delete vagrant’s old curl and it work now. sudo rm -rf /opt/vagrant/embedded/bin/curl

四.入门

To use the available boxes just replace {title} and {url} with the information in the table below.

$ vagrant box add {title} {url}  
$ vagrant init {title}
$ vagrant up


# 对于 `add` 如果缺少url 则默认在 https://atlas.hashicorp.com/ 找 title, 如
$ vagrant box add bento/centos-6.7
==> box: Loading metadata for box 'bento/centos-6.7'
    box: URL: https://atlas.hashicorp.com/bento/centos-6.7
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) parallels
2) virtualbox
3) vmware_desktop

Enter your choice: 2
==> box: Adding box 'bento/centos-6.7' (v2.2.7) for provider: virtualbox
....

4.1 添加box

vagrant box add 命令添加box,最好先下载下来再add, 这里下载box:Ubuntu lucid 64 http://files.vagrantup.com/lucid64.box。

$ cd vagrant
$ vagrant box add base ~/Downloads/lucid64.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'base' (v0) for provider:
    box: Unpacking necessary files from: file:///Users/fangpeng/Downloads/lucid64.box
==> box: Successfully added box 'base' (v0) for 'virtualbox'!

# box中的镜像文件被放到了如下
$ ls ~/.vagrant.d/boxes
base

4.2 初始化

初始化命令:vagrant init 如果你添加的box名称不是base,那么需要在初始化的时候指定名称,例如:

$ vagrant init hashicorp/precise64

在当前目录生成Vagrantfile的文件

4.3 启动虚拟机

up命令:

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'base'...

4.4 连接到虚拟机

通过ssh来连接

$ vagrant ssh
Linux lucid64 2.6.32-38-server #83-Ubuntu SMP Wed Jan 4 11:26:59 UTC 2012 x86_64 GNU/Linux
Ubuntu 10.04.4 LTS

Welcome to the Ubuntu Server!
 * Documentation:  http://www.ubuntu.com/server/doc
New release 'precise' available.
Run 'do-release-upgrade' to upgrade to it.

Welcome to your Vagrant-built virtual machine.
Last login: Fri Sep 14 07:31:39 2012 from 10.0.2.2
vagrant@lucid64:~$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/lucid64-root
                       78G  945M   73G   2% /
none                  179M  180K  179M   1% /dev
none                  184M     0  184M   0% /dev/shm
none                  184M   64K  184M   1% /var/run
none                  184M     0  184M   0% /var/lock
none                  184M     0  184M   0% /lib/init/rw
none                   78G  945M   73G   2% /var/lib/ureadahead/debugfs
/dev/sda1             228M   17M  199M   8% /boot
vagrant               150G  123G   28G  82% /vagrant

执行df -h看到最后一行vagrant 150G 123G 28G 82% /vagrant./vagrant这个目录是自动映射的, 被映射到自己设置的vagrant目录。

4.5 暂停与恢复和删除

虚拟机在运行的时候会消耗你的电脑资源,比如内存,CPU 等等,在不用它的时候,可以关掉或者使用暂停,暂停虚拟机可以保存虚拟机运行时候的状态,暂停以后,除了占点硬盘空间以外,就不会消耗你的其它资源了。

进入到项目所在的目录,然后可以用 vagrant status 查看一下当前的虚拟机的状态,如果是 running ,你就可以使用命令去暂停一下:

vagrant suspend

重新恢复起动,执行命令:

vagrant resume

想要彻底关掉虚拟机的运行,执行:

vagrant halt

停止以后,要想再起动虚拟机,要执行:

vagrant up

不打算再用的虚拟机,可以把它删除掉,进入到项目所在目录,然后执行:

vagrant destroy

4.6 vagrant 命令总结

  • vagrant box add 添加box的操作
  • vagrant init 初始化box的操作
  • vagrant up 启动虚拟机的操作
  • vagrant ssh 登录虚拟机的操作
  • vagrant box list 显示当前已经添加的box列表
  • vagrant box remove 删除相应的box, 如:vagrant box remove base virtualbox
  • vagrant destroy 停止当前正在运行的虚拟机并销毁所有创建的资源
  • vagrant halt 关机
  • vagrant package 打包命令,可以把当前的运行的虚拟机环境进行打包
  • vagrant plugin 安装插件
  • vagrant reload 重新启动虚拟机,主要用于重新载入配置文件
  • vagrant resume 恢复前面被挂起的状态
  • vagrant ssh-config 输出用于ssh连接的一些信息
  • vagrant status 获取当前虚拟机的状态
  • vagrant suspend 挂起当前的虚拟机

4.7 Vagrantfile配置文件

VAGRANTFILE 是Ruby写的,可惜不会Ruby, 下面就翻译下Vagrantfile配置文件。

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

# "2" 在 Vagrant.configure 中表示
# 配置的配置版本(我们支持旧风格向后兼容性)。请不要改变它,除非你知道你在做什么。
Vagrant.configure("2") do |config|
  # 可参考文档 https://docs.vagrantup.com. 查看详情

  # 每个Vagrant 开发环境都需要一个box. 可通过 https://atlas.hashicorp.com/search.查询想要的box
  # 配置虚拟机盒子,展示了Vagrant要去启用那个box作为系统,也就是上面我们输入vagrant init Box名称时所指定的box
  # 如果沒有输入box名称的話,那么默认就是base
  config.vm.box = "base"

  # 禁用自动更新检查. 如果你关闭它, boxes将只会在用户运行`vagrant box outdated`时检查, 但这并不是推荐
  # config.vm.box_check_update = false

  # 端口转发, 创建一个转发端口映射 允许访问特定端口
  # 下例表示 "localhost:8080" 将访问客户机器上的端口80。
  # config.vm.network "forwarded_port", guest: 80, host: 8080

  # Vagrant有两种方式来进行网络连接,一种是host-only(主机模式),
  # 意思是主机和虚拟机之间的网络互访,而不是虚拟机访问internet的技术,
  # 也就是只有你一個人自High,其他人访问不到你的虚拟机。
  # 另一种是Bridge(桥接模式),该模式下的VM就像是局域网中的一台独立的主机,
  # 也就是说需要VM到你的路由器要IP,这样的话局域网里面其他机器就可以访问它了,
  # 一般我们设置虚拟机都是自high为主

  # 创建一个私有网络,它允许您使用特定的IP访问机器。
  # 这里我们虚拟机设置为hostonly,并且指定了一个IP,
  # IP的话建议最好不要用192.168..这个网段,因为很有可能和你局域网里面的其它机器IP冲突,
  # 所以最好使用类似11.11..这样的IP地址。
  config.vm.network "private_network", ip: "11.11.11.11"

  # 创建一个公共网络,它一般与桥接网络。桥接网络使机器出现另一个物理设备在您的网络。
  # config.vm.network "public_network"

  # 设置hostname非常重要,因为当我们有很多台虚拟服务器的时候,都是依靠hostname來做识别的
  config.vm.hostname = "myUbuntu"

  # 同步目录
  # 上面介绍过/vagrant目录默认就是当前的开发目录,这是在虚拟机开启的时候默认挂载同步的。
  # 我们还可以通过配置来设置额外的同步目录:
  # 在VM中共享目录. 第一个参数是主机目录实际的路径. 第二个参数是VM挂载的目录.

  config.vm.synced_folder "/Users/fangpeng/data", "/vagrant_data"

  # 特定于提供程序的配置,这样你就可以调整各种Vagrant环境。 这些暴露特定于提供程序的选项。
  # Example for VirtualBox:
  #
  # config.vm.provider "virtualbox" do |vb|
  #   # 显示启动计算机时VirtualBox GUI
  #   vb.gui = true
  #
  #   # 定制虚拟机的内存数量:
  #   vb.memory = "1024"
  # end
  #

  # 定义 Vagrant 上传Atlas的策略. 其他策略如FTP, Heroku 也可.
  # 参考文档:https://docs.vagrantup.com/v2/push/atlas.html 获取更多信息
  # config.push.define "atlas" do |push|
  #   push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
  # end

  # 开启shell脚本启用配置. 可选的provisioners如Puppet, Chef, Ansible, Salt, Docker 也可
  # config.vm.provision "shell", inline: <<-SHELL
  #   apt-get update
  #   apt-get install -y apache2
  # SHELL
end

修改完Vagrantfile的配置后,记得要用vagrant reload命令来重启VM之后才能使用VM更新后的配置

接下来试下共享目录,在本地新建一个mac.txt文件, 然后ssh到va machine。

$ echo "hi, I am `uname -a`" > mac.txt
$ vagrant ssh
Linux lucid64 2.6.32-38-server #83-Ubuntu SMP Wed Jan 4 11:26:59 UTC 2012 x86_64 GNU/Linux
Ubuntu 10.04.4 LTS
...
vagrant@lucid64:~$ cd /vagrant
vagrant@lucid64:/vagrant$ ls
Vagrantfile  mac.txt
vagrant@lucid64:/vagrant$ cat mac.txt
hi, I am Darwin Ponn 15.6.0 Darwin Kernel Version 15.6.0: Mon Aug 29 20:21:34 PDT 2016; root:xnu-3248.60.11~1/RELEASE_X86_64 x86_64
vagrant@lucid64:/vagrant$ echo "hi, I am `uname -a`" > linux.txt
vagrant@lucid64:/vagrant$ ls
Vagrantfile  linux.txt  mac.txt
vagrant@lucid64:/vagrant$ exit
logout
Connection to 127.0.0.1 closed.

$ ls
Vagrantfile	linux.txt	mac.txt
$ cat linux.txt
hi, I am Linux lucid64 2.6.32-38-server #83-Ubuntu SMP Wed Jan 4 11:26:59 UTC 2012 x86_64 GNU/Linux

看同步了。

五. 实战

Vagrant支持单机模拟多台机器,而且支持一个配置文件Vagrntfile就可以跑分布式系统。现在我们来建立多台VM跑起來,並且让他们之间能够相通信,假设一台是应用服务器、一台是DB服务器,那么这个结构在Vagrant中非常简单,其实和单台的配置差不多,你只需要通过config.vm.define来定义不同的角色就可以了,现在我们打开配置文件进行如下设置:

例子在这里模拟打造多机器的分布式系统

Vagrntfile文件如下:

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

# ref: https://www.vagrantup.com/docs/vagrantfile/machine_settings.html
Vagrant.configure("2") do |config|
  # 通过config.vm.define来定义不同的角色
  config.vm.define :web do |web|
    web.vm.provider "virtualbox" do |v|
      # modifyvm这个命令让我们可以设定VM的名称和内存大小等等
      v.customize ["modifyvm", :id, "--name", "web", "--memory", "512"]
    end
    web.vm.box = "base"
    web.vm.hostname = "web"
    web.vm.network :private_network, ip: "11.11.1.1"
  end

  config.vm.define :db do |db|
    db.vm.provider "virtualbox" do |v|
      v.customize ["modifyvm", :id, "--name", "db", "--memory", "512"]
    end
    db.vm.box = "base"
    db.vm.hostname = "db"
    db.vm.network :private_network, ip: "11.11.1.2"
  end
end

使用了:web以及:db分別做了两个VM的设置,并且给每个VM设置了不同的hostname和IP,设置好之后再使用vagrant up将虚拟机跑起来:


$ vagrant reload
$ vagrant up

分别通过vagrant ssh登录虚拟机

$ vagrant ssh web
vagrant@web:~$

$ vagrant ssh db
vagrant@db:~$

查看虚拟机状态

$ vagrant status
Current machine states:

web                       running (virtualbox)
db                        running (virtualbox)

可以相互ping下,看看通不通。

参考资料