Chef入门(二)

Chef

上一篇文章Chef入门(一)我们介绍了Chef是什么、以及如何搭建Chef环境。这篇文章,我们介绍一下Chef中的一些概念以及如何编写cookbook,并在此过程中部署一个Apache环境,通过本文你可以学到:

一些概念

cookbook

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

-rw-r--r--  1 weizhifeng  staff   495 Jul 21 11:01 CHANGELOG.md
-rw-r--r--@ 1 weizhifeng  staff  1536 Jul 21 11:01 README.md
drwxr-xr-x  2 weizhifeng  staff    68 Jul 21 11:01 attributes
drwxr-xr-x  2 weizhifeng  staff    68 Jul 21 11:01 definitions
drwxr-xr-x  3 weizhifeng  staff   102 Jul 21 11:01 files
drwxr-xr-x  2 weizhifeng  staff    68 Jul 21 11:01 libraries
-rw-r--r--@ 1 weizhifeng  staff   298 Jul 21 11:01 metadata.rb
drwxr-xr-x  2 weizhifeng  staff    68 Jul 21 11:01 providers
drwxr-xr-x  3 weizhifeng  staff   102 Jul 26 11:05 recipes
drwxr-xr-x  2 weizhifeng  staff    68 Jul 21 11:01 resources
drwxr-xr-x  3 weizhifeng  staff   102 Jul 21 11:01 templates

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提供了不同平台的实现。

实战

说了那么多概念,我们接下来在ubuntu上安装并配置Apache。

第一步:创建cookbook

在workstation中,我们通过knife来和Chef server进行交互。执行以下命令来创建一个cookbook。

$ cd ~/chef-repo
$ knife cookbook create apache-tutorial-1

执行完成之后,在~/chef-repo/cookbooks目录下会生成名为apache-tutorial-1的cookbook。不过cookbook都是在本地的,还没有上传到Chef server。

第二步:编写recipe

当你创建了一个cookbook,Chef会帮你创建一个默认的recipe。用你的编辑器打开~/chef-repo/cookbooks/apache-tutorial-1/recipes/default.rb。现在让我们来写一些ruby代码来执行以下的动作:

把以下代码添加到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的最后一步我们使用了cookbook_file来拷贝home page。把以下内容添加到文件~/chef-repo/cookbooks/apache-tutorial-1/files/default/index.html中。

<html>
<body>
  <h1>Hello, world!</h1>
</body>
</html>

第四步:上传cookbook

在你的chef-repo目录中执行以下命令来上传cookbook。

$ knife cookbook upload apache-tutorial-1

第五步:创建run list

run list定义了recipe的执行顺序,当前的例子中我们的run list中只有一个recipe。打开manage.opscode.com,我们来配置run list。

Chef

然后从Available Recipes中拖拽recipe到Current Run List之中。然后点击Save Run List

Chef

第六步:运行chef-client

接下来你需要执行chef-client来从Chef server获取最新的cookbook,并且在目标node上执行。你可以自己登录到node上,然后手动执行。

$ ssh chef@your.host
$ ssh sudo chef-client

或者使用knife。

$ knife ssh your.host 'sudo chef-client' -m -x chef -P chef

-x表示username,-P表示password。

如果你使用的是vagrant,则执行如下命令。

$ knife ssh localhost 'sudo chef-client' -m -x vagrant -P vagrant --ssh-port 2200
Starting Chef Client, version 11.12.8
resolving cookbooks for run list: ["apache-tutorial-1"]
Synchronizing Cookbooks:
  - apache-tutorial-1
Compiling Cookbooks...
Converging 3 resources
Recipe: apache-tutorial-1::default
  * package[apache2] action install (up to date)
  * service[apache2] action enable (up to date)
  * service[apache2] action start (up to date)
  * cookbook_file[/var/www/index.html] action create (up to date)

Running handlers:
Running handlers complete

Chef Client finished, 0/4 resources updated in 19.554803129 seconds

等chef-client执行完成之后,你会发现Apache已经配置好并且运行了,并且把home page拷贝到了/var/www/index.html,访问80端口应该可以看到home page的输出。

至此我们已经创建了自己的cookbook,并在目标node上执行,更多的内容可以查看官方文档

参考

(全文完)
comments powered by Disqus
Powered by Github  &&  Jekyll
Fork me on GitHub