使用Vagrant练习环境布署

最近对Rails的布署有更深一层的体悟,打算花点时间将布署心得整理成文章,预计大概会在2050年前完成这部大作,这边决定先发布序章,就是教你怎么使用Vagrant来打造自己的测试机器。
为什么要用Vagrant
答案很简单,因为开远程机器练习布署或是机器架构又慢又麻烦又要钱,而且玩坏了或是环境脏了又得重灌又很慢,如果你想我一样最近在玩Chef-Server,实验多机器环境架构,例如一台Web Load Balancer、5台Application Server、1台Master Database 1台Slave Database、1台Data Analytics Server、1台 Service Monitor Server,1台Redis Server,听起来有没有很牛,但这一切都只要在你那台用来开发的计算机就做的到,告诉我为何你还不用Vagrant呢?

Vagrant Basic

下载安装Vagrant与Virtual Box
Vagrant背后用的是Virtual Box作为虚拟机,Vagrant只是一个让你可以方面做设定来开你想要的虚拟机的方便工具,所以你必须先安装Vagrant和Virtual Box,Virtual Box你可以在Virtual Box官网下载适合你平台的版本,而Vagrant你可以在Vagrant官网下载打包好的版本,或是如果你跟我一样是个玉树临风的Rubist,你可以打开我们最爱的小黑窗口输入

$ gem install vagrant

Vagrant 1.1后已经不支持使用Gem来安装了,据说是因为Dependecy太多他受不了了,详细可以参考他们的说明,感谢ihower的提示
开始使用Vagrant 新增操作系统
当你已经安装好Virtual Box以及Vagrant后,你要开始思考你想要在你的VM上使用什么操作系统,一个打包好的操作系统环境在Vagrant称之为Box,也就是说每个Box都是一个打包好的操作系统环境,当然网络上什么都有,你不用自己去找操作系统,vagrantbox.es上面就有许多大家熟知且已经打包好的操作系统,你只需要下载就可以了,为你的Vagrant增加一个Box很简单

$ vagrant box add {你想要的Box名称} {下载网址}

例如我想要下载我最爱的也只会这个的Ubuntu,我只要在vagrantbox.es挑好我想要的版本,一样在我们的小黑窗口输入

$ vagrant box add {Ubuntu-12-10} {http://cloud-images.ubuntu.com/quantal/current/quantal-server-cloudimg-vagrant-amd64-disk1.box}

Vagrant就会开始下载这个Box,你可以用vagrant box list这个指令看到你所拥有的所有Box,想象就是你的书架上多了一片Ubuntu 12.10的安装光盘,以后要安装机器就是用这的安装就可以了,有了Box以后,我们要产生一个配置文件来设定我们的虚拟机,这个档案可以透过指令vagrant init Box名称来产生,你可以在你的项目中或是另外开个练习用的文件夹输入,这时候你的文件夹终究会有一个名称为vagrantfile的档案,这个档案就是所有魔法的开始

~/Dropbox/Projects/Personal/vagrant ? vagrant init ubuntu-12-10 gogojimmy@MBP
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.

让VM动起来
我们晚一点再提配置文件的部份,让我们先把VM跑起来,要让VM跑起来的指令是vagrant up

$ vagrant up gogojimmy@MBP
[default] VM already created. Booting if it’s not already running…
[default] Clearing any previously set forwarded ports…
[default] Forwarding ports…
[default] — 22 => 2222 (adapter 1)
[default] Creating shared folders metadata…
[default] Clearing any previously set network interfaces…
[default] Booting VM…
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] The guest additions on this VM do not match the install version of
VirtualBox! This may cause things such as forwarded ports, shared
folders, and more to not work properly. If any of those things fail on
this machine, please update the guest additions and repackage the
box.
Guest Additions Version: 4.1.18
VirtualBox Version: 4.2.12
[default] Mounting shared folders…
[default] — v-root: /vagrant

看到以上这段指令跑完后,让我们用ssh联机到机器

$ vagrant ssh

现在你已经在虚拟机上了,登入的用户是默认的vagrant,现在你可以开始玩坏你的机器了,在VM中有个/vagrant的文件夹会与你host机器的vagrant配置文件所在的文件夹共享数据,现在你可以照你的习惯把机器的环境安装起来,例如以我来说我会先安装Ruby以及一些基本的系统套件,你可以在我的Gist上看到这个装机步骤,等我一下,让我先把我的环境先安装好,你可以先去玩一下Candy Crush或是看一下Facebook

