Chef框架之Cookbook的介绍及应用

简介

Chef 作为自动化部署框架,Cookbook 是其整个框架的核心部分之一。通过对本文的阅读,您可以了解 Cookbook 的结构以及如何编写一个可用于产品部署的 Cookbook。通过 Chef 框架,应用到实际的客户环境中,从而完成定制化的部署工作。

Chef 的简单介绍

Chef 主要分为三个部分 Chef Server、Workstation 以及 Chef Client。用户在 Workstation 上编写 Cookbook。然后,通过 knife 命令上传到 Chef Server。最后,在 Chef Client 上实施安装和部署工作。所以,对于 Cookbook 的编写在整个自动化部署中起到了重要的作用。

Cookbook 介绍

Cookbook 是 Chef 框架的重要基础功能之一。在 Chef Server 对目标机器做安装部署的时候,是通过 Runlist。而 Runlist 里面又包含了一个一个具体的 Cookbook,所以,最终对一个目标机器的部署任务就落到了 Cookbook 上。而对于 Cookbook 来说,其中包含了多个组件,我们可以将 Cookbook 简单的理解成一个容器或者可以理解为一个包,里面包含了 recipes、files、templates、libraries、metadata 等信息。这些信息用于配置我们的目标机器。

Cookbook 的作用

Cookbook 可以通过封装,将安装部署和用户分隔开。用户不再需要了解如何安装一个环境,他们只需要用一套已经存在的 Cookbook 就可以部署出一套完整的用户环境。并且,Chef 框架支持重复部署的这个特点,使用户再也不用担心一次安装失败导致的环境不可重复安装的问题。Cookbook 支持版本管理,这样我们就可以根据不同的版本编写不同的 Cookbook,在使用的时候,我们只要在 Chef 框架的 Environment 里指定好 Cookbook 的版本就可以了。这样我们就可以在一套 Chef 框架里,根据 Cookbook 的不同,同时部署出不同的环境。

Cookbook 的结构介绍

Cookbook 主要分为如下几个组件:

  • Recipe 是用来定义对一个目标机器做部署的整个操作,比如,如何安装,安装哪些包,怎样做配置等。
  • Attribute 是用来定义一个目标机器的属性值的。类似于定义一个全局变量,通常用来给 Cookbook 的其他组件提供属性值。
  • File 是用来作部署的文件。一般会根据操作系统、平台等定义不同的文件配置。
  • Library 用来对 Cookbook 的功能做扩展。我们可以用 Ruby 语言编写自己的类来供 Recipe 调用。
  • Resource 用来自定义一个状态的运行规则。比如,针对服务的时候,我们可以定义几种不同的状态规则。
  • Provider 用来定义具体某个 Resource 的执行内容。从编程的角度可以理解为 Resource 定义了一个接口,而 Provider 是这个接口的实现。
  • Template 一些内嵌了 Ruby 标签的文件,通常用来定义配置文件。
  • Metadata 定义了 Cookbook 的属性值,比如,当前的 Cookbook 的版本,支持的平台,对其他 Cookbook 的依赖等信息。

常用 Resource 的介绍

Resource 是我们编写 Cookbook 最常用到的组件之一,用来定义一个状态规则,供用户使用。其具体实现是相对应的 Provider 类。Chef 框架本身已经内置定义好了很多常用的 Resource,我们只需要了解并使用他们就可以完成我们想要达到的某些部署功能。

下面介绍几个常用的 Resource,通过这些 Resource 我们就可以完成基本的工具包的安装、服务的启动、路径的检查等功能。

  • execute – 是用来在目标机器上执行一条命令,相应的 Provider 是 Chef::Provider::Execute。
清单 1. execute 语法规则
execute <name> do
attribute “value”
end

下面列举几个常用的属性,对于 execute 的更详细用法可以参考文章后面的相关链接。

属性说明:

  • command - 用来执行的命令。
  • cwd - 当前工作路径。
  • Action
    • :nothing – 由其他的 Resource 触发当前的命令执行。
    • :run – 执行当前命令。
  • name – 当前 execute 的名字,但如果 command 属性没有指定的时候,execute 会用 name 作为命令行执行。
清单 2. execute 使用例子
execute “test command” do
	action :run
command “echo ‘this is test command’>test.log”
	cwd “/root”
end

