Chef 专用术语

由名字谈开去

Chef的开发团队将其命名为Chef(大厨),是有其意义的。

大厨,给我们的第一印象,就是专业。

专业的大厨,拥有各种菜的菜谱(Cookbooks)及其制作方法(Recipes),可以把每道菜都做的很美味可口,而且,不管做多少遍,每道菜的口味都不会变味。

如果把配置服务器这个过程,类比做菜,那么Chef,就是一个专业的大厨,你只要把指定的菜谱(Cookbook)告诉Chef就可以了,它会帮你自动完成。

而每个node,好比是你要招待的每个客人,你可以告诉Chef,给他们上同样的菜,也可以为每个客人指定专门的菜。Chef都会出色的完成工作。

抽象的力量

我们可以看得出来,Chef,把整个服务器的配置管理工作做了抽象,把每个服务器变成了一个个可编程的单元,这样就能方便的去做自动化了。

我们来看看Chef是怎么抽象的:

  • 在Workstation上定义各个Client(Chef Node)应该如何配置自己,然后将这些信息上传到中心服务器(Chef Server)
  • 每个Client连到中心服务器(Chef Server)查看如何配置自己,然后进行自我配置

先来理解下这句话: 「定义每个Client该如何配置自己」

这句话有两层意思:

  • 每个Client都是可以定义如何配置的
  • 每个Client的配置都有可能和别的Client不同

而一个Client配置的定义,是由Cookbook来完成的。

一个Cookbook的构成

比如,你要往某个Client上安装apache2,那么,执行下面命令:

$ knife cookbook create apache-tutorial-1

注意: 要进到你的chef-repo目录下去执行上面的命令。 因为你的.chef目录中knife.rb定义的Cookbook目录决定这个命令会把apache-tutorial-1这个Cookbook创建在哪里。

可以参考我的目录结构(编辑器为Atom):

Chef Repo chef repo

如图,可以看到,一个Cookbook的结构。

  • attributes

    属性(Attributes)就是节点(Node)的信息,如IP地址,主机名,加载的内核模块,系统中可用的编程语言的版本以及更多.新的属性可以用多种方式加到节点上.

  • definitions

    你可以在这里定义一段通用代码,可以在多个recipes中使用,你可以把它理解为「宏定义」。实际就是Ruby中动态定义的方法,后续有更详细的例子。

  • files

    文件,是一种资源(resources),这里定义的是文件该如何分发到各个服务器,包括节点、平台和版本信息。

  • libraries

    这里允许定义任意的Ruby代码,用于扩展你的Cookbook。

  • providers

    Provider负责把抽象的Resource对应到实际的命令(比如一个例子, 安装vim的动作,对应到Centos系统命令是:yum -y install vim, 而Ubuntu下命令是:apt-get install vim -y)。

  • recipes

    定义了多个resources,通俗的说,就是定义了这个Cookbook该如何进行配置。

  • resources

    Resource是Chef提供给你的,用来描述系统的某一部分希望怎么配置的具体的东西。稍后看例子。

  • templates

    这里定义了模板文件,用于从服务端复制配置文件到客户端,复制的过程中还可以进行变量替换。这样,不同的服务器上就可以有不同的配置。

  • metadata.rb

    这个文件记录了一个Cookbook本身的元信息。

介绍完了Cookbook的结构,让我们来动手吧。