Chef - 动态配置菜谱


属性是动态配置说明书的关键组件。属性使作者能够使食谱可配置。通过覆盖说明书中设置的默认值,用户可以注入自己的值。

步骤 1 - 为说明书属性创建默认文件并向其中添加默认属性。

vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/attributes/default.rb 
default['my_cookbook']['message'] = 'hello world!'

步骤 2 - 定义配方内的属性。

vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb 
message = node['my_cookbook']['message'] 
Chef::Log.info("** Saying what I was told to say: #{message}") 

步骤 3 - 上传修改后的食谱。

vipin@laptop:~/chef-repo $ knife cookbook upload my_cookbook 
Uploading my_cookbook [0.1.0]

步骤 4 - 运行定义节点的 Chef-Client。

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-01-13T20:48:21+00:00] INFO: ** Saying what I was told to 
say: hello world! 
...TRUNCATED OUTPUT... 

工作方式

Chef 在执行属性文件之前加载所有属性。属性与节点对象一起存储。人们可以访问配方中节点对象存储的所有属性并检索它们的当前值。

Chef 有一个受限制的结构,从默认值最低开始,然后变为正常(与集合别名),然后覆盖。配方中设置的属性级别优先于属性文件中设置的相同级别。

覆盖节点和环境级别的属性

角色或环境中定义的属性具有最高优先级。

步骤 1 - 创建角色。

vipin@laptop:~/chef-repo $ subl roles/german_hosts.rb 
name "german_hosts" 
description "This Role contains hosts, which should print out 
their messages in German" 
run_list "recipe[my_cookbook]" 
default_attributes "my_cookbook" => { "message" => "Hallo Welt!" } 

步骤 2 - 将角色上传到 Chef 服务器。

vipin@laptop:~/chef-repo $ knife role from file german_hosts.rb 
Updated Role german_hosts! 

步骤 3 - 将角色分配给节点。

vipin@laptop:~/chef-repo $ knife node edit server 
"run_list": [ 
   "role[german_hosts]" 
] 
Saving updated run_list on node server 

步骤 4 - 运行 Chef-Client。

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-01-13T20:49:49+00:00] INFO: ** Saying what I was told to 
say: Hallo Welt! 
...TRUNCATED OUTPUT...