Author: Fangchao Gao 转载请注明出处
此文档适合于对Chef不了解,或者仅仅是了解但并未真正使用过Chef的用户。如果您对Chef充分了解,并且经常使用Chef,想要了解其中的技术,那么此文档可能并不是真正的适合您。
假设我们需要搭建一台MySQL的服务器,安装配置花费了很多时间,中间偶尔出错,但是终于搭建成功了。没过多久,我们需要另一台或者更多的MySQL服务器,于是我们不得不重复此前的安装配置步骤了。于是我们就想到了,把这些安装过程写成脚本,这样不但节约时间,而且不容易出错。
Chef就相当于这样的脚本管理工具。但其功能、可定制性和便捷性都要强大的多,它将脚本命令代码化,定制时只需要修改代码,而不需要修改命令,Chef自动会将一台机器配置成你想要的样子。
它是由Ruby开发的,服务器的构成管理工具。
可能是便于用户理解吧,Chef开发团队在开发的时候,将所有的东西都形象的映射到了厨房里,或者说做饭的过程,大家从’Chef’这个命名就可以看出。下面我将以类比的方法,给大家讲一讲Chef中的一些主要的概念。剩下的概念,我们在下一节中写Recipe的时候再讲。
1) Recipe
第一个要讲的是Recipe,食谱。厨师在做菜的时候,是需要知道这个菜的做法,也就是食谱的。当然他们肯定不会边看食谱,边做菜吧。如果是这样的话,他们肯定不是一个合格的厨师。但是从计算机的角度来讲呢,可能我们真需要在每一次做菜前去看看食谱。
食谱里面写的是什么呢?肯定是这道菜怎么做吧。第一步做什么,第二步做什么等等。
在配置计算机的过程中,也是一样的,它需要知道,把这台计算机配置你想要的样子,每一步的步骤是什么。
比如配置一台ntp服务器,我们可能需要三个步骤。
我们把这三步写进食谱里,这样,我们的Chef按照这个Recipe就可以做好一道菜,配好一个具有特定功能的服务器。
2) Cookbook
理解了Recipe,就比较容易理解Cookbook了。Cookbook可以理解为烹饪书。一个食谱,通常是保存在烹饪书里的。菜系可能会分很多种类,所以烹饪书有很多种类,就像中国菜、意大利菜等等,会有中国菜的烹饪书、意大利菜的烹饪书。
Cookbook通常定义一个scenario,比如配置一个MySQL服务器,它包含了配置MySQL服务器需要用到的所有Recipe等。
3) Workstation
工作台,厨师在做饭的时候通常需要一个工作台,在这里切菜,炒菜等等。在Chef中,这也是一个工作台,我们在这儿,写Recipe,做Cookbook,对目标结点进行操作等等。
4) Knife
操作用的什么呢?操作用的就是Knife,我们在Workstation中写好了Recipe、Cookbook等等,需要使用Knife才能将这些东西部署上去。
5) Role
Role可以来描述一台服务器被配置成什么样子。比如配置成web服务器、数据库服务器甚至一个论坛。它有一个run-list,这个run-list里,包含了所有需要的Recipe和Role。
6) Node
Node其实很好理解,他是一个处于Chef管理之下的目标结点。我们可以把它看成一个虚拟机、物理机等,只要是一台独立的机器,并且处于Chef的管理之下。Chef管理的所有机器都统称为一个Node。之所以把它放在Role的概念后面,是因为它和Role一样,都是需要一个run-list,并且这个run-list里都可以包含Recipe和Role。
这是Chef的结构图,对图做一点解释:
如上图,我们会看到有三大部分,Workstation、Server和Nodes。简要的说,我们在Workstation中工作,写Recipe、Cookbook等,然后上传到服务器端,服务器端根据Node Object的不同需要,从Cookbook中读取需要的Recipe等,对每一个Node实施配置。Node可以是虚拟机,云服务,实体机等等。
具体的,我们有了这幅图。
我们在这里引入Data Bag这个概念。Data Bag是一个存储信息的工具,它提供了定义全局信息的方法。我们可以在其他地方来引用这些数据。它使用json的形式来保存数据。
如图,我们在Workstation中工作,写Recipe等,然后由Recipe和Attributes等信息构成了Cookbook,我们根据Cookbook特定的版本、Environs、Roles、Data bag中的信息还有settings,使用knife这个强大的工具,将这些东西上传到服务器端。服务器端根据各种不同的Cookbook组成了一个run-list,再加上一些Attributes,针对不同的Node Object,实施部署。Nodes部分,可以是物理机、虚拟机、云、网络等各种类型。我们对每一个Node都是使用Chef-client这个工具来进行操作的。
那Ohai是什么呢?它是一个检测属性的工具,在每一次执行Chef-client之前,Ohai会检测此机器上的各种属性,提供给Chef-client。它是Chef-client的一部分。
这么一解释,大家是不是对Chef的工作过程大概有所了解呢?
这一节会具体的给大家介绍Chef的用法。当然还会引入一些新的概念。
当然,你也可以去官方网站学习。https://learnchef.opscode.com/get-started/。
我们将使用一个例子来让大家对Chef的使用有更深刻的了解。我会尽可能的将这些东西简化以便于理解。我在例子中用到的环境都是linux,如果你想用windows,我也会有链接供你参考。
在最终,我们会在浏览器中会看到一个这样的网页。
1) Set up Chef Environment
Chef有三种版本,Enterprise Chef、Open Sourse Chef和Hosted Enterprise Chef。前两种需要一台机器来自己安装Chef Server。这里,我使用最后一种简单的,不需要安装Chef Server的方式来给大家介绍。
Step 1
首先,在这里https://manage.opscode.com/starter-kit下载Starter Kit,把它解压后放在一个方便的地方。
Step 2
运行Chef installer。
curl -L https://www.opscode.com/chef/install.sh | sudo bash
curl -L https://www.opscode.com/chef/install.sh | sudo bash
Step 3
我们需要一台Node供Chef去管理。这个Node可以是物理机,但是虚拟机会更加高效。
vagrant up
Step 4
这个时候,我们已经有了一个公共ip或者主机名称了。我们需要告诉Chef,将这个Node加入进来。
如果此Node是Windows环境。在http://docs.opscode.com/plugin_knife_windows.html看具体的细节。
如果是Linux环境。我们只需要运行下面的命令:
knife bootstrap ec2-xx-xx-xx-xx.compute-1.amazonaws.com --sudo -x chef -P chef -N node1
其中,c2-xx-xx-xx-xx.compute-1.amazonaws.com
是你的node的IP地址或者主机名称,-x和-P的参数分别是用户名和密码,node1是你想给这个node起的名称。
根据需要,将上面的代码替换掉。
Verify
这个时候,我们差不多已经将此Node添加进来。在https://manage.opscode.com/organizations,你将会看到你添加的结点。
2) Create Cookbook
我们需要搭建一台web服务器,里面放一个简单的Hello World网页,当我访问此机器时,能显示出Hello World。
假设我们的环境是Linux的。如果是Windows,请移步这里参考 https://learnchef.opscode.com/tutorials/create-your-first-cookbook/#configureiisonwindowsserver
Step 1 创建一个Cookbook
运行命令 knife cookbook create iis-tutorial-1
,我们创建了一个名为create iis-tutorial-1的Cookbook。
Step 2 创建一个Recipe
在cookbooks/iis-tutorial-1/recipes/路径中创建一个文件default.rb,这样,我们就在刚才创建的Cookbook中创建了一个Recipe,名为default.rb。
现在我们需要写代码了。
写代码之前,我们在这里引入另外两个概念,Resource和Provider。
什么是Resource呢?Resource是Chef提供给你的用来描述系统的某一部分希望怎么配置(处于什么状态),请看一个例子
package "vim" do
action :install
end
这就是一条Resource,它想要表达的是希望vim安装(处于安装的状态)
这里package是一个Resource类型,这里列出几个比较常用的Resource:
下面我会列一些Resource的例子,如果你对Resource已经有理解了,可以直接跳到代码部分。
Resouece示例1
service "ntpd" do
action[:enable,:start]
end
这是一条类型为service的Resource,这描述的是:启动ntpd服务并设置成开机启动 注:虽然使用action这个词,但实际上它描述的是一种状态(它不会每次都试图去start)。
Resource示例2
user "random" do
comment "Random User" uid 1000
gid "users" home "/home/random" shell "/bin/zsh" end
上面的Resource的类型为user,名字为random,然后一些参数(uid,gid,home,shell) 它描述的是:在系统上以这些参数创建random这个用户。
Resource示例3
file "/tmp/something" do
owner "root" group "root" mode "0755" action :create
content "just test" end
这个Resource的类型为file, 名字为’/tmp/something’,动作为’create’,还有一些参数 它描述的是:
Resource示例4
template "/tmp/config.conf" do
source "config.conf.erb" variables(
:config_var => node[:configs][:config_var]
)
end
这是一个类型的template的Resource,它把服务器上的config.conf.erb文件传到客户机上,重命名为config.conf并做变量替换。
想要更加详细的解释,请移步这里http://docs.opscode.com/chef/resources.html.
Provider的概念可能比较抽象,像上面的Resource的例子,我们之所以不关关心vim怎么被安装(apt,yum…),就是因为有Provider 也就是说Provider负责把抽象的Resource对应到实际的命令(如上面的例子可能是:yum -y install vim
)。
好了,打开刚才的default.rb,现在我们可以开始写代码了。如果你的环境是Ubuntu或者Debian,使用下面的代码。
package 'apache2' do
action :install
end
service 'apache2' do
action [ :enable, :start ]
end
cookbook_file '/var/www/index.html' do
source 'index.html'
mode '0644'
end
如果你的环境是RHEL, CentOS, 或者Fedora,使用下面的代码。
package 'httpd' do
action :install
end
service 'httpd' do
action [ :enable, :start ]
end
cookbook_file '/var/www/html/index.html' do
source 'index.html'
mode '0644'
end
通过我刚才对Resource的解释,想必大家也能大概才出来这几行代码是在干什么。
Step 3 添加文件
刚才说了,我们要配置一个Web服务器,当然需要原始的web文件了。在下面的路径中 cookbooks/iis-tutorial-1/files/default/,添加index.html文件,打开文件,我们写上最简单的html代码:
<html>
<body>
<h1>Hello, world!</h1>
</body>
</html>
Step 4 上传Cookbook到Chef Server
运行如下代码: knife cookbook upload iis-tutorial-1
Step 5 创建run-list
run-list决定了这些Recipe的运行顺序。 登录manage.opscode.com,登录自己的账号,在Nodes这个tab下,选择一个node然后打开它的run-list。
将Available Recipes中你需要的Recipe,拖动到Current Run List中。然后保存。
Step 6 运行Chef-client
运行下面的代码,
knife ssh ec2-xx-xx-xx-xx.compute-1.amazonaws.com 'sudo chef-client' -m -x chef -P chef
替换掉目标ip、用户名和密码,就可以。
或者,我们可以ssh登录到目标机器,然后在去运行Chef-client。
代码如下:
ssh chef@ec2-xx-xx-xx-xx.compute-1.amazonaws.com
sudo chef-client
Step 7 验证你的网站
用浏览器打开http://ec2-xx-xx-xx-x.compute-1.amazonaws.com,你的主机的ip或者主机名称的URL,这时候,如果你看到浏览器上显示Hello World,那么你就配置成功了!
上面的文档,只是起到一个入门的作用,让你对Chef有所了解。如果你看了上面的东西,对Chef产生了兴趣,或者未来的工作中会用到它,想继续了解,可以去看官网上的学习材料和教程,或者去看官方doc文档。网址分别为:
https://learnchef.opscode.com/
https://wiki.opscode.com/display/chef/Home
Date: 2014-5-20
Author: FangChao Gao