まずrecipeでattributeを設定する
テストのためのcookbook(samples)を作成
# WARNに値を出力するだけ
Chef::Log::warn node[:apache][:prefork][:startservers]
if "#{node[:roles]}" == 'front_web'
default[:apache][:prefork][:startservers] = 36
else
default[:apache][:prefork][:startservers] = 500
end
roleファイルは以下のようなものを作成し、 knife role from file ./front_web.rb その他で反映しておきます。内容が同じであればGUIからでも構いません。
name "front_web"
run_list "recipe[sample]"
nodeにroleを設定します。(今回はすべて一つのRoleのみを適用するものとします。)
# knife node show vm-test
Node Name: vm-test
...
Run List: role[front_web]
...
nodeに設定したrun_listの内容がそれぞれ左の場合、実行時に評価されるstartserversの値(chef-client実行時にWARNログとして表示される値)は右になります。
role[front_web] -> WARN: 36
recipe[sample] -> WARN: 500
roleでattributeを設定(上書き)する
attribute値を入れたroleを作って、実行時に上書きします。
roleの書式はrubyかjsonかはお好みで。
name "upscale"
run_list "recipe[samples]"
default_attributes(
"apache" => {
"prefork" => {
"startservers" => "1000"
}
}
)
{
"name": "minscale",
"json_class": "Chef::Role",
"run_list": [
"recipe[samples]"
],
"default_attributes": {
"apache": {
"prefork": {
"startservers" : "10"
}
}
}
}
knife role from file ./upscale.rb
knife role from file ./minscale.json
それぞれ、roleを適用すると
role[upscale] -> WARN: 1000
role[minscale] -> WARN: 10
と出力されます。
※さらにnodeに値を設定して上書きすることも可能です。attributeが上書きされる順番は下記で確認できます。
Opscode wiki
手元で確認した段階では、roleで値を入れる場合、shef -zでのデバッグ時に
node.apache.prefork.startserversなどの値がきちんと上書きされた状態で取れない場合があるみたいなので、少しデバッグしにくいかも。。。