前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

Chef

作者头像
gaofc
发布2018-05-09 17:39:52
1.4K0
发布2018-05-09 17:39:52
举报
文章被收录于专栏:人云亦云人云亦云

Author: Fangchao Gao 转载请注明出处

此文档适合于对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结构

1
1

这是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怎么工作

2
2

如上图,我们会看到有三大部分,Workstation、Server和Nodes。简要的说,我们在Workstation中工作,写Recipe、Cookbook等,然后上传到服务器端,服务器端根据Node Object的不同需要,从Cookbook中读取需要的Recipe等,对每一个Node实施配置。Node可以是虚拟机,云服务,实体机等等。

具体的,我们有了这幅图。

3
3

我们在这里引入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,我也会有链接供你参考。

在最终,我们会在浏览器中会看到一个这样的网页。

4
4

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。

现在我们需要写代码了。

写代码之前,我们在这里引入另外两个概念,ResourceProvider

什么是Resource呢?Resource是Chef提供给你的用来描述系统的某一部分希望怎么配置(处于什么状态),请看一个例子

代码语言:javascript
复制
	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

代码语言:javascript
复制
	service "ntpd" do
  			action[:enable,:start]
	end

这是一条类型为service的Resource,这描述的是:启动ntpd服务并设置成开机启动 注:虽然使用action这个词,但实际上它描述的是一种状态(它不会每次都试图去start)。

Resource示例2

代码语言:javascript
复制
	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

代码语言:javascript
复制
	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

代码语言:javascript
复制
	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,使用下面的代码。

代码语言:javascript
复制
	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,使用下面的代码。

代码语言:javascript
复制
	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代码:

代码语言:javascript
复制
	<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。

5
5

将Available Recipes中你需要的Recipe,拖动到Current Run List中。然后保存。

6
6

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。

代码如下:

代码语言:javascript
复制
	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

Date: 2014-5-20

Author: FangChao Gao

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 What’s Chef?
  • 2 What’s in Chef?
  • 3 How Chef Works?
    • 3.1 Chef结构
      • 3.2 Chef三种模式
        • 3.3 Chef怎么工作
          • 3.4 Chef怎么用
          • 4 What’s next?
          • Reference
          相关产品与服务
          云数据库 MySQL
          腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档