Lin Hong's TECH Blog! 刀不磨要生锈,人不学习要落后 - Thinking ahead

[原创]Chef 入门介绍

2016-05-17

最近公司组织openstack自动化环境的搭建和学习,带头学起chef….开始接触,chef是啥?

Chef是什么

官方的介绍是这样的:Automation for Web-Scale IT.Chef delivers fast, scalable, flexible IT automation.简单来说Chef就是IT自动化工具,它把服务器的环境(软件、依赖库、网络等)进行抽象,以特有的配置语法(Ruby语言)对其进行管理,可以自动的进行服务器环境的初始化工作。Chef也是实践DevOps和Continuous Integration的重要工具,同类的工具还有puppet。

为什么需要Chef

Web开发者肯定对以下的情景熟悉:

新开发的功能在开发环境运行得很好,可是一部署到生产环境就出错了,登录到服务器上一看,少个Package没装…

也有刚入职一家新公司首先做的事情就是配环境,这个工作比较浪费时间,经常是缺这个库缺那个库,还有很多未知的坑,即使有完整的文档,手动的安装也是比较反人类的。

以上的问题总结为一句话就是环境管理的混乱,或者说根本没有环境管理。

环境管理可能是个不那么太引起开发者重视的一项事情,许多人对环境的要求只是能够跑起来,不管通过什么自虐的方式配置起来都没有问题,如果生产环境发生了变更,而开发环境没有及时变更,那么只能怨天怨地了。

其实环境管理和代码的版本控制是一样的重要,你能想象没有版本控制的开发方式吗?有人会说:我照着文档手动配置环境也很快,也不会出错啊。如果这样那么你可以关闭当前网页了。

Chef基本上做两件事:

环境管理

以自动化的方式进行服务器环境初始化或变更工作

Chef环境

Chef环境由三个部分组成:Chef server,Workstation, Node(Client)。

Chef server是Chef环境的中枢,其中存储了基础设施环境的信息。你可以使用开源Chef server,也可以使用Chef官方提供的商业服务:Enterprise Chef。

Workstation是你的工作台,一般情况下就是你的开发机器。你会在Workstation中创建cookbook,并且上传到Chef server,以及其他与Chef相关的工作。

一个Node就是你基础设施环境中的一台服务器,也就是你用Chef来管理的机器。

一个Node可以是一台物理机器,一个虚拟机,也可以是cloud环境中的一个instance,甚至是你网络环境中的一个交换机或路由器。

如果你想要在Node上部署环境,那么Node会与Chef server进行交互获取信息,并在Node上执行环境初始化操作。

Chef 安装

参考另外一篇

cookbook

cookbook是配置和策略的集合单元,它定义了一个场景,比如部署Apache环境。一个cookbook包含了很多组件来支持实现这个场景:

cookbook的目录
[root@workstation chef-repo]# pwd
/root/chef-repo
[root@workstation chef-repo]# ls -ltr
total 20
drwxr-xr-x. 2 root root    22 May 13 05:30 roles
-rw-r--r--. 1 root root  1798 May 13 05:30 README.md
-rw-r--r--. 1 root root 10850 May 13 05:30 LICENSE
drwxr-xr-x. 2 root root    22 May 13 05:30 environments
drwxr-xr-x. 2 root root    22 May 13 05:30 data_bags
-rw-r--r--. 1 root root   156 May 13 05:30 chefignore
drwxr-xr-x. 4 root root    57 May 18 23:01 cookbooks
[root@workstation chef-repo]# cd cookbooks/
[root@workstation cookbooks]# ls -ltr
total 12
-rw-r--r--.  1 root root 3064 May 13 05:30 README.md
drwxr-xr-x. 10 root root 4096 May 18 04:55 my-test-02
drwxr-xr-x. 10 root root 4096 May 18 23:01 file_create
[root@workstation cookbooks]# cd my-test-02
[root@workstation my-test-02]# ls -ltr
total 12
drwxr-xr-x. 2 root root    6 May 18 04:55 attributes
drwxr-xr-x. 3 root root   20 May 18 04:55 templates
drwxr-xr-x. 2 root root    6 May 18 04:55 resources
-rw-r--r--. 1 root root 1483 May 18 04:55 README.md
drwxr-xr-x. 2 root root    6 May 18 04:55 providers
drwxr-xr-x. 2 root root    6 May 18 04:55 libraries
drwxr-xr-x. 3 root root   20 May 18 04:55 files
drwxr-xr-x. 2 root root    6 May 18 04:55 definitions
-rw-r--r--. 1 root root  445 May 18 04:55 CHANGELOG.md
-rw-r--r--. 1 root root  284 May 18 04:55 metadata.rb
drwxr-xr-x. 2 root root   37 May 18 04:56 recipes
[root@workstation my-test-02]# 

attributes:用来设置node的属性,类似于定义一个全局变量,通常用来给 Cookbook 的其他组件提供属性值。

definitions:用来创建可以重用的resource集合

files:一些需要的文件。用于部署的文件,一般会根据操作系统、平台等定义不同的文件配置。

libraries:用来扩展chef-client或者添加一些helper到Ruby中,用 Ruby 语言编写自己的类来供 Recipe 调用。

metadata.rb:包含一些元数据,比如cookbook的名字、版本、支持的平台等等

recipes:存储recipe,每个recipe指定了需要的resource以及这些resource执行的顺序。其实用来定义对一个目标机器做部署的整个操作,比如,如何安装,安装哪些包,怎样做配置等。

resources:存储自定义的resource,自定义一个状态的运行规则,如,针对服务的时候,我们可以定义几种不同的状态规则。

providers:存储自定义的provider,定义具体某个 Resource 的执行内容,从编程的角度可以理解为 Resource 定义了一个接口,而 Provider 是这个接口的实现。

templates:存储ruby模板语言描述的文件,用来解决复杂的配置场景(内嵌了 Ruby 标签的文件,定义配置文件。)

recipe

每个cookbook都会包含一到多个recipe(默认是default.rb)。一个recipe就是实现cookbook所描述场景的步骤。看以下这个简单的recipe:

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

可以看出这个recipe分为三个步骤,分别是安装apache2、启动apache2、拷贝文件。

resource和provider
resource就是recipe中的配置项,可以是package、service、bash等等。provider就是为这些resource提供实现的程序。以编程语言来描述的话,resource定义了接口,provider提供了不同平台的实现。


Comments