用veewee创建vagrant的虚拟机

感谢larrycai的投稿。
原文链接:https://github.com/larrycai/blog/blob/master/cn/veewee_create_vm.mkd

简介

虚拟机有很多好处,不仅仅节省硬件资源,而且还可以快速切换系统环境,会在软件开发中起到极大作用。

上一篇vagrant和jenkins的文章中我们说到了vagrant这个工具,你必须要先有一个盒子:vagrant box,它是vagrant对virtualbox虚拟机的进一步封装。将virtualbox虚拟机转变成vagrant的盒子有点麻烦,可以参见vagrant的说明,所以,大家都是找一个现成的盒子来用。

但是,没有更好的办法了吗?现在网络的开放精神真是强大,你能想到的一般都存在了,它就是我要介绍的veewee,它的功能就是从你的ISO光盘开始,准备好你需要的vagrant虚拟机(盒子)。

veewee使用入门

这一块有篇英文文章Building Vagrant boxes with veewee讲的不错,github上的官方网站veewee也是蛮详尽的,我在这儿快速的重复一下,再加上一些自己的小技巧。

安装

首先安装好vagrant,virtualbox。veewee实际上是vagrant的一个插件,也是ruby写的,安装很方便。

rdccaiy@ubuntu:~ $ sudo gem install veewee

使用

安装好以后,你可以使用下面的命令试试到底有何奥妙了。

rdccaiy@ubuntu:~ $ vagrant basebox templates
The following templates are available:
vagrant basebox define '<boxname>' 'Fedora-14-amd64-netboot'
vagrant basebox define '<boxname>' 'ubuntu-10.04.2-server-i386-netboot'
vagrant basebox define '<boxname>' 'CentOS-6.0-x86_64-netboot'
vagrant basebox define '<boxname>' 'CentOS-4.8-i386'
vagrant basebox define '<boxname>' 'Debian-5.0.8-amd64-netboot'
vagrant basebox define '<boxname>' 'CentOS-5.6-i386'
vagrant basebox define '<boxname>' 'CentOS-5.6-i386-netboot'
vagrant basebox define '<boxname>' 'freebsd-8.2-experimental'
vagrant basebox define '<boxname>' 'Fedora-15-i386-netboot'
vagrant basebox define '<boxname>' 'ubuntu-11.04-server-i386'
vagrant basebox define '<boxname>' 'ubuntu-8.04.4-server-amd64'
vagrant basebox define '<boxname>' 'archlinux-x86_64'
..

basebox就是veewee插件装好以后变成的vagrant中的一个任务,从结果中可以看到已经有好多模板了,怎么用呢,先建一个目录(如veewee),然后再创建机器。

rdccaiy@ubuntu:~$ mkdir veewee ; cd veewee
rdccaiy@ubuntu:~/veewee$ vagrant basebox define 'ubuntu1104' 'ubuntu-11.04-server-i386'

创建之后,查看一下结果。

rdccaiy@ubuntu:~/veewee$ find .
./definitions/ubuntu1104
./definitions/ubuntu1104/postinstall.sh
./definitions/ubuntu1104/preseed.cfg
./definitions/ubuntu1104/definition.rb

definition.rb中指定了iso文件