vagrant@vagrant-ubuntu-quantal-64:~$ curl -L https://gist.github.com/gogojimmy/5523985/raw/b9d777bc380ee791c2f4534e9261b4b99289ed9f/bootstrap-chef-solo.sh | sh

将习惯的环境打包成Box
我的环境大概要装15分钟左右,有人说一个程序设计师的人生花最多时间的一件事情就是等,这个说法真是一点也不为过,每次装机都从环境重新开始Build也不是办法,我们要让人生有更多的时间去处理更多的事情,所以我们可以把一个已经Build好的环境打包成一个我们自己的Box,以后我们只要直接使用这个打包好的版本就可以了,因此让我们帮自己的人生省点时间,速速注销VM来打包这个Box

vagrant@vagrant-ubuntu-quantal-64:~$ exit
logout
Connection to 127.0.0.1 closed.
————————————————————
$ vagrant package gogojimmy@JoycetekiMacBook-Pro
[default] Attempting graceful shutdown of VM…
[default] Clearing any previously set forwarded ports…
[default] Creating temporary directory for export…
[default] Exporting VM…
[default] Compressing package to: /Users/gogojimmy/Dropbox/Projects/Personal/vagrant/package.box

vagrant package这个指令会在你目前的文件夹下建立一个vagrant.box的Box档案,这时候我们跟刚刚一样把它加入到我们的Box List中,以后我们就可以快速使用这个Box就好了!除此之外,可以自定Box的意义还有让你的团队都能用VM来拥有自己的Staging环境,例如在Rails项目中我们也可以建立一个Vagrant的配置文件来做一个给开发人员测试用的Staging环境,这时候你就可以指定好你自定的机器设定,确保每个开发人员都能拥有一样的环境来进行开发。

$ vagrant box add gogojimmy-ubuntu-12-10 package.box
$ vagrant list

Vagrant基本设定
设定VM的名称及内存
用你最喜欢的编辑器打开vagrantfile,vagrantfile是个有着详细解释的配置文件,非常建议你好好看过一遍来了解每个设定,当然我也知道今天你会来看这篇文章就表示你根本懒得看英文,就让我来帮你一步步走过,在这个档案中所有的设定都被Vagrant::Config.run的Block包起来,在一开始只会有box的设定:

config.vm.box = “gogojimmy-ubuntu-12-10”

这告诉了Vagrant要去套用哪个Box作为环境,也就是你一开始输入varant init Box名称时所指定的Box,如果没有输入Box名称的话就会是预设的base,Virtual Box本身提供了VBoxManage这个command line tool让你可以设定你的VM,用modifyvm这个指令让你可以设定VM的名称及内存大小等等,这里说的名称指的是在Virtual Box中显示的名称,我们也可以在vagrantfile中进行设定,在你的vagrantfile中加入这行

config.vm.customize [“modifyvm”, :id, “–name”, “gogojimmy”, “–memory”, “512”]

这行配置文件意思就是呼叫VBoxManage的modifyvm的指令,设定VM的名称为gogojimmy,而设定VM的内存大小为512MB,你可以照这这种作法为你的VM设定好不同的设定。
设定Hostname以及Port forward
设定hostname非常简单,设定中加入下面这行就好

config.vm.host_name = “gogojimmy-app”

设定hostname非常重要,有很多服务都仰赖着hostname来做为辨识,例如Puppet或是Chef,一般一些监控服务像是New Relic之类的也都是以hostname来做为辨识,设定那么简单,就别偷懒吧,再来看到下面这行

config.vm.forward_port 80, 8080

这个设定非常的厉害,这行的意思就是把Host机器上8080 port传来的东西forward到VM跑的 80 port的服务,例如当你练习Deploy到VM上时,在浏览器打开http://localhost:8080时就会传入VM里跑80 port的服务像是Nginx或是Apache,因此我们可以透过这个设定来帮助我们去设定Host与VM间,或是VM与VM间的沟通,像是MySQL通常跑3306之类的
设定网络桥接方式
Vagrant有两种桥接方式是,一种是host only,意思是说在你计算机同个区网中的其他计算机是看不到你的VM的,只有你一个人自High,另一种是Bridge,当然就是说VM会跟你区网的router去要一组IP,区网中的其他计算机也都能看到他,一般来说因为开VM的情况都是自High居多,因此我们在设定上都是设定host only:

config.vm.network :hostonly, “192.168.33.10”