当在 Chef Client 上运行这段代码后,会在/root 的路径下生成一个 test.log 的文件,里面保存了“this is test command”的字符串。

  • directory – 用来管理目录结构。相应的 Provider 是 Chef::Provider::Directory。
清单 3. directory 语法规则
directory <path> do
attribute “value”
End

属性说明:

Action

:create – 创建一个目录。

:delete – 删除一个目录。

owner – 目录的用户。

group – 目录的组。

mode – 目录的模式。

清单 4. directory 使用例子
directory “/tmp/mydir” do
	owner “root”
	group “root”
	mode “0755”
	action :create
end

上面代码的执行效果是创建了一个 mydir 的目录在/tmp 下,并设置好了相应的 0755 权限。

  • package – 用来管理安装包,如,rpm、gem 等。相对应的 Provider 是 Chef::Provider::Package。

yum_package – 用来管理安装的 rpm 包。相应的 Provider 是 Chef::Provider::Package::Yum。

yum_pakcage 是对 package 的一个扩展。具体的语规则法和 package 是基本相同的。

清单 5. package 语法规则
package <name> do
attribute “value”
end

属性说明:

Action

:install – 安装一个包。

:upgrade – 升级一个包。

:remove – 删除一个包。

version – 包的安装版本。

arch – 安装包的 arch,比如,ppc64、x86_64。

清单 6. package 使用例子
package “gnote” do
action :remove
end

运行结果是将 gnote 包从目标机器上删除。

  • yum_repository – 用来对 yum 源进行配置和管理。
清单 7. yum_repository 语法规则
yum_repository <name> do
attribute “value”
end

属性说明:

description – Yum 源的描述信息。

baseurl – Yum 源的 url 信息。

Action

:create – 创建 Yum 源的配置文件,并配置 Yum 源。

:delete – 删除 Yum 源。

清单 8. yum_repository 使用例子
yum_repository "ftp-repo " do
name "FTP yum repository - Test"
baseurl "ftp://yourid:password @testrepo.com /redhat/yum/6/server/os/x86_64/"
end

运行结果是生成一个 ID 为 ftp-repo 的 yum 源在目标机器上。

应用案例

下面通过案例来编写完整的 Cookbook,进一步说明 Cookbook 的使用并完成自动化部署。

对 Chef Server 和 Workstation 的安装不是本文的内容范围,对应 Chef 环境的安装可以参考本文参考资料里相关的连接,在此不做详细说明,现在假定我们是在一个已经安装好 Chef 框架的环境下进行当前的案例。环境信息如下:

Chef Server 版本是 11.1 Red Hat 6.5 x86_64

Chef Client 版本是 11.12 Red Hat 6.5 x86_64

首先,安装一个 Chef Client。命令如下:

清单 9. 安装 Chef Client 命令
knife bootstrap 9.114.192.244 --sudo –x root -P passw0rd -N ip9-114-192-244.pok.stglabs.ibm.com

当 Chef Client 安装好后,我们可以在目标机器上运行 chef-client 命令,确认该命令是否可以识别。下一步就是创建一个我们自己的 Cookbook。在此我们取名为 my-test,在 Workstation 上运行如下命令创建一个 Cookbook。

清单 10. 创建 Cookbook
knife cookbook create my-test

当 Cookbook 创建好后,我们先来认识下它的基本目录结构。如下图所示:

图 1.Cookbook 目录结构
图 1 Cookbook 目录结构

这里面包含了 attributes、files、libraries、providers、recipes 等目录,每个目录用于放置对应于 Cookbook 的组件文件。一个 Cookbook 的调用入口就是 recipes,在这里面定义了一个 Cookbook 的某种执行方式。下面我们来写一个简单的 Recipe,里面只定义一个“hello world”字样。添加的位置如下图所示:

图 2.Recipe 目录
图 2 Recipe 目录

test.rb 的内容如下:

清单 11. Test Recipe
puts “Hello World!”

上传 Cookbook 到 Chef Server:

清单 12. 上传 Cookbook
knife cookbook upload my-test

添加一个 Cookbook 到指定的目标机器上。命令如下:

清单 13. 应用 Cookbook
knife node run_list add ip9-114-192-244.pok.stglabs.ibm.com recipe[my-test::test]

当以上操作都成功完成后,我们就可以在 Chef Client 端运行 chef-client 命令来进行自动化部署了。结果如下图:

