设为首页收藏本站

数码鹭岛论坛

 找回密码
 注-册

QQ登录

只需一步,快速开始

搜索
查看: 2318|回复: 4
打印 上一主题 下一主题

Hello,Vagrant

[复制链接]
跳转到指定楼层
1#
发表于 2013-5-16 22:31:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原文: http://dreamhead.blogbus.com/tag/vagrant/

在这个虚拟化当道的年代,作为一个程序员,你一定对VirtualBox不会陌生,是的,它就是个虚拟机。不过,这里要说的却是Vagrant,那Vagrant又是什么呢?

如果说VirtualBox是个芸芸众生的虚拟机,那Vagrant就是程序员的VirtualBox。你要知道,作为一个程序员,我们认为,什么东西都应该在命令行下控制。当然,对于程序员这个群体,要是面对一个可以在命令行下控制的虚拟机,我们要的可绝不是“打开虚拟机、上个网银”。

Vagrant是用Ruby写的,所以,安装之前,确保你装好了Ruby和RubyGems。一般来说,我会用RVM安装Ruby这套东西,仅供参考。再有既然是要控制VirtualBox,安装一个VirtualBox也是必然的。

准备好基本的东西,安装Vagrant就非常简单了:

  gem install vagrant

接下来,就该是使用了。不过,在此之前,我们先要找一个虚拟机镜像来,就像使用一般的机器先要装机一样。此外,我们还要让vagrant知道这个镜像文件的存在,下面就是这样一个命令:

  vagrant box add base http://files.vagrantup.com/lucid32.box

在vagrant里,这个概念叫做box,所以,这个命令的意思,我要添加一个box,我给它命名成base,它的地址是http://files.vagrantup.com/lucid32.box。

其实,这个如果你熟悉Ubuntu的命名规则,便不难发现,这个box是一个Ubuntu的镜像。事实上,这个box显然不是唯一的选择,如果我们想要其它版本的操作系统,我们的选择还有很多,在这里可以找到:

  http://www.vagrantbox.es/

剩下的就是,选择我们想要的操作系统,给它命个名字,就可以用起来了。

找一个目录进去,是的,最好这么做,因为接下来,我们会生成文件,放在一个特定的路径里,不容易丢掉:

  vagrant init base

从命令行的提示里,我们可以看到,vagrant为我们创建了一个Vagrantfile,里面有好多内容,不过,把细致查看留给你,让我们先体会一下成就感吧!启动我们的虚拟机。

  vagrant up

一切正常的话,在打出一片提示之后,我们的虚拟机就运行起来了。怎么才能用上这个新“机器”呢?其实,这就是一台独立的机器,我们可以ssh上去。

  vagrant ssh

好了,尽情折腾吧,这是我们程序员的虚拟机。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
2#
 楼主| 发表于 2013-5-16 22:34:09 | 只看该作者

Hello,Vagrant (二)

好吧,我承认在第一部分介绍的那个虚拟机只是看上去很美,因为里面什么都没有,所以,我们必须动手给它装些东西,才能让它有点作用。

别急别急,我知道,你会和最初的我一样,一听到装东西,立刻就要vagrant ssh上去,然后,apt-get install各种各样的东西。可我们是程序员,我们才不做这种普通用户才做的事情呢!

在这个年代,只说持续集成,我们都不好意思了,要说持续交付,而要达到持续交付,有一个叫做DevOps的概念是绕不过去,说白了,DevOps就是把配置环境的过程代码化,所谓infrastructure as code。在这个领域,有两个工具很好用,一个叫Chef,另一个叫Puppet。它们都可以极大程度上简化我们配置环境的过程。

谢天谢地,Vagrant二者都支持。

下面我们用Chef搭建一个CI,体验所谓的DevOps。

Chef支持两种运行模式,Chef Solo和Chef Server。所谓Solo就是一个人的工作,而Server自然是服务器的意思。之所以要有这样的区分,主要是考虑用来配置机器的脚本放在哪里,Solo就是放在自己的机器上,而Server则是放在一台特定的服务器上。在我们这个简单的例子里,就不麻烦Server了。