Veewee::Session.declare({
  :cpu_count => '1', :memory_size=> '384',
  :disk_size => '10140', :disk_format => 'VDI', :hostiocache => 'off',
  :os_type_id => 'Ubuntu',
  :iso_file => "ubuntu-11.04-server-i386.iso",
  :iso_src => "http://releases.ubuntu.com/11.04/ubuntu-11.04-server-i386.iso",

iso文件就是操作系统的安装光盘,建议先从网上下载,veewee要求本地就必须放在和definitions平级(也就是上面veewee的下面一级)的iso目录下。

rdccaiy@ubuntu:~/veewee$ ls iso
ubuntu-11.04-server-i386.iso

闲话少说,让veewee工作起来吧!

rdccaiy@ubuntu:~/veewee$ vagrant basebox build ubuntu1104

理论上它应该能无图形化执行,不过我的环境里还是需要打开X-Windows,你应该看到virtualbox虚拟机起来,然后自动按键运行,中间还会重启,我蛮顺利的做出了虚拟机,真是很棒,如下图。(不知怎么的,每次看到电脑帮我自动打字,我很开心)

veewee, 持续交付, 工具

 

可以看到在终端上的漂亮log

rdccaiy@ubuntu:~/veewee$ vagrant basebox build ubuntu1104

Verifying the isofile ubuntu-11.04-server-i386.iso is ok.
We found no good state so we are destroying the previous machine+disks
VBoxManage unregistervm  'ubuntu1104' --delete
Deleting vm ubuntu1104
Deleting disk /home/rdccaiy/VirtualBox VMs/ubuntu1104/ubuntu1104.vdi
VBoxManage closemedium disk '/home/rdccaiy/VirtualBox VMs/ubuntu1104/ubuntu1104.vdi' --delete
Creating vm ubuntu1104 : 384M - 1 CPU - Ubuntu
Creating new harddrive of size 10140
VBoxManage createhd --filename '/home/rdccaiy/VirtualBox VMs/ubuntu1104/ubuntu1104.vdi' --size '10140' --format vdi > /dev/null
Attaching disk: /home/rdccaiy/VirtualBox VMs/ubuntu1104/ubuntu1104.vdi
Mounting cdrom: /home/rdccaiy/veewee/iso/ubuntu-11.04-server-i386.iso
Waiting for the machine to boot
....

时间应该蛮长的,一切的OK的话,你就能得到vagrant的虚拟机了。

rdccaiy@ubuntu:~/veewee$ vagrant basebox export 'ubuntu1104'

然后就用vagrant的方法去尝试了,如vagrant box add ‘ubuntu1104’ ubuntu1104.box

如果你要的操作系统模板没找到,可以到veewee的最新代码中的模板库看看

veewee的原理

如果你对操作系统安装(如linux)熟悉的话,应该能很快琢磨出道道来,veewee调用了virtualbox的API-VBoxManage来控制虚拟机,如构建裸盘(VBoxManage createhd),以及光盘的加载。

现在再来看看相关的三个文件是干嘛的。

  • definition.rb 中是你的一些基本硬件配置,每个模板都差不多,中间一段定义了机器启动时如何加载,注意不同的操作系统会用不同的方法,redhat是kickstart,ubuntu是preseed
  • preseed.cfg中就是ubuntu自动安装的配置参数,如果是SuSE,那就是autoinst.xml了,它来完成你的初始光盘安装。
  • postinstall.sh 顾名思义就是装完操作系统后的后续工作,这和你想要的配置有关,为了vagrant,要加上相应的包,当然别做复杂了,记住你只是做一个操作系统的初始虚拟机,具体里面的东西可以让vagrant用puppet或chef来完成。

总结

这篇文章主要简单讲了一下用veewee这个软件来如何快速创建vagrant虚拟机,有没有体会到持续交付中反复提到的配置管理了,所有的东西都写成配置文件,然后有软件自动生成你要的东西,慢慢试试再体会吧。

下次我该来谈谈puppet了,而且是无主机模式的,给些建议鼓励鼓励吧 @larrycai,让我持续交付。

参考

  1. larry的英文博客:http://codeslife.com/2011/10/25/create-virtualbox-on-fly-using-veewee/
  2. veewee的官网:http://github.com/jedi4ever/veewee
  3. 老外介绍的如何用veewee建立vagrant盒子:Building Vagrant boxes with veewee
  4. VirtualBox API – VBoxManage: https://www.virtualbox.org/manual/ch08.html
  5. 持续交付:http://www.continuousdelivery.info/

About 乔梁

乔梁,百度项目管理部高级架构师
This entry was posted in Tools and tagged , , , . Bookmark the permalink.

One Response to 用veewee创建vagrant的虚拟机

  1. Chanda says:

    Fabulous article, I will be browsing back again often to hunt for improvements.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>