LoginSignup
40
39

More than 5 years have passed since last update.

[Chef]AttributeをRole(Node)で設定(上書き)する

Posted at

まずrecipeでattributeを設定する

テストのためのcookbook(samples)を作成

samples/recipes/default.rb
# WARNに値を出力するだけ
Chef::Log::warn node[:apache][:prefork][:startservers]
samples/attribute/default.rb
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からでも構いません。

front_web.rb
name "front_web"
run_list "recipe[sample]"

nodeにroleを設定します。(今回はすべて一つのRoleのみを適用するものとします。)

nodeの状態例
# 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かはお好みで。

upscale.rb
name "upscale"
run_list "recipe[samples]"
default_attributes(
    "apache" => {
        "prefork" => {
            "startservers" => "1000"
        }
    }
)
minscale.json
{
  "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などの値がきちんと上書きされた状態で取れない場合があるみたいなので、少しデバッグしにくいかも。。。

40
39
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
39