Chef 101 - Role & Node

Chef 中 Node 是必须的,它对应到一台具体的Server,指定要在Server上安装的软件集和配置。但Role不是必须的,Role 的主要作用是将一些Cookbook组合起来,形成一个有意义的主题,像Nginx Server,MySQL Server这样的,在Node中可以更方便的去使用。(一个Node可以包含任意多个Role或Recipe)。

Node

https://docs.chef.io/nodes.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"environment": "production",
"authorization": {
"sudo": {
"users": ["deploy"]
}
},
"run_list":
[
"role[bootstrap-server]",
"role[nginx-server]"
],
"automatic": {
"ipaddress": "10.0.0.1"
}
}

attributes

这其中的environment, authorization, automatic都是attribute,它们会override掉role, cookbook或recipe中的attribuet default值。

  • environment是自己写的,后期在判断环境中的。
  • authorization 来自 sudo cookbook;
  • automatic 还不知道用途。

run_list

是一个数组,Chef 会依次安装执行列出的配方和角色

  • 角色使用如下格式: role[role_name]
  • 配方使用如下格式: recipe[cookbook_name::recipe]

Role

http://docs.chef.io/roles.html

元数据文件中详细说明了这个食谱的作用,编写人,依赖件以及版本号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"name": "nginx-server",
"description": "Nginx server",
"default_attributes": {
"nginx" : {
"default_site_enabled" : false
}
},
"json_class": "Chef::Role",
"run_list": [
"recipe[nginx::repo]",
"recipe[nginx::default]"
],
"chef_type": "role"
}

下面是各个文件及文件夹的说明

name

指定Role的名称,当 Chef 在运行列表中见到 rolo[redis-server] 时,就会寻找名为 redis-server 的角色。 寻找的范围是 knife.rb 中 role_path 对应文件夹中所有的 JSON 文件

default_attributes

用来设置默认属性

run_list

是一个数组,Chef 会依次安装执行列出的配方和角色

  • 角色使用如下格式: role[role_name]
  • 配方使用如下格式: recipe[cookbook_name::recipe]

“json_class”: “Chef::Role”

如果使用 JSON 格式,那么必须加上这一行,如果使用 Ruby 格式,则不用加。

REF::