10

シェフの属性でサービスの構成を生成しています。ただし、ある時点で、属性 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>"'

各クックブックにネストされた解析関数を含める以外に、属性をシンプルで普通の古き良きルビーハッシュに変換する実際の信頼できる方法はありますか?

4

5 に答える 5

11

ここと opscode シェフのメーリング リストの両方で回答が圧倒的に不足した後、次のハックを使用することになりました。

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

これをクックブックのライブラリディレクトリに入れました。これで、シェフ 10 (既に正常に動作し、このモンキー パッチの影響を受けていない) とシェフ 11 の両方で attribute.to_hash を使用できるようになりました。また、これをバグとして opscode に報告しました。

シェフにモンキーパッチを当てたくない場合は、この問題について話してください: http://tickets.opscode.com/browse/CHEF-3857

更新:モンキー パッチ チケットは、これらの PRによってクローズとマークされました

于 2013-02-08T22:28:36.597 に答える