也许这很简单,我只是不理解某些东西。我想从我写的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
)
但是,我不认为这是最好的解决方案。我想知道如何完成调用资源而不是以这种方式绕过它。
答案 0 :(得分:0)
您可以按照与食谱相同的方式进行操作。如果您需要立即运行,那么您可以这样做:
reboot 'now' do
action :nothing
end.run_action(:reboot_now)
答案 1 :(得分:0)
您可以在官方Jenkins食谱的旧版本中找到在HWRP中使用Chef-Resources的示例(在此期间转换为LWRP):
https://github.com/opscode-cookbooks/jenkins/blob/v2.0.2/libraries/plugin.rb#L138-L141
请记住,Reboot资源是新的(Chef 12 +)
答案 2 :(得分:0)
在Ruby类中,您无法访问Chef DSL,因此您必须以类的形式访问资源的底层实现。该类的名称将是资源名称的camelcase转换。您可以使用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)