使用Chef Solo JSON中的属性

时间:2014-06-03 08:18:21

标签: chef chef-solo

是否可以在Chef Solo的JSON中指定属性值?我有一个带有运行列表的solo.json,我想在那里指定属性。 Chef文档似乎表明我应该可以做类似的事情:

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

但是,每当我尝试访问配方中的值时:

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

我只是获取了attributes / default.rb中定义的值,如果我没有在那里定义它,我会得到一个nil值。

有没有办法引用这些值?

3 个答案:

答案 0 :(得分:3)

您可以在节点数据中存储的唯一属性级别为normal,其他所有属性在融合开始时重置,并从角色,环境和烹饪书重建。你想要像这样的东西:

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

答案 1 :(得分:1)

我尝试使用上面的示例在Chef-solo的JSON文件中设置属性,并且"normal": {...}块被完全忽略了。已读取运行列表,但属性似乎永远无法正常工作。

我的命令是:

chef-solo -c /path/to/config_file.rb -j /path/to/file.json

我的JSON文件:

{
  "name": "my_json_file",
  "description": "JSON run-list and attributes.",
  "normal": {
    "my_cookbook": {
      "git_branch": "staging"
    }
  },
  "run_list": [
    "recipe[my_cookbook::recipe1]",
    "recipe[my_cookbook::recipe2]",
  ]
}

在收敛期间,Chef直接回到attributes/default.rb内部的默认值。是否正确输入JSON值?到目前为止,我唯一的解决方法是为我想用Chef-solo测试的每个"git_branch":属性创建一个新配方,并将更新后的运行列表添加到另一个JSON文件中。本质上,复制整个配方以更改单个node.normal['my_cookbook']['git_branch']值。不用说,这不是解决方案。

使用Chef 14.0.202

答案 2 :(得分:0)

跟进:

未通过Chef Solo工作在JSON文件中设置属性优先级。 JSON应该看起来像这样:

{
  "name": "my_json_file",
  "description": "JSON run-list and attributes.",
  "my_cookbook": {
    "git_branch": "staging"
  },
  "run_list": [
    "recipe[my_cookbook::recipe1]",
    "recipe[my_cookbook::recipe2]",
  ]
}

不包括"normal": {...}"default_attributes": {...}等,将传递Chef-solo使用的属性。