原创文章,转载请保留此文链接 https://blog.csdn.net/flygfch/article/details/88187371,或访问本人博客 http://fangchao.me/2014/05/20/Chef.html
本文目录
此文档适合于对Chef不了解,或者仅仅是了解但并未真正使用过Chef的用户。如果您对Chef充分了解,并且经常使用Chef,想要了解其中的技术,那么此文档可能并不是真正的适合您。
1 What’s Chef?
假设我们需要搭建一台MySQL的服务器,安装配置花费了很多时间,中间偶尔出错,但是终于搭建成功了。没过多久,我们需要另一台或者更多的MySQL服务器,于是我们不得不重复此前的安装配置步骤了。于是我们就想到了,把这些安装过程写成脚本,这样不但节约时间,而且不容易出错。
Chef就相当于这样的脚本管理工具。但其功能、可定制性和便捷性都要强大的多,它将脚本命令代码化,定制时只需要修改代码,而不需要修改命令,Chef自动会将一台机器配置成你想要的样子。
它是由Ruby开发的,服务器的构成管理工具。
2 What’s in Chef?
可能是便于用户理解吧,Chef开发团队在开发的时候,将所有的东西都形象的映射到了厨房里,或者说做饭的过程,大家从’Chef’这个命名就可以看出。下面我将以类比的方法,给大家讲一讲Chef中的一些主要的概念。剩下的概念,我们在下一节中写Recipe的时候再讲。
1) Recipe
第一个要讲的是Recipe,食谱。厨师在做菜的时候,是需要知道这个菜的做法,也就是食谱的。当然他们肯定不会边看食谱,边做菜吧。如果是这样的话,他们肯定不是一个合格的厨师。但是从计算机的角度来讲呢,可能我们真需要在每一次做菜前去看看食谱。
食谱里面写的是什么呢?肯定是这道菜怎么做吧。第一步做什么,第二步做什么等等。
在配置计算机的过程中,也是一样的,它需要知道,把这台计算机配置你想要的样子,每一步的步骤是什么。
比如配置一台ntp服务器,我们可能需要三个步骤。
- 安装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。
3 How Chef Works?
3.1 Chef结构
这是Chef的结构图,对图做一点解释:
- 有一个中心服务器(运行chef-server)
- Chef将数据存储在CouchDB数据库里面
- RabbitMQ和chef-solo等提供搜索的功能
- Chef还提供了个图形的用户界面(cher-server-webui)
- 可以有多个Workstation(运行knife工具对Chef进行配置)
- Workstation上有一个pem文件,knift利用它作为认证来和chef-server通过REST API进行通信
- Workstation将配置(利用Recipe等描述各Client应该如何配置自己)上传到服务器
- Workstation和中心服务器可以在同一台机器
- 可以有多个Client(运行chef-server的被配置机器)
- Client上有一个pem文件,chef-client利用它作为认证来和chef-server通过REST API进行通信
- 当新加一个Client的时候,需要从中心服务器上拷贝validator.pem到新加的Client
*它利用这个pem进行注册得到自己的client.pem进行以后的认证 - Client连到Chef服务器查看如何配置自己,然后进行自我配置
3.2 Chef三种模式
- Chef-Solo
由一台普通电脑控制所有的服务器,不需要专设一台chef-server - Client-Server
所有的服务器作为chef-client,统一由chef-server进行管理,管理包括安装、配置等工作 chef-server可以自建,但安装的东西较多,由于使用solr作为全文搜索引擎,还需要安装java - Opscode Platform
类似于Client-Server,只是Server端不需要自建,而是采用http://www.opscode.com 提供的chef-server服务
3.3 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的工作过程大概有所了解呢?
3.4 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。
- 如果是Windows,在这里http://www.getchef.com/chef/install/下载后双击安装。
- 如果是Ubuntu,运行
curl -L https://www.opscode.com/chef/install.sh | sudo bash
- 如果是OS X,运行
curl -L https://www.opscode.com/chef/install.sh | sudo bash
Step 3
我们需要一台Node供Chef去管理。这个Node可以是物理机,但是虚拟机会更加高效。
- Amazon EC2是官方他们推荐的。
如果你是Vagrant的用户,你也可以使用Vagrant。你需要做的,仅仅是一条命令:
vagrant up
- 当然也可以使用他们自己的Chef Training Lab。在这里
看如何申请它们的虚拟机。
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安装(处于安装的状态)
- 它有一个Resource类型(package)
- 有一个名字(vim)
- 可能还会有一些可选的参数(这个例子里没有)
- 有一个动作(install)(实际上描述一种状态(和Puppet里的ensure类似))
这里package是一个Resource类型,这里列出几个比较常用的Resource:
- Directory
- Execute
- File
- Group
- Package
- Script
- Service
- Template
- User
下面我会列一些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’,还有一些参数 它描述的是:
- 在被管理服务器上创建文件’/tmp/something’,
- 这个文件的拥有者和拥有组都是root,
- 这个文件的模式为0755,
- 这个文件内容为’just test’
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,那么你就配置成功了!
4 What’s next?
上面的文档,只是起到一个入门的作用,让你对Chef有所了解。如果你看了上面的东西,对Chef产生了兴趣,或者未来的工作中会用到它,想继续了解,可以去看官网上的学习材料和教程,或者去看官方doc文档。网址分别为:
https://learnchef.opscode.com/
https://wiki.opscode.com/display/chef/Home
Reference
- Learn Chef https://learnchef.opscode.com/
- Chef Wiki https://wiki.opscode.com/display/chef/Home
- Chef基础 http://my.oschina.net/williamherrychina/blog/63576
Date: 2014-5-20
Author: FangChao Gao