シェフの属性でサービスの構成を生成しています。ただし、ある時点で、属性 mash を単純な ruby ハッシュに変換する必要があります。これは、Chef 10 で正常に機能していました。
node.myapp.config.to_hash
ただし、Chef 11 以降では、これは機能しません。アトリビュートの最上位のみがハッシュに変換され、ネストされた値は不変のマッシュ オブジェクトのままになります。それらを変更すると、次のようなエラーが発生します。
Chef::Exceptions::ImmutableAttributeModification ------------------------------------------- ----- 設定する優先レベルを指定しない場合、ノード属性は読み取り専用になります。属性を設定するには、`node.default["key"] = "value"' のようなコードを使用します。
この問題を回避するために、うまくいかない方法をたくさん試しました。
node.myapp.config.dup.to_hash
JSON.parse(node.myapp.config.to_json)
うまく機能するように思われるjson解析ハックは、次の結果になります。
JSON::ParserError
unexpected token at '"#<Chef::Node::Attribute:0x000000020eee88>"'
各クックブックにネストされた解析関数を含める以外に、属性をシンプルで普通の古き良きルビーハッシュに変換する実際の信頼できる方法はありますか?