我们要配置机器,首先要有的就是配置文件,对应的配置文件在Chef中称为cookbook,这个社区里已经很多写好的Cookbook,让我们拿过来用。

  http://community.opscode.com/cookbooks

就我们这个例子里,我们选用的CI软件是Jenkins,所以,我们需要jenkins的cookbook。在这个例子里,我们就在之前建立目录创建一个cookbooks的目录,用以存放我们的cookbook,进入到这个目录下,执行下面的命令:

  git clone https://github.com/heavywater/chef-jenkins jenkins

先别急,事实上,仅有一个jenkins是不够的,它还要依赖于其它的程序包,以这个例子而言,我们采用Ubuntu操作系统,所以,我们需要安装apt,再有jenkins是一个Java编写的应用,所以,它还需要一个java:

  git clone https://github.com/opscode-cookbooks/apt.git

  git clone https://github.com/opscode-cookbooks/java.git

好,我们要用的cookbook都有了,下面该让Vagrant知道它们的存在了。上次说道,我们在init之后,会生成一个Vagrantfile。实际上,它就是Vagrant的配置文件。用你最喜欢的编辑器打开它。

实际上,关于如何配置Vagrant,主要内容都在里面了,只是大部分都注释掉了而已。既然我们要采用Chef Solo模式,那就找到相关的配置,搜索chef_solo,很容易定位到,将它改成下面的样子:

  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "cookbooks"
    chef.add_recipe "jenkins"
  end

这个配置是告诉Vagrant,cookbook的路径在哪,以及我们要用的哪个配置。

这样,基本的配置就是这样了,但是,我们虽然启动了这个jenkins,却只能在虚拟机内部访问,为了让别人也能访问,我们需要配置转发端口,同样在Vagrantfile里:

  config.vm.forward_port 8080, 7070

这个配置是说,虚拟机内部的8080端口会转发到宿主端口7070。

等了半天,启动我们的虚拟机吧,还记得命令吗?

  vagrant up

如果你之前启动过,为了让新配置生效,我们可以:

  vagrant reload

虽然是自动安装,但漫长的安装过程是无法避免的,可以先休息一下。

幸运的话,等待之后,我们就可以打开我们的浏览器,访问新CI了:

  http://localhost:7070

好了,我们的CI就绪了,按照你的需求配置吧!
3#
 楼主| 发表于 2013-5-16 22:35:34 | 只看该作者

Vagrant初窥(一)

        虚拟化技术已经飞入日常工作。很多人为了开发、测试,会在本地创建一个VirtualBox或者VMWare虚拟机,以模拟某个特定的目标环境(如Windows XP、IE7等)。为了实现这个目标,人们往往需要手工去安装所需的操作系统或者软件,手工配置一些环境变量,再手工将打好的部署包拷贝过去,并且手工部署应用程序。整个过程基本上都是手工操作,而且需要确保每个步骤都配置正确——耗时,且容易出错。有没有什么工具可以帮助我们将这些工作自动化,省去繁琐的手工操作,确保可靠地、可重复地执行这个过程?
Vagrant就是这样一款非常优秀的工具,它很好地封装了虚拟文件镜像、VirtualBox API以及配置工具(如puppet、chef等)等成熟工具的使用,从而能够帮助开发人员很方便地、可复用地创建、配置和分发虚拟机的工具。借助于Vagrant,开发团队可以自动化应用环境的创建、配置以及应用程序的部署,甚至进一步将环境的集成纳入到构建流水线、持续集成。本文将介绍Vagrant的基本用法、概念模型、内部机制以及veewee插件,带着大家一窥Vagrant的神秘之处。
引子
在开始之前,首先请确保本地已经安装了VirtualBox,可以正常地创建、管理虚拟机,而且本地已经安装了Vagrant。您可以通过在命令行执行vagrant -v来查看当前安装的vagrant版本。
如果这两者都已准备妥当,下面就让我们看一个简单的例子:
$ vagrant box add lucid32 http://files.vagrantup.com/lucid32.box
$ vagrant init lucid32
$ vagrant up