这边将网络设定成hostonly’,并且指定一组IP地址,IP地址的设定会建议不要使用192.168..的设定,因为很有可能会跟你区网的IP冲突,你可以改使用像是33.33..`的设定。
更改vagrantfile的设定后,记得要用vagrant reload的指令重开VM让VM可以用新的配置文件跑起来
让我们开始打造多机器环境
重头戏来了,前面的一切都是为了今天铺陈,现在我们要建立多个VM跑起来,并且让他们互相沟通,有人跑Application、有人跑DB、有人跑Memcached,这一切在Vagrant中非常简单,跟刚刚的设定都一样,你只需要指定好机器的角色就可以了,让我们再次打开我们的配置文件来设定一台APP Server加上一台DB Server:

config.vm.define :app do |app_config|
app_config.vm.customize [“modifyvm”, :id, “–name”, “app”, “–memory”, “512”]
app_config.vm.box = “ubuntu-12-10”
app_config.vm.host_name = “app”
app_config.vm.network :hostonly, “33.33.13.10”
end
config.vm.define :db do |db_config|
db_config.vm.customize [“modifyvm”, :id, “–name”, “db”, “–memory”, “512”]
db_config.vm.box = “ubuntu-12-10”
db_config.vm.host_name = “db”
db_config.vm.network :hostonly, “33.33.13.11”
end

这边的设定就像是刚刚在设定的部份教的一样,只是我们使用了:app以及:db分别做了两个VM的设定,并且给予不同的hostname和IP,设定好了以后再使用vagrant up将机器跑起来:

$ vagrant up
[app] Importing base box ‘ubuntu-12-10’…
[app] Matching MAC address for NAT networking…
[app] Clearing any previously set forwarded ports…
[app] Forwarding ports…
[app] — 22 => 2222 (adapter 1)
[app] — 80 => 8080 (adapter 1)
[app] Creating shared folders metadata…
[app] Clearing any previously set network interfaces…
[app] Preparing network interfaces based on configuration…
[app] Running any VM customizations…
[app] Booting VM…
[app] Waiting for VM to boot. This can take a few minutes.
[app] VM booted and ready for use!
[app] Configuring and enabling network interfaces…
[app] Setting host name…
[app] Mounting shared folders…
[app] — v-root: /vagrant
[db] Importing base box ‘ubuntu-12-10’…
[db] Matching MAC address for NAT networking…
[db] Clearing any previously set forwarded ports…
[db] Fixed port collision for 22 => 2222. Now on port 2200.
[db] Fixed port collision for 22 => 2222. Now on port 2201.
[db] Forwarding ports…
[db] — 22 => 2201 (adapter 1)
[db] Creating shared folders metadata…
[db] Clearing any previously set network interfaces…
[db] Preparing network interfaces based on configuration…
[db] Running any VM customizations…
[db] Booting VM…
[db] Waiting for VM to boot. This can take a few minutes.
[db] VM booted and ready for use!
[db] Configuring and enabling network interfaces…
[db] Setting host name…
[db] Mounting shared folders…
[db] — v-root: /vagrant

看到上面的讯息跑完后,你就可以跟刚刚一样使用ssh连到VM里,但这次不同的是你要加上你所指定的角色告诉你要联机的机器是哪一台:

$ vagrant ssh app
vagrant@app:~$
$ vagrant ssh db
vagrant@db:~$

是不是很酷!!再来我们来验证一下VM之间的联机,让我们使用ssh登入db的机器,然后在db的机器上使用ssh来联机到app的机器(默认密码就是vagrant):

$ vagrant ssh db
vagrant@db:~$ ssh 33.33.13.10
The authenticity of host ‘33.33.13.10 (33.33.13.10)’ can’t be established.
ECDSA key fingerprint is a7:71:36:4c:01:4a:38:a2:fc:fa:ea:d7:67:63:3c:40.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘33.33.13.10’ (ECDSA) to the list of known hosts.
vagrant@33.33.13.10’s password:
vagrant@app:~$

看到了吗,VM之间的沟通也是没有问题的!,你现在可以开始好好思考你伟大的Infrastructure,让你的程序跑在多机器的环境中,如果你对于Infrastructure不熟悉,Amazon有提供了不少范例可以参考,想象力就是你的超能力,现在唯一局限你的只会是你的计算机内存了,不要开到跑不动都不会有事的,今天就开始用Vagrant练习你的机器布署吧!
记得设定多台机器的时候,刚刚原先在单台机器的设定必须先清除或是批注掉,如果刚刚的VM还在跑,记得要用vagrant halt先关机。
[整理自网络]

此条目发表在lnmpa分类目录,贴了标签。将固定链接加入收藏夹。

发表评论

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据