云服务 造云记 (2):chef 一键部署与 Railsbox 示例

ouyang · 2013年08月10日 · 最后由 aisensiy 回复于 2013年10月23日 · 9256 次阅读
本帖已被管理员设置为精华贴

背景

造云记(1):从零打造一个私人云(提纲)中,我们主要介绍了本系列涉及到的核心技术。

现在,让我们从一个一个具体的技术难题开始上手实践。今天侧重介绍以下知识点:

  • vagrant
  • chef-solo、berks 与 knife solo
  • capistrano

各自角色

它们在一键部署中,分别承担以下角色:

  • vagrant:虚拟机本地测试,你也可以将其换成 linode vps 或者阿里云、ucloud 等空白的真实云主机进行测试
  • chef-solo:chef 的三种部署方式之一,在这里,介绍的是最常用的方式
  • capistrano:大家都比较熟悉,将 Ruby、Python 应用分发到你要分发的机器(3.0 开始可以部署非 Ruby 应用)

chef-solo 项目最佳实践

一个完整的 chef-solo 项目包括很多 cookbook。它是什么意思?

Ruby 社区的各位开发者非常熟悉这么几者:

  • gem:Ruby 的第三方包管理机制,Gemfile 文件用来描述一个项目引用的第三方包
  • bundle:通过 bundle install 来安装项目所依赖的第三方包
  • capistrano:通过 cap 来分发 Ruby 应用

那么,在云端管理的时候,是否也可以参考这种强大而友好的机制呢?有,这就是 chef 对应的 cookbook 的内容。它们对应的关系分别如下:

  • cookbook:它对应 gem 机制,即使用 bersk 来描述一台云端服务器所需要安装的第三方组件,在这里,nginx、mysql 等等,就是如同 gem 一样,直接可以看做一台服务器的第三方库。一个典型的 cookbook 由四部分构成。
  • berks:它就是类似于 bundle 机制,拿来管理第三方的 cookbook,用法也如同 bundle 一样:berks install -p cookbooks/
  • knife solo:它就是类似于 cap 机制一样,用来自动化部署服务器。比如,对服务器执行类似于安装 nginx、重启服务器等操作。

比如,我们来看一个典型的 berks 文件:

site :opscode

cookbook 'apt'
cookbook 'build-essential'
cookbook 'users'
cookbook 'rvm', :git => "https://github.com/fnichol/chef-rvm"
cookbook 'nginx'
cookbook 'postgresql'

大家是不是特别亲切?跟 gemfile 文件基本一致,只是,在上述示范中,我们使用了:

同样的,在 berks 中,我们照样可以使用隐私的 git 来写 cookbook。如上述例子中的 rvm。

配置管理生态圈

它们的关系图如下:

配置管理生态圈

Railsbox 项目及其示范

整合以上知识点,我将其汇总在 Railsbox 项目中。它是我整合的一个部署项目,能够实现在 linode vps、阿里云、ucloud 与 vagrant 上的一键部署。启动一台空白的云主机,到全部部署 Rails 应用完毕,全程自动化。

更具体的使用流程,参考示例项目说明文档:

推荐另外一个类似的东西,不过思路不一样,https://github.com/progrium/dokku dokku 是基于 lxc 来实现的应用部署环境,支持 ruby,python 等等多语言环境。楼主推荐的方式更适合单一的 Rails 环境。也挺方便的。

#1 楼 @mobiwolf 不是一回事。chef 侧重初始化服务器。那个研究过,后续会写到。

http://rubysource.com/docker-for-rubyists/ http://ruby-china.org/topics/12747

这个部署同样可以适用于任何语言。

#2 楼 @ouyang 哦,好好研究一下。我看你最近在研究云计算相关的事情,心理研究相关的产品还在做么?

#3 楼 @mobiwolf 这个部署就是针对我们的心理学产品来研究的:D

@ouyang 如果把 railsbox 做成和 Google 的 GAE 也类似的,然后专门来部署 Ruby 应用。这样机器的资源利用率比较高,就可以多放很多 Ruby 应用。比如做建站系统,做各种数据分析系统。基于 lxc 的虚拟化方案资源利用率比较低

我想请问一下欧阳老师,下面那个类似思维导图的图是用什么画出来的?谢谢

berks 的概念不错,第一次听说,涨姿势了!

#2 楼 @ouyang 为什么没有用 vagrant 的 provisioning 直接调用 solo 来做初始化呢?想听听你的见解

你好,我新注册的帐号,还不能发帖问问题。所以只好在评论里请教了。我在 controller 里定义了 show,使用 format json 来 render 返回的数据。在浏览器输入 url 可以看到 json 字符串,但是它不是一个 json 对象啊。我希望在前端用 ajax 接受一个 json 对象进而解析,请问如何返回一个 json 对象呢?

Berkshelf 相当于是 bundler for cookbooks 用来管理 cookbooks 之间的依赖关系很好用,好像已经超越 librarian-chef 了,看社区里的 cookbooks 都包含 Berks 文件就知道了;-)

#8 楼 @gene_wu vagrant provisioning 中 chef-solo 也是一种,和直接在虚拟机内部用 chef-solo -c solo.rb -j node.json -l debug 这种方式调用异曲同工,核心都是 cookbooks ;-)

#10 楼 @terrywang got you,我只是好奇楼主为什么没有直接拿 vagrant 调用,而是单独使用。

#11 楼 @gene_wu vagrant 单独调用缺点太多,比如:1)不够 DRY,单独写成一个部署项目,适合给所有的部署任务使用,而 vagrant 文件做不到;2)无法配置更多参数包括修改 cookbook 等。

#12 楼 @ouyang 谢谢欧阳老师指导!的确写在 vagrant 的话,只能 VM 用了,用来部署其他类型机器不够灵活

#12 楼 @ouyang 说白了就是少自动文件变化监测?可以实现的

请教一个问题,我自己创建自己的 cookbook 的话,在自己的 recipe 写 include_recipe "appbox" 然后在 node filerunlist 里面使用我自定义的 recipe 就总是出现 错误

Recipe Compile Error in /home/vagrant/chef-solo/cookbooks-2/vagrant/recipes/default.rb

但是,如果我在自己的 runlist 里面直接使用 appbox 的话,就不会有这个问题了。

这是为什么呢...

需要 登录 后方可回复, 如果你还没有账号请 注册新账号