Chefのnode[:hoge]をどうにかしたい

December 4, 2013

2013年オワコンの代表格として名指しされているChefですが
nodes/hoge.jsonで与えられたnode[:hoge]の値を
roles/role.jsonで値を追加したい場合があります。
そのやり方として、オフィシャルにはディープマージという方法が載っていました。

http://docs.opscode.com/essentials_node_object_deep_merge.html

  • nodes/hoge.json

    {
    "run_list": [ "role[role_one]" ] 
    }
    
  • roles/role_one.json

    {
    "name": "role_one",
    "description": "role one",
    "json_class": "Chef::Role",
    "override_attributes": {
    "hoge": [ "foo", "bar" ]
    },
    "default_attributes": {
    },
    "chef_type": "role",
    "run_list": [
    "role[role_two]"
    ]
    }
    
  • roles/role_two.json

    {
    "name": "role_two",
    "description": "role two",
    "json_class": "Chef::Role",
    "override_attributes": {
    "hoge": [ "baz" ]
    },
    "default_attributes": {
    },
    "chef_type": "role",
    "run_list": [
    "recipe[hoge_recipe]"
    ]
    }
    
  • cookbooks/hoge_recipe/recipe/default.rb

    node[:hoge].each do |h|
    p h
    end
    

roleで回せと。

ほかにも@keita氏に教えてもらったのですが
Key-Valueで渡せばいけるらしいです。

Arrays and Chef Attributes - Noah Kantrowitz

  • nodes/hoge.json

    {
    "hoge": {
      "foo": true,
      "bar": true
    },
    "run_list": [ "role[role_one]" ] 
    }
    
  • roles/role_one.json

    {
    "name": "role_one",
    "description": "role one",
    "json_class": "Chef::Role",
    "override_attributes": {
    "hoge": {
        "baz": true
    }
    },
    "default_attributes": {
    },
    "chef_type": "role",
    "run_list": [
    "recipe[hoge_recipe]"
    ]
    }
    
  • cookbooks/hoge_recipe/recipe/default.rb

    node[:hoge].each do |k,v|
    p k
    end
    

どちらも気持ち悪いので使いません。
よさ気な方法あれば教えて下さい。

Chef、Opscode社の経典みたいなcookbooksと
何がどこに書かれているかよくわからないドキュメントをのぞけば
2014年もよしなに使えるのではないかと思います。