微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

大厨11:任何方式将属性转换为ruby哈希?

我正在使用chef属性为我的服务生成配置.但是,在某些时候,我需要将属性mash转换为简单的 ruby哈希.这曾经在Chef 10中正常工作:
node.myapp.config.to_hash

但是,从Chef 11开始,这不起作用.只有属性的顶级转换为散列,然后嵌套值保持不可变的mash对象.修改它们会导致这样的错误

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”‘

我已经尝试了很多方法解决这个问题,但这些方法都不起作用:

node.myapp.config.dup.to_hash
JSON.parse(node.myapp.config.to_json)

json解析hack,看起来应该很好用,导致:

JSON::ParserError
unexpected token at '"#<Chef::Node::Attribute:0x000000020eee88>"'

有没有任何实际可靠的方法,在每个cookbook中包含嵌套解析函数,将属性转换为简单,普通,好的旧ruby哈希?

解决方法

在这里以及在opscode chef邮件列表上大声缺乏答案之后,我最终使用了以下hack:
class Chef
  class Node
   class ImmutableMash
      def to_hash
        h = {}
        self.each do |k,v|
          if v.respond_to?('to_hash')
            h[k] = v.to_hash
          else
            h[k] = v
          end
        end
        return h
      end
    end
  end
end

我把它放在我的食谱中的图书馆里;现在我可以在chef 10中使用attribute.to_hash(已经正常工作且不受此猴子补丁影响)和厨师11.我还将此报告为opscode的错误

如果你不想给你的厨师打补丁,那就说出来吧:
http://tickets.opscode.com/browse/CHEF-3857

原文地址:https://www.jb51.cc/ruby/269336.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