使用修改后的opsworks部署cookbook不可变对象错误

时间:2013-08-27 16:54:24

标签: chef cookbook

我正在尝试将一些自定义代码添加到opsworks deploy cookbook中,与before_migrate步骤相关:

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

我遇到的问题是当我在我的site-cookbook包中包含deploy cookbook时,我收到一个厨师错误:

[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"'

我已经确认我的烹饪书没有错误的节点设置,所以我不知道问题是什么。我发现这个错误很难调试,即使我在没有任何修改的情况下包含这本食谱,我也会收到此错误。如果你能指出我正确的方向,请告诉我。

2 个答案:

答案 0 :(得分:3)

从Chef 11开始,属性必须指定优先级。在Chef 10中,您可以执行以下操作:

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

在Chef 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'

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

答案 1 :(得分:1)

在Chef中,属性有几个优先级值,最常用的可能是默认值和覆盖。 http://docs.opscode.com/chef_overview_attributes.html 您必须通过仅指定node ['something']来查找设置属性的位置。它似乎不在您粘贴的代码中。