开发管理的乐趣(3) -- vagrant在最小化DevOps中的作用

故事背景:

通常我们在项目的开发期,都是使用本地设备进行开发. 开发动作过程一般是:

  1. 安装配置相应语言的基础环境;
    1. 确认本地环境系统版本;
    2. 找到相应的环境版本下载;
    3. 安装本地环境;
  2. 建立项目结构,组织运行环境;
  3. 开发完成,部署调整生产环境;

勤快人的故事

不管对于新手还是老手来说,从开发的第一步开始,配置开发环境就是一个在坑里摸爬滚打的过程。好不容易从坑里爬出来,可以开始集中精力写代码了。等到程序一发布到生产环境,就又要重复第一步坑里滚的过程;因为开发期本地机器环境与生产环境的不同造成的各种变数,导致了一大堆与项目本身并没有多大关系的事情发生。这些问题有时候是致命的,特别是项目时间紧,待到交付日准备给客户演示的时候,服务器配置出现问题搞不定,往往会出现悲剧性的结果!但是!项目在本地机器测试一点问题也没有,程序早早的就已经开发完成了!老板和客户都知道你是个“勤快人”,几天几夜以公司为家,殊不知,你的几天苦逼日子其实是在折腾服务器配置;结果就是你的勤快坑了你的老板、你老板的客户、还有你自己!

懒人的故事

开发开始的时候,不想浪费时间在开发环境配置上,在本地机器上安装跟服务器相同的系统进行开发,开发完成后直接部署到服务器.交货~收钱~享受生活~

懒人初步

确认找到安装部署这些不确定和充满变数的非幂等性动作过程,尽量变成确定的幂等性过程。懒得折腾!

懒人工具Vagrant

Vagrant可以在本地虚拟与生产环境相同的系统环境,并在里面进行开发测试,然后将其中的配置发布到生产环境,这就将自动化与开发生产结合在了一起,大大降低了之前我们所提到的变数. 如果你喜欢其他安装系统的方式,比如创建虚拟机,然后把环境配置在虚拟系统里,这样也是可以的,只是懒人还是觉得麻烦。vagrant替你做了很多针对虚拟机繁琐的服务器配置和手动操作,节省了大量的时间和精力。

懒人工具实践

Vagrant安装

下载Vagrant: Vagrant
我用的Mac OSX系统,所以下载Mac OSX 32/64位版

开发管理的乐趣(3) -- vagrant在最小化DevOps中的作用_第1张图片
Vagrant官网

下载VirtualBox: VirtualBox

开发管理的乐趣(3) -- vagrant在最小化DevOps中的作用_第2张图片
image.png

安装方法很简单,跟着引导下一步。。。就好了!


下面开始检查安装Vagrant结果:
打开terminal
$ vagrant -v

输出版本号:
> Vagrant 2.2.1
看到版本号就表示已经装好了!
下面开始下载系统,在Vagrant Box Search中下载需要的系统进行安装,安装过程很简单。
我使用的是Ubuntu14.04 LTS的系统,直接搜索Ubuntu就可以搜索到box链接.

开发管理的乐趣(3) -- vagrant在最小化DevOps中的作用_第3张图片
box search

进入链接可以看到该box的版本和用法:


开发管理的乐趣(3) -- vagrant在最小化DevOps中的作用_第4张图片
命令行方式使用vagrant box

terminal输入一下命令安装box:
$ vagrant init ubuntu/trusty64

