为包装的说明书添加提供者或扩展 LWRP

Adding a provider or extending a LWRP for a wrapped cookbook

(抱歉链接,我不能 post 超过两个..) 我正在尝试将提供程序添加到一本食谱中,该食谱包装了另一本包含 LWRP 的食谱。

包装好的食谱是风度翩翩的 Python 主管: [github.com/poise/supervisor.git][1] 我正在使用 Berkshelf 指向 Chef 导入它:

source "...api.berkshelf.com"
source '....<my chef/berkshelf server>:26200'

cookbook 'supervisor', github: "poise/supervisor"

metadata

在我的食谱中:

.
.
    include_recipe 'supervisor'
.
.

..我希望通过 "new" 操作向其中一个主管资源添加提供者。

以下是 'imported' 提供者: [github.com/poise/supervisor/blob/master/providers/service.rb][1]

我希望添加另一个名为 action "reload" 的提供程序,它将最终调用 supervisorctl reread

我在这里和那里尝试了很多例子,但没有成功: 来自 git 中心:chef_extend_lwrp

我试过了docs.chef.iolwrp_custom_provider_ruby 和 neethack。com/2013/10/understand-chef-lwrp-heavy-version/

并尝试模仿 Seth Vargo 的答案和示例: github.com/opscodecookbooks/jenkins/blob/8a2fae71cd994704b09924e9a14b70b9093963a3/libraries/credentials_password.rb 并且:

github.com/poise/supervisor/blob/master/providers/service.rb

git中心.com/poise/supervisor.git

但 Chef 似乎没有正确导入代码:

ERROR: undefined method `action' for Chef::Resource::SupervisorServices:Class

当我将库导入写为: (my_enable_service 已定义,但我已将其从该示例中删除)

def whyrun_supported?
  true
end


class Chef
  class Resource::MyupervisorService < Resource::SupervisorService
    provides :my_supervisor_service
    actions :reload
    @resource_name = :my_supervisor_service
  end
end


class Chef
  class Provider::MyupervisorService < Provider::SupervisorService
    action :reload do
      converge_by("Enabling #{ new_resource }") do
        my_enable_service
      end
    end



  end
end


Chef::Platform.set(
  resource: :my_supervisor_service,
  provider: Chef::Provider::MyupervisorService
)

我的食谱名称是:"my_supervisor",我的库文件是"service.rb"

我也尝试了很多来自 Whosebug 的答案,但我不能post这里,因为我缺乏声誉点:( 我看过 Seth Vargo 的很多参考资料,希望他能看到我的问题 ;)

好的,玩了一会儿(我觉得很有趣)我明白这里出了什么问题。

引用文档:

Libraries are loaded first to ensure that all language extensions and Ruby classes are available to all resources. Next, attributes are loaded, followed by lightweight resources, and then all definitions (to ensure that any pseudo-resources within definitions are available).

cookbook/libraries 下的文件在构建 lwrp classes 之前加载,这就是为什么你最终得到一个未知的方法,当你的时候 SupervisorService class 还没有加载my_supervisor 中的库已编译,因此您最终得到一个简单的 Object,它不知道操作方法。

我能想到的最佳解决方法是在您的配方中管理案例,根据您的操作调用执行资源或 lwrp。

如果您真的认为它应该成为主管操作的一部分,请克隆说明书存储库,添加操作并提出拉取请求。