1

エラーが表示される

NoMethodError
-------------
undefined method `registry_key' for HashOperations:Module

Chefクックブックを収束するとき。

これはlibraries/hash_operations.rbの短いバージョンのコードです:

module HashOperations
  # Tried: require 'chef/mixin/shell_out'
  # Tried: include Chef::Mixin::ShellOut

  def self.create_reg_keys(item_hash)
    item_hash.each do |item_name, item_props|
      # (...) construct the item_keys array
      registry_key "HKEY_LOCAL_MACHINE\\SOFTWARE\\#{item_name}" do
        recursive true
        values item_keys
        action :create
      end
    end
  end

  def self.generate_reg_keys_for_item_key(...)
    # some hash operations here
    create_reg_keys(item_hash)
  end

end unless defined?(HashOperations)

class Chef::Resource
  # Tried: Chef::Resource.send(:include, HashOperations)
  # Tried: include HashOperations
  extend HashOperations
end

そして、ここにレシピ/default.rbがあります:

Chef::Resource.send(:include, HashOperations)

ruby_block "test" do
  block do
    # Tried: Chef::Recipe.send(:include, HashOperations)
    items_keys.each do |item_key|
      HashOperations.generate_reg_keys_for_item_key(..., item_key)
    end
  end
end

主な問題は、レシピから呼び出されるモジュール内のメソッド内でChef リソースのregistry_keyを使用しようとすることにあると思います。

moduleを使用していない場合は動作するバージョンがありますが、いくつかの記事が指摘しているように、ChefSpecでコードをテストする場合はモジュールが必要です(このような: ChefSpec のライブラリ クラス メソッドのスタブ)

上記のリンクは、モジュール内で定義されていない限り end?(HashOperations)を使用する理由です。

インクルード ステートメントを使用してみましたが、いくつかの StackOverflow の投稿で示唆されているように、コメントまたはレシピの最初の行で確認できますが、うまくいきません。1 つの投稿で LWRP の使用法について議論していましたが、コードはこのレシピに厳密に関連しており、他のクックブックでは使用されないため、ここではそうではないと思います。

注:私はselfを使用しています。defが互いに見えるようにするためです。そうしないと、 generate_reg_keys_for_item_keyが利用できないというエラーが表示されます。

だから、StackOverflowによって提案されたものを含め、これに関する解決策を探すのにかなりの時間を費やしたという事実を考慮して、質問:このエラーを解決し、ChefSpecでテストできる簡単な解決策を持つための最良の方法は何ですか(ただし、LWRP を完全に除外しているわけではありません)、converge 操作でregistry_keyを表示するには、何をどのように含める必要がありますか?

4

1 に答える 1

1

ヘルパー自体が DSL 拡張として設定されていない限り、このようなヘルパーからのレシピ DSL を使用することはできません。その方法については、 https://coderanger.net/chef-tips/#3をご覧ください。

于 2016-06-17T19:33:35.073 に答える