2013-08-27 56 views
3

我尝试添加一些自定义代码到opsworks部署菜谱,相关before_migrate步:使用修改opsworks部署食谱不可变对象错误

before_migrate do 
    link_tempfiles_to_current_release 
    deploy_version = Time.now.strftime("%Y%m%d%H%M%S") 

    if node['deploy_app'] == 'web' 
    link "/var/lib/tomcat#{node["tomcat"]["base_version"]}/webapps/ROOT###{deploy_version}" do 
     to "#{release_path}" 
    end 

我遇到的问题是,当我包括在我的网站的菜谱包部署菜谱,我得到一个厨师的错误:我的食谱

[2013-08-27T16:45:05+00:00] FATAL: Chef::Exceptions::ImmutableAttributeModification: ruby_block[Compile Custom OpsWorks Run List] (opsworks_custom_cookbooks::execute line 3) had an error: Chef::Exceptions::ImmutableAttributeModification: Node attributes are read-only when you do not specify which precedence level to set. To set an attribute use code like `node.default["key"] = "value"' 

我已经验证无有不正确的节点设置,所以我出什么样的问题可能是想法。我发现这个错误非常难以调试,甚至当我没有任何修改的情况下包含这本烹饪书时,我得到这个错误。请让我知道你是否可以指引我正确的方向。

回答

3

从Chef 11开始,属性必须指定优先级别。在厨师10,你可以做这样的事情:

node['foo']['bar'] = 'my new value' 

在厨师11,你必须指定优先级为值:

node.set['foo']['bar'] = 'my new value' 

您还可以使用defaultoverride(其对应attribute precedence levels

node.default['foo']['bar'] = 'my new value' 
node.override['foo']['bar'] = 'my new value' 

我怀疑你正在使用的食谱(或依赖食谱)使用不推荐的语法在节点对象上设置数据。