Chef - 动态配置Cookbook(食谱)
属性是动态配置Cookbook(食谱)的关键组件。属性使作者能够使Cookbook(食谱)可配置。通过覆盖Cookbook(食谱)中设置的默认值,用户可以注入自己的值。
步骤 1 − 为Cookbook(食谱)属性创建一个默认文件并向其中添加一个默认属性。
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 在执行属性文件之前会加载所有属性。属性与节点对象一起存储。可以访问Kitchen(配方)中与节点对象一起存储的所有属性并检索其当前值。
Chef 具有受限结构,从最低的默认值开始,然后是正常值(与集合别名),然后覆盖。Kitchen(配方)中的属性级别集优先于属性文件中的相同级别集。
在节点和环境级别覆盖属性
在角色或环境中定义的属性具有最高优先级。
步骤 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 已更新角色 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...