Search code examples
chef-infrachef-solo

Using attributes in Chef Solo JSON


Is it possible to specify attribute values in Chef Solo's JSON? I have a solo.json with a run list and I would like to specify the attributes there. The Chef documentation seems to indicate it should be possible for me to do something like:

{
    "hostname": {
        "test": "value2"
    },
    "default_attributes": {
        "hostname": {
            "test": "value3"
        }
    },
    "override_attributes": {
        "hostname": {
            "test": "value4"
        }
    },
    "default": {
        "hostname": {
            "test": "value5"
        }
    },
    "run_list": [
        "recipe[hostname::default]"
    ]
}

However, whenever I try to access the value in my recipe:

p node['hostname']['test']

I just get the value defined in attributes/default.rb, and if I do not define it there, I get a nil value back.

Is there a way to reference these values?


Solution

  • The only level of attributes you can store in the node data is normal, everything else is reset at the start of the converge and rebuilt from roles, environments, and cookbooks. You want something like looks like this:

    {
      "normal": {
        "hostname": {
          "test": "something"
        }
      },
      "run_list": [
        "recipe[hostname::default]"
      ]
    }