关于这条命令执行到哪里去了?请看注解[^友情提示:一般我们会在项目目录下做box init的操作,比如:
cd webapp
$ vagrant init ubuntu/trusty64
Vagrant会初始化并创建了一份Vagrantfile文件,这份文件是Vagrant所有的机关所在!该文件使用的语言脚本是Ruby
会看到输出:
> 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初始化过,您会发现目录下已经有了一份Vagrantfile,但是您需要更换使用的系统,此时可以参照用法说明中的Vagrantfile来更改初始化配置,如图:

开发管理的乐趣(3) -- vagrant在最小化DevOps中的作用_第5张图片
Vagrantfile

初始化完成之后,会看到该提示,现在开始启动:
terminal输入:
$ vagrant up
这样系统就装好并启动起来了!
但是!历史经验告诉我们,凡是技术,都会有坑!截至目前,我们碰到了第一个小坑Vagrant up 自带下载很困难, 最起码国内多数是这样, 基本不考虑这个手段。解决方法请看脚注[^解决方法:
运行vagrant up之后,terminal输出的信息中会显示box下载地址,如图:

开发管理的乐趣(3) -- vagrant在最小化DevOps中的作用_第6张图片
box download address

直接复制该链接,用你喜欢的下载工具下载,几分钟即可下载完成。下载完成的文件是.box为扩展名的文件。
接着打开terminal,输入:
$ vagrant box add [自定义box名称] [已下载box文件的本机路径]
例如,我的是:
$ vagrant box add ubuntu/trusty64 ~/Downloads/virtualbox.box
接着会看到屏幕输出:

box adding

接着启动box:
$ vagrant up ubuntu/trusty64
此时会看到terminal输出:
开发管理的乐趣(3) -- vagrant在最小化DevOps中的作用_第7张图片
box up

恭喜你,成功了!

Vagrant基本操作

运行:
$ vagrant ssh
登陆到虚拟机里面,默认的用户叫做 vagrant,可以用 whoami 查看一下。再查看一下内存,用 free -m 命令,发现默认内存大小还不到500M,所以敲 Ctrl-D 退出来。添加下面几行到 Vagrantfile 文件。

config.vm.provider "virtualbox" do |v|
    v.memory = "2048"
end

然后执行
$ vagrant reload
来加载设置就可以了。
当你项目完成或者删除项目的时候,可以直接destroy销毁当前虚拟机,但是又不会影响其他项目的配置。当然,如果你习惯按照一般方式,非常勤快的,一个项目创建一个虚拟机,出了问题再恢复系统或者重装虚拟机,觉得没有必要使用vagrant,也是没有问题的;如果你喜欢在开发期直接配置本地环境,在配置出现问题时重装本地机器操作系统,期待还原一个"纯净"的开发环境。当然这样做也是没有问题的,因为任何一种做法,都可以把项目完成!只是笔者比较懒,不愿意做太多手动重复性的操作,也不愿意承担太多因为不好的开发方式所产生的副作用,带来额外的压力。
vagrant会把Vagrantfile所在文件夹作为共享目录映射到托管的虚拟机中,在Vagrantfile中写入虚拟机创建时需要做的操作过程,例如安装语言包,比如Python, Golang, ROR等等,项目发布时可以直接将这些操作脚本拷贝到服务器上直接执行,用来简化服务器部署的过程。
配置文件中默认的方式是shell in line的方式,这种方式下,如果系统需要配置的操作很多,shell脚本会很多很长,未来在服务器上移植脚本的时候不是很方便,要从vagrantfile中拷贝出来操作。

config.vm.provision "shell", inline: <<-SHELL
    sudo apt-get update
    sudo apt-get install -y apache2
    SHELL
end

笔者推荐使用配置分离的方式,将脚本单独放在一个sh文件中,未来移植到服务器时,只需要直接复制该文件到服务器直接执行即可。

config.vm.provision "shell", path: "Provision.sh"
end

在Vagrantfile同级目录下创建Provision.sh文件,配置命令直接写入:
provision.sh

sudo apt-get update
sudo apt-get install -y apache2

vagrant box操作列表见Vagrant 操作命令列表:

$ vagrant init    # 初始化
$ vagrant up     # 启动虚拟机
$ vagrant halt   # 关闭虚拟机
$ vagrant reload  # 重启虚拟机
$ vagrant ssh     # SSH 至虚拟机
$ vagrant status   # 查看虚拟机运行状态
$ vagrant destroy  # 销毁当前虚拟机

该技术的使用笔者建议的使用场景是,还不了解虚拟化DevOps微服务架构的实现方式,开发方式暂时还是仅仅是本地开发,上传部署代码到服务器端,随着功能业务的增加,需要修改服务器配置的项目。这样的开发场景下,Vagrant可以相对方便安全的进行环境测试,保障生产服务器的安全!例如最小化DevOps自动化流程(Golang)中所描述的过程,如果需要修改服务器配置,就需要在vagrant环境下先做配置运行测试,然后再做push的操作

你可能感兴趣的:(开发管理的乐趣(3) -- vagrant在最小化DevOps中的作用)