Chef库助手方法未定义

时间:2015-09-28 16:43:26

标签: ruby chef lwrp

我正在尝试编写一个基于条件的LWRP,它将从辅助库中调用方法。我在获取提供程序读取外部方法时遇到语法问题。

提供者非常简单

# providers/provider.rb
require_relative '../libraries/acx_shared'
include Acx

action :create  do
  Chef::Log.debug('{jefflibrary->lwrp->user} - start')

if @new_resource.shared == true
  Acx::User::Shared.true_shared()
else
  Acx::User::Shared.false_shared()
end

if @new_resource.sudo == true
  Chef::Log.error('I HAVE THE POWER')
else
  Chef::Log.error('my power is weak and feeble')
end
if @new_resource.password == true
  Chef::Log.error('the secret password is 12345')
else
  Chef::Log.error('I will never tell you the secret to the airlock')
end

  Chef::Log.debug('{jefflibrary->lwrp->user} - end')
end

以及帮助程序库

#libraries/acx_shared.rb
module Acx
  module User
    module Shared
    def true_shared
      #puts blah
      Chef::Log.error('I am pulling this from a library reference')
    end
    def false_shared
      Chef::Log.error('I am not very good at sharing')
    end
  end
end
end

但每当我尝试运行它时,无论资源属性设置如何,我都会继续

NoMethodError
           -------------
           undefined method `false_shared' for Acx::User::Shared:Module

我在撰写帮助程序库的文档中显然遗漏了一些内容,但我不确定是什么。尝试移动一些东西,但开始耗尽想法。

1 个答案:

答案 0 :(得分:1)

尝试删除包含Acx

可能会发生的是,因为您正在这样做,实际上在Acx中查找另一个模块名称Acx 。 因此要么删除include,要么从调用*共享方法中删除Acx ::。 您也无法在尝试时直接从模块调用实例变量。你需要有一个包含模块的类,然后在该类的对象上调用该方法 作为替代方案,您可以将方法提升为类方法(self。),您可以直接调用它们。

类似的东西:

# providers/provider.rb
require_relative '../libraries/acx_shared'

action :create  do
  Chef::Log.debug('{jefflibrary->lwrp->user} - start')

acx = Class.new.exted(Acx::User::Shared)
if @new_resource.shared == true
  acx.true_shared()
else
  acx.false_shared()
end

if @new_resource.sudo == true
  Chef::Log.error('I HAVE THE POWER')
else
  Chef::Log.error('my power is weak and feeble')
end
if @new_resource.password == true
  Chef::Log.error('the secret password is 12345')
else
  Chef::Log.error('I will never tell you the secret to the airlock')
end

  Chef::Log.debug('{jefflibrary->lwrp->user} - end')
end

#libraries/acx_shared.rb
module Acx
  module User
    module Shared
    def self.true_shared
      #puts blah
      Chef::Log.error('I am pulling this from a library reference')
    end
    def self.false_shared
      Chef::Log.error('I am not very good at sharing')
    end
  end
end
end