使用Chef来自动化部署

本篇主要分享一下如何使用Chef进行快速部署一个应用到服务器。
为了讲解的需要这里做了一些假定。

  • 使用Vagrant作为一个测试服务器
  • 使用Rails开发了一个应用
  • 该应用使用了一台Postgresql数据库服务器
  • 该应用有一台memcached用来做缓存服务
  • 该应用使用Nginx作为Web服务器

先来说一下Vagrant是什么?Vagrant可以看做是一个接口,是他Vagrant提供的接口可以方便的操作VirtualBox虚拟机。
VirtualBox虚拟机是一个免费的支持Windows, Linux, Mac 的全平台虚拟机。VirtualBox的使用场景多种多样。
在这里我们可以用来当做一台干净的测试机。

准备Vagrant环境

首先从各自官网安装软件

Vargrant file

配置一个Vagrantfile,这里我指定使用Ubuntu12.04 64位系统,该文件将会从网上自动下载。

Vagrantfileview raw
1
2
3
4
5
6
7
8
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant::Config.run do |config|
config.vm.box = "precise64"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
config.vm.forward_port 80, 8080
end

Vagrant常用命令

vagrant up # 启动Vagrant的虚拟机
vagrant suspend # 休眠虚拟机,可以快速恢复
vagrant resume # 恢复虚拟机,可快速恢复到休眠前状态
vagrant halt # 关闭虚拟机电源。不使用额外空间保存状态,但是启动时间延长

# 增加Vagrant虚拟机的信息到SSH配置里
vagrant ssh-config --host chef_rails >> ~/.ssh/config

使用Chef

Chef是一个功能强大的自动花部署工具,facebook的大公司也都在用它,官方的Chef是需要有个Chef Server来存放
所有服务器信息,当Chef Client需要部署一台机器时会询问Chef Server服务器该台机器的信息。商用许可证自然价格不菲。
社区里面开发了一个单机版的 Chef Solo,无需服务器配合,所有配置信息全部存放在一起,基本也能很好地满足普通的需求了。
Chef使用ruby代码编写脚本,接口设计花了很多功夫,让不知道ruby的人也能方便使用。毕竟Chef的目标用户是服务器管理员不是程序员。

Chef的常用命令

使用 Chef 时还有一些相应地工具需要来熟悉一下,清楚他们各自的作用。

  • Berkshelf,脚本包管理工具,用来分享使用别人写好的脚本
  • Knife,一个远程工具,使用他我们无需登录到目标服务器即可完成所有操作
  • Chef,实际的部署工具

来看看各个工具的实际使用情况

# berkshelf包管理工具,类似GemBundler
gem install berkshelf
berks install # 安装 chef 包

# knife solo 是 knife 的solo版本,可以生成项目,上传项目文件到目标机器,远程执行部署命令
gem install knife-solo

# 生成一个部署项目
knife solo init chef-rails

以下摘录一段chef片段

chef_rails.jsonview raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"rbenv_install_rubies": {
"global_version": "2.0.0-p353",
"other_versions": ["1.9.3-p484"],
"gems": ["bundler", "pry"],
"lib_packages": ["libc6-dev", "libtool", "libyaml-dev", "zlib1g-dev", "libssl-dev", "libreadline-dev", "libxml2-dev", "libxslt1-dev", "ncurses-dev", "libmagickwand-dev"]
},

"rbenv": {
"group_users": []
},

"run_list":[
"recipe[build-essential]",
"recipe[git]",
"recipe[rbenv-install-rubies]"
]
}

In this example above, we install build-essential, git, rbenv, and setup ruby 2.0.0-p353 as the default ruby version.

一个完成可用的例子

chef-rails 是我写好的一个配置rails项目的工具,能够自动配置nginx, postgresql, memcached, ruby, rails

git clone https://github.com/wongyouth/chef-rails
cd chef-rails
bundle

# install chef on target server
knife solo bootstrap vagrant@chef_rails # 假设安装到之前设置好的Vagrant虚拟机服务器上

最后一步比较慢,可以华丽的起身喝一杯咖啡了。

P.S. 最近网络不太好,可能有些文件被墙掉下载很慢需要多次尝试。

参考