chef-infra - 使用修改后的 opsworks 部署 cookbook 不可变对象(immutable对象)错误

标签 chef-infra cookbook

我正在尝试将一些自定义代码添加到 opsworks 部署说明书中,与 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 时,出现了 chef 错误:

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

我已确认我的所有 Recipe 都没有错误的节点设置,所以我不知道问题出在哪里。我发现这个错误很难调试,即使我在没有任何修改的情况下包含这本 Recipe ,我也会收到这个错误。如果您能指出正确的方向,请告诉我。

最佳答案

从 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'

我怀疑您正在使用的说明书(或相关说明书)正在使用已弃用的语法在节点对象上设置数据。

关于chef-infra - 使用修改后的 opsworks 部署 cookbook 不可变对象(immutable对象)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18471361/

相关文章:

java - 如何在 Chef 中运行具有依赖关系的 Recipe ?

ubuntu - Chef 中缺少节点的 FQDN

flask - 如何在 .kitchen.yml 中传递环境变量来测试厨房

chef-infra - Recipe 未在 Chef 中执行

python - 只允许名称参数的函数

chef-infra - 我可以引用多个版本的 Chef Recipe 吗?

elasticsearch - Filebeat正在处理所有日志,而不是指定的应用程序日志

chef-infra - Chef-solo:未设置属性的问题

ssl - 修改 Chef Server 的 SSL 证书

chef-infra - 没有metadata.rb 文件的 Chef 超市 Recipe