【问题标题】:Adding a provider or extending a LWRP for a wrapped cookbook为包装好的说明书添加提供者或扩展 LWRP
【发布时间】:2015-01-19 23:53:09
【问题描述】:

(对不起链接,我不能发布超过两个..) 我正在尝试将提供程序添加到包含另一个包含 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'
.
.

..我希望通过“新”操作向其中一个主管资源添加提供程序。

以下是“导入”的提供程序: [github.com/poise/supervisor/blob/master/providers/service.rb][1]

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

我在这里和那里尝试了很多例子,但没有运气: 来自 gitHub:chef_extend_lwrp

我试过 docs.chef.io lwrp_custom_provider_ruby 和neethack.com/2013/10/understand-chef-lwrp-heavy-version/

并试图模仿赛斯瓦戈的答案和示例: github.com/opscodecookbooks/jenkins/blob/8a2fae71cd994704b09924e9a14b70b9093963a3/libraries/credentials_password.rb 并且:

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

github.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”

我也尝试了许多来自 stackoverflow 的答案,但我无法在此处发布,因为我缺乏声誉点 :( 我看过很多来自 Seth Vargo 的推荐信,我希望他能看到我的问题;)

【问题讨论】:

标签: ruby import chef-infra lwrp


【解决方案1】:

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

引用文档:

首先加载库以确保所有语言扩展和 Ruby 类可用于所有资源。接下来是属性 加载,然后是轻量级资源,然后是所有定义 (以确保定义中的任何伪资源都是 可用)。

cookbook/libraries 下的文件是在构造 lwrp 类之前加载的,这就是为什么你最终得到一个 unknow 方法的原因,当你在 my_supervisor 中的库被编译时,SupervisorService 类还没有加载,所以你最终得到了一个简单的Object 不知道操作方法。

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

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

【讨论】:

  • 感谢您的快速回复!那么你是在告诉我在我的库代码中使用这个代码吗?
  • 你可以试试,我不确定它会起作用,但不会太痛。
  • 谢谢!我现在正在尝试,将发布结果。你真的很有帮助:)
  • @Ketzi 我审查了所有这些,抱歉可能不是您想要的答案
  • 是的。感谢您。我确实得出了这个结论。我现在有一个后续问题,必须在另一个范围内处理;)干杯!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 2013-04-02
相关资源
最近更新 更多