Chef NoMethodError при использовании метода библиотечного модуля с Registration_key в рецепте

я получаю сообщение об ошибке

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 был виден при операции конвергенции?


person tibileo    schedule 17.06.2016    source источник


Ответы (1)


Вы не можете использовать рецепт DSL от помощников, подобных этому, если помощник сам не настроен как расширение DSL. Посетите https://coderanger.net/chef-tips/#3, чтобы узнать, как сделай это.

person coderanger    schedule 17.06.2016
comment
Спасибо за Ваш ответ. Я проверил вашу ссылку и добавил extend HashOperations в блок Chef блок рецепта, а также в начало рецепта, но все еще получаю сообщение об ошибке registry_key не определен для HashOperations:Hodule . Есть ли у вас другие предложения по этому поводу? - person tibileo; 22.06.2016