大厨11:任何方式将属性转换为ruby哈希?
我正在使用chef属性为我的服务生成配置.但是,在某些时候,我需要将属性mash转换为简单的
ruby哈希.这曾经在Chef 10中正常工作:
node.myapp.config.to_hash 但是,从Chef 11开始,这不起作用.只有属性的顶级转换为散列,然后嵌套值保持不可变的mash对象.修改它们会导致这样的错误:
我已经尝试了很多方法来解决这个问题,但这些方法都不起作用: 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的错误: 如果你不想给你的厨师打补丁,那就说出来吧: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |