Chef 101 - Cookbook

Chef Cookbook由一系列针对某个代码包的配方组成。
Cookbook的目录结构类似这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/cookbooks/ntp/
├── attributes
├── definitions
├── files
│ └── default
├── libraries
├── metadata.rb
├── providers
├── README.md
├── recipes
│ ├── default.rb
│ └── ntp.rb
├── resources
└── templates
└── default
└── ntp.conf.erb

以Nginx的 官方 Cookbook 举例:

https://github.com/miketheman/nginx

metadata.rb

元数据文件中包含了说明文档,作者,版本号,所支持的系统和依赖cookbook等信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
name 'nginx'
maintainer 'Opscode, Inc.'
maintainer_email 'cookbooks@opscode.com'
license 'Apache 2.0'
description 'Installs and configures nginx'
version '2.7.4'
recipe 'nginx', 'Installs nginx'
recipe 'nginx::source', 'Installs nginx from source'
depends 'apt', '~> 2.2'
supports 'ubuntu'
attribute 'nginx/log_dir',
:display_name => 'Nginx Log Directory',
:description => 'Location for nginx logs',
:default => '/var/log/nginx'
  • support 指定这个cookbook支持的操作系统。
  • attribute 是一些配置项的默认值。

recipes/default.rb

Cookbook中必须包含 default 的 recipe,在node或role中使用该cookbook时若没有指定recipe,会使用该默认recipe。

打开 recipes/repo,可以看出,它在Ubuntu上的安装方式如下:

1
2
3
4
5
6
7
8
9
include_recipe 'apt::default'
apt_repository 'nginx' do
uri node['nginx']['upstream_repository']
distribution node['lsb']['codename']
components %w(nginx)
deb_src true
key 'http://nginx.org/keys/nginx_signing.key'
end

attributes/default.rb

attributes中用来放置recipe中所需要的默认配置。

1
2
3
4
5
6
7
default['nginx']['version'] = '1.4.4'
default['nginx']['package_name'] = 'nginx'
default['nginx']['dir'] = '/etc/nginx'
default['nginx']['script_dir'] = '/usr/sbin'
default['nginx']['log_dir'] = '/var/log/nginx'
default['nginx']['binary'] = '/usr/sbin/nginx'
default['nginx']['default_root'] = '/var/www/nginx-default'

取值,可以这样:

1
node[:nginx]['package_name']

属性除了可以在在文件中定义外,还可以:

  • 节点定义
  • 角色定义
  • 食谱默认值

http://docs.opscode.com/essentials_cookbook_attribute_files.html

templates

1
2
3
4
5
6
7
8
9
.
├── debian
│   └── nginx.init.erb
├── default
│   ├── default-site.erb
│   ├── nginx.conf.erb
│   └── nginx.init.erb
└── ubuntu
└── nginx.init.erb

模板支持erb,可以根据配置来解析生成最终文件,存放到配置的位置。recipes/commons_conf.erb中可以看到对 nginx.conf.erb 的配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 这段代码的作用如下:
# 1. 在 template/ubuntu 文件夹中寻找文件 nginx.conf.erb
# 2. 解析这个文件中的所有 erb 代码,然后把文件复制到节点上,存放位置为 /etc/nginx/nginx.conf
# 3. 把这个文件的拥有者设为 root 用户组的 root, 权限为 0644
template 'nginx.conf' do
path "#{node['nginx']['dir']}/nginx.conf"
source 'nginx.conf.erb'
owner 'root'
group node['root_group']
mode '0644'
notifies :reload, 'service[nginx]'
end

关于debin/default/ubuntu目录的说明:模板会根据你的系统自动选择,如果是ubuntu,会找到template/ubuntu/xxx 文件,找不到,会去default目录下查找。

REF::