エラーが表示される
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を表示するには、何をどのように含める必要がありますか?