如何从 HWRP 调用 Chef 资源?

How can I call a Chef resource from an HWRP?

也许这真的很简单,我只是有点不明白。我想从我编写的 HWRP 中调用 Chef 资源。在我的场景中,我想调用 reboot 资源。我应该怎么做?

我试过类似下面的方法:

def reboot_system
    wu_reboot = Chef::Resource::Reboot.new('wu_reboot', :reboot_now)
    wu_reboot.run_action(:reboot_now)
end

几件事。我不确定我是否应该创建 Chef::Resource::Reboot 或 Chef::Provider::Reboot 的实例。我也不太理解上面列出的第二个参数。这应该是 "run_context",但我不知道那是什么。最后,我不知道如何设置属性或调用操作。

我尝试使用 this 作为一种格式,但到目前为止我还无法让它工作。任何帮助理解将不胜感激。

编辑:

我查看了 source code,我可以执行这个:

node.run_context.request_reboot(
      :delay_mins => @new_resource.delay_mins,
      :reason => @new_resource.reason,
      :timestamp => Time.now,
      :requested_by => @new_resource.name
      )

但是,我认为这不是最好的解决方案。我想知道如何完成调用资源而不是通过这种方式绕过它。

你可以像在食谱中那样做。如果您需要立即 运行,那么您可以这样做:

reboot 'now' do
  action :nothing
end.run_action(:reboot_now)

您可以在 Jenkins 官方说明书的旧版本(同时转换为 LWRP)中找到在 HWRP 中使用 Chef-Resources 的示例:

https://github.com/opscode-cookbooks/jenkins/blob/v2.0.2/libraries/plugin.rb#L138-L141

请记住,Reboot 资源相当新(Chef 12+)

在 Ruby classes 中,您无权访问 Chef DSL,因此您必须以 class 的形式访问资源的底层实现。 class 的名称将是资源名称的驼峰转换。您使用 run_action 方法调用该操作。

您的原始版本实际上非常接近。您只使用资源,而不使用提供者(因为提供者甚至可能并不总是相同,具体取决于您的平台)。

run_context 是 chef 用来向资源传递信息的对象 - 例如,您可以通过 run_context.node['attributename'] 访问节点属性。它已经是您的提供者中的成员变量(我认为也在资源对象中);您只需将其传递给新资源的构造函数即可。

您通过同名成员变量设置属性,并通过run_action方法触发实际动作。

r = Chef::Resource::Reboot.new("wu_reboot", run_context)
r.reason("Because we need a reboot")
r.run_action(:reboot_now)