在经过一系列的步骤之后,vagrant提示虚拟机已经完成了创建。让我们来试试这台刚创建的虚拟机,ssh登陆到虚拟机上面去:
$ vagrant ssh

可以看到,经过这样简单的几步,我们就拥有了一台完全可用的Linux机器。接下来,我们可以在虚拟机上面安装软件、配置环境——就象操作本地机器一样。这一切是怎么做到的呢?我们一步步来分析上面的步骤,看看Vagrant在其中做了些什么。
首先,我们是执行了box add命令:
$ vagrant box add lucid32 http://files.vagrantup.com/lucid32.box
这里,我们先执行vagrant box list,命令行控制台会输出如下的box列表:
centos-6.2-64bit_4.1.8
centos6-32
debian64_chef
lucid32
我们可以发现在执行完vagrant box add之后,本地的Vagrant box会增加一个名为lucid32的新box。这是我们接触的第一个概念——box。


4#
 楼主| 发表于 2013-5-16 22:36:43 | 只看该作者

Vagrant初窥(二)

        Box
box是Vagrant用以创建、分发虚拟机镜像的压缩文件。例如,对于本文例子中的lucid32.box,其内部结构如下:

基本上,Vagrant的box文件是一个OVF压缩包(为什么说基本上呢?大家可以移步我的这篇[url=http://mingjin.thoughtworkers.org/?p=176]博文,这里不深入探究)。[url=http://en.wikipedia.org/wiki/Open_Virtualization_Format]OVF(Open Virtualization Format,开放虚拟化格式)是由HP、VMWare、XenSource等公司或团体组成的[url=http://en.wikipedia.org/wiki/DMTF]DMTF(Distributed Management Task Force)组织提出的虚拟化格式标准,于2008年9月发布v1.0,截至本文为止的最新版本是v1.1.0。OVF描述了虚拟机打包与分发的各种配置和扩展点,其目的在于提供一种开放、安全、可移植和可扩展的格式,而不需要依赖于特定的超管理程序(hypervisor)或者处理器架构。目前,OVF已经被业界广泛接受,主要的虚拟化厂商与组织,如VMWare、IBM或者VirtualBox都已经提供了支持。OVF的详细格式可参阅OVF规范,这里不多做分析。
OVF压缩包(OVF Archive,OVA)是OVF打包与分发的基本单元,由[url=http://blogs.vmware.com/vapp/2009/08/inside-the-ovf-package.html]一个或者多个虚拟机镜像以及其他的一些元数据文件组成。一个OVA压缩包通常会包括一个OVF描述文件、一个或者多个虚拟机镜像文件、一组本地化文件、一个manifest文件和一个证书文件,其中只有OVF描述文件和虚拟机镜像文件是必须的,其他都是可选的。
对于本文例子中的lucid32.box,里面除了box.ovf文件,还包括了一个box-disk1.vmdk、一个box.mf文件以及一个Vagrantfile文件。box-disk1.vmdk是基于VMWare提出的[url=http://en.wikipedia.org/wiki/VMDK]vmdk虚拟镜像文件格式,它为VMWare和VirtualBox等工具支持。其中的box.ovf是对该虚拟机镜像文件的OVF描述。box.mf里面放的是box-disk1.vmdk和box.ovf的SHA1值。有时候,你可能需要修改虚拟机镜像的配置,你可以手工修改box.ovf的内容,再重新生成它们的SHA1值(如,最后用新的SHA1值替换box.mf里面的内容即可。
由于Vagrant box就是OVF压缩包,同时,vmdk也是一种较为通用的虚拟镜像文件格式。所以在原理上,所有兼容OVF格式的超管理程序(hypervisor)和虚拟工具(VirtualBox、Oracle VM或者VMWare等)都能很好的解析和支持Vagrant box。
Vagrant的子命令vagrant box提供了管理box的所有功能,如add、list、remove、repackage等。这些子命令都非常自解释,如list是列出本地的Vagrant box,remove是删除指定的Vagrant box,repackage是重新打包本地的Vagrant box等。Vagrant box add会将指定的box文件(同时支持http、file协议)添加到本地——即把该box文件下载到本地,并解压缩为~/.vagrant.d/boxes下的同名文件夹。比如,你可以在~/.vagrant.d/boxes/lucid32文件夹下面找到上面所有的文件。这样,Vagrant就将box添加到本地,接下来就可以基于Vagrant box创建、启动、配置虚拟机实例了。
接下来,让我们看第二条命令:
$ vagrant init lucid32
执行完这条命令之后,Vagrant会在当前目录创建一个Vagrantfile文件。这是我们要接触的第二个概念——Vagrantfile。


5#
 楼主| 发表于 2013-5-16 22:37:57 | 只看该作者

OVA(VMX)化Vagrant box

原文: [url=http://mingjin.thoughtworkers.org/?p=176]http://mingjin.thoughtworkers.org/?p=176

        Vagrant是一款针对本地虚拟机的管理工具,使用起来非常方便。然而,虽然Vagrant是基于OVF与VMDK格式标准,但Vagrant box却并不是合法的OVF压缩包,而且本身也没有声明对VMWare的支持,所以,我们不能够直接将Vagrant box直接导入到VMWare产品如Fusion里面。但是,Vagrant box与VMWare VMX的鸿沟也并非那么大,我们可以通过修改Vagrant box的OVF描述文件以及压缩打包方式,将Vagrant box转为OVA或者VMX格式的压缩文件。
Vagrant box不是合法的OVF压缩包,主要的问题在于Vagrant box中文件的顺序不符合OVF压缩包(OVF Archive)规范。OVF压缩包对文件顺序的要求是:OVF必须是第一个,然后是虚拟机镜像文件(如VMDK),接着是MF文件,再接下来是其他的可选文件(如证书、I18N等)。但是,Vagrant box里面的顺序则是VMDK、MF、OVF、Vagrantfile,如下图。




我们可以用OVF工具去验证一下Vagrant box,比如VMWare的ovftool会提示如下的错误信息:



既然知道了问题的原因,那解决起来就好办多了。我们只需要将Vagrant box重新按照一定的顺序压缩即可。比如,我们可以直接用tar,如下图:










当然,我们也可以使用VMWare的ovftool来实现同样的目的:
ovftool box.ovf lucid32.ova
这样,我们就解决了Vagrant box不是合法OVF压缩包的问题。然而,通过上图可以看到,虽然Vagrant box里面是VMDK文件,而且VMDK同时被VirtualBox和VMWare支持,但是由于Vagrant box在box.ovf的Family里面只声明了virtualbox-2.2,故而也没有办法被VMWare打开。我们也可以使用VMWare的ovftool验证一番:




因此,为了Vagrant box也能够在VMWare里面打开和配置,我们需要修改Vagrant box里面box.ovf的一些配置,增加对VMWare的支持,并将其中一些VirtualBox特定的配置修改为VMWare兼容的。
为此,笔者开发了一个vagrant插件叫vagrant-ovf,可以很方便、自动地修改box.ovf以及box.mf(因为每次修改了box.ovf,都需要重新计算box.ovf文件的SHA1值)。
  • 为了使用该插件,首先安装vagrant-ovf,如gem install vagrant-ovf。
  • 然后,通过vagrant ovf [boxname]就会修改指定Vagrant box里面的box.ovf以及box.mf,使之增加对VMWare的支持。
  • 接着,我们可以通过上面的步骤将Vagrant box重新压缩为OVF压缩包,例如lucid32.ova
  • 最后,我们可以用ovftool将刚才得到的lucid32.ova再转化为VMX文件,ovftool lucid32.ova lucid32.vmx
这样,我们刚才得到的OVF压缩包就转化为VMWare Fusion可以直接打开、导入的VMX文件。进一步,我们可以借助于VMWare提供的vapprun做一些深入的自动化工作。


您需要登录后才可以回帖 登录 | 注-册

本版积分规则

小黑屋|手机版|Archiver|数码鹭岛 ( 闽ICP备20006246号 )  

counter

GMT+8, 2025-12-3 19:42 , Processed in 0.080546 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表