Chef 动态配置Cookbook
属性是动态配置说明书的关键组件。属性使作者能够使Cookbook可配置。通过覆盖说明书中设置的默认值,用户可以注入自己的值。
第 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 步-上传修改后的Cookbook。
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...