я получаю сообщение об ошибке
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
а вот recipes/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, внутри метода внутри модуля, который, в свою очередь, вызывается из рецепта.
У меня есть рабочая версия, если я не использую модуль, но мне нужен модуль, если я хочу протестировать код с помощью ChefSpec, как указано в нескольких статьях (например, один: заглушка методов класса библиотеки в ChefSpec )
Ссылка, упомянутая выше, является причиной, по которой я использую end, если не определено?(HashOperations) внутри модуля.
Я пытался использовать операторы включения, это можно увидеть в комментариях или в первой строке рецепта, как предлагалось в нескольких сообщениях StackOverflow, но безуспешно. В одном посте обсуждалось использование LWRP, но я действительно не думаю, что здесь дело обстоит так, поскольку код строго связан с этим рецептом и не будет использоваться в какой-либо другой кулинарной книге.
В качестве примечания: я использую self. для того, чтобы def были видны друг другу, в противном случае я получаю сообщение об ошибке generate_reg_keys_for_item_key быть недоступным.
Итак, принимая во внимание тот факт, что я потратил довольно много часов на поиск решений по этому поводу, в том числе предложенных StackOverflow, вопросы: как лучше всего решить эту ошибку и есть простое решение, которое можно протестировать с помощью < strong>ChefSpec (хотя я не полностью исключаю LWRP), и ЧТО и КАК я должен включить, чтобы registry_key был виден при операции конвергенции?