原创

Chef

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结构

这是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。

现在我们需要写代码了。

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

什么是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

Date: 2014-5-20

Author: FangChao Gao

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Chef

    gaofc
  • Chef 的安装与使用

    Chef 是一款自动化服务器配置管理工具,可以对所管理的对象实行自动化配置,如系统管理,安装软件等。Chef 由三大组件组成:Chef Server、Chef ...

    菲宇
  • 看我如何获取Chef服务器的Meterpreter Shell

    这篇文章主要是想警告使用Chef的朋友,你们的管理员账户很可能早已在Chef web interface中泄露。管理员通常无法设置默认管理凭据。在这种情况下,C...

    FB客服
  • 可用于集群的开源软件赏:Chef

    目前我在腾讯主要负责一个服务器端软件的相关开源项目,所以接下来几天的开源内容是最近工作上积累的一些经验和想法,下图中的内容就是我目前主要的工作内容和一些小小的成...

    韩伟
  • 谷歌和大学研究人员利用深度学习发现系外行星

    谷歌和多所大学的研究人员使用一个名为AstroNet K2的卷积神经网络发现了两颗新的系外行星。通过进一步的研究,另外14个天体也可以被确定为系外行星。

    AiTechYun
  • 深拷贝和浅拷贝原来是这样?

    为了让读者更好的理解深浅拷贝,在讲深浅拷贝之前要引入基本数据类型 , 引用数据类型 和 数据储存(栈和堆)这几个概念,如果已经理解,可直接跳过这一part。

    IT人一直在路上
  • TensorFlow-手写数字识别(一)

    本篇文章通过TensorFlow搭建最基础的全连接网络,使用MNIST数据集实现基础的模型训练和测试。

    xxpcb
  • 博客 | MNIST 数据集载入线性模型

    这节开始我们使用知名的图片数据库 「THE MNIST DATABASE」 作为我们的图片来源,它的数据内容是一共七a万张 28×28 像素的手写数字图片,并被...

    AI研习社
  • 如何用一条命令将网页转成电脑 App

    大家有没有一种感觉,很多网站其实做得非常优秀,但是它们就是没有开发 PC (电脑)版的客户端,比如知乎、GitHub、微信公众号。

    崔庆才
  • 如何用一条命令将网页转成电脑 App

    大家有没有一种感觉,很多网站其实做得非常优秀,但是它们就是没有开发 PC (电脑)版的客户端,比如知乎、GitHub、微信公众号。

    蓝默空间

扫码关注云+社区

领取腾讯云代金券