图 3.部署 Cookbook 结果
图 3 部署 Cookbook 结果

在这里我们可以看到“Hello World!”被成功输出。

正如前文提到了很多 Chef 框架已经定义好的 Resource,我们可以在 Recipe 里直接定义使用,下面我们在此基础上再添加一些小的功能来熟悉下 Cookbook 的使用。

下面我们来配置一个 yum 源然后再安装一个叫 screen 的工具包。

首先,定义 screen 工具的安装,代码如下:

清单 13. screen 安装
package “screen” do
action :install
end

其次,修改好 test.rb 文件后,上传 my-test Cookbook 到 Chef Server。再次,在目标机器上运行 chef-client。执行结果如下图所示,screen 已经被成功的安装好了。

图 4.部署 screen 结果
图 4 部署 screen 结果

这里需要注意的是,我们需要提前配置好一个可用的 YUM 源。有时候我们想自定义一些 Resource 作为 Cookbook 的扩展,这时候就需要用到 Resource 和 Provider 的定义了。下面我们将 screen 工具包的安装放到我们自定义的 Resource 中运行,在 Recipe 里执行 screen 包的卸载操作。

首先,定义一个 Resource 名字叫 my-install 的 Ruby 文件。内容如下:

清单 14. Resource 定义
actions :install
default_action :install
attribute :name, kind_of: String, required: true, name_attribute: true

其次,定义一个同名的 Provider 来具体实现这个 Resource 的 install action。具体代码如下:

清单 15. Provider 实现
action :install do
rpm_name = new_resource.name
package rpm_name do
action :install
end
end

最后,通过 Recipe test.rb 的调用来执行我们自定义的 Resource。Recipe 内容如下:

清单 16. Recipe 调用
package "screen" do
action :remove
end

mytest_myinstall "screen" do
action :install
end

这里需要注意的是在 Recipe 里调用的 Resource 的名字是由 Cookbook 的名字和 Resource 的名字组成,中间通过下划线连接。运行结果如下图所示,我们先删除了 screen 工具包,然后再通过自定义的 Resource 来安装这个工具。

图 5.运行结果
图 5 运行结果

在部署一个环境的时候除了对包的安装,还有一个重要的操作就是对配置文件的部署。这个功能主要由 Cookbook 的 template 和 file 组件完成。这两个功能都可以完成把一个配置文件放到目标机器的指定位置。下面我们举个例子。首先,创建一个 helloworld.html 和 helloworld.html.erb 分别放到 files/default 和 template/default 路径下。具体目录结构参考下图所示:

图 6.template 和 file 的目录结构
图 6 template 和 file 的目录结构

通过 file 完成文件部署的时候使用的 cookbook_file 这个 Resource。后面的的名字就是部署在目标机器上的最终全路径位置。如清单代码所示,要把 files 下的 helloworld.html 文件放到目标机器的/var/www/html 路径下。

清单 17. file 调用
cookbook_file "/var/www/html/helloworld.html" do
source "helloworld.html"
mode "0644"
end

对于 template 的调用,首先需要编写一个.erb 的文件放在 templates/default 下面。template 是可以内嵌 Ruby 代码的,这就方便我们在 template 文件中进行参数传值,从而应付多变的环境。下面是一个简单的 template 的调用,完成的功能和上述 file 一样就是简单的把文件部署到/var/www/html 路径下。这里需要注意的就是 source 属性,这个属性就是要对应需要进行渲染的.erb 文件。

清单 18. template 调用
template "/var/www/html/helloworld.html " do
source " helloworld.html.erb"
end

至此,我们对 Cookbook 的基本功能做了介绍,您就可以根据自己的需求,尝试编写一个自己的 Cookbook 来完成包的安装、自定义 Resource 以及配置文件的部署。

总结

在平时的工作中,对于不同基础架构的项目搭建,并没有一套完整的自动化部署方案。而 Chef 有一套完整的自动化部署架构,可以通过 Cookbook 应对复杂的基础架构和多平台的部署方案。而 Cookbook 是基于 Ruby 编写,其语法特点更面向对象,简单易用,可以使用户快速上手编写,从而帮助用户快速完成自动化部署。

From:http://www.ibm.com/developerworks/cn/cloud/library/1504_wangqw_chefcookbook/index.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值