在库

时间:2016-06-17 16:45:42

标签: ruby chef chef-recipe chefspec lwrp

我收到错误

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

融合厨师食谱。

这是 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 测试代码,我需要一个模块,因为有几篇文章指出(像这一个:Stubbing library class methods in ChefSpec

上面提到的链接是我使用结束的原因,除非在模块中定义了?(HashOperations)

我尝试过使用include语句,可以在评论中看到,也可以在食谱的第一行中看到,就像几个StackOverflow帖子所说的那样,没有运气。一篇文章讨论了LWRP的用法,但我真的认为不是这里的情况,因为代码与这个食谱严格相关,不会用在其他食谱中。

作为备注:我正在使用 self。,以便 def 彼此可见,否则我收到有关 generate_reg_keys_for_item_key的错误无法使用。

因此,考虑到我花了相当长的时间寻找解决方案的事实,包括StackOverflow建议的解决方案,问题是:什么是解决此错误的最佳方法,并且有一个简单的解决方案可以用 ChefSpec 进行测试(虽然我不完全排除LWRP),但是我应该包含什么以及如何在 registry_key 中进行融合操作?

1 个答案:

答案 0 :(得分:0)

除非帮助程序本身设置为DSL扩展,否则您无法使用此类帮助程序中的配方DSL。查看https://coderanger.net/chef-tips/#3以了解如何操作。