当两本食谱中的两个不同资源具有相同的名称时,如何指定调用哪一个?

When two different resources from two cookbooks have the same name, how can I specify which one to call?

我有一个调用名为 sysctl_param:

的自定义资源的食谱
sysctl_param 'net.ipv4.tcp_syncookies' do
  value 1
end

但是,从 Chef 14 开始,sysctl_param 是内置资源。因此,当我针对 Chef 14 测试我的食谱时,它使用了 Chef 内置 sysctl_param 资源而不是我的自定义资源。这破坏了我的一些测试,因为内置资源的行为与自定义资源略有不同。

如何强制 Chef 使用自定义 sysctl_param 资源而不是内置资源?请假设 "rename the custom resource" 不是一个选项 - 即使重命名是一个选项,我非常想知道问题 "how can I choose which resource to run when there are resource naming conflicts?".

的答案

我们正在使用 14.3 中的预览资源系统对此进行改进,但版本较短:您无法修复它,抱歉。在 14.3 及更高版本中,将在预览模式下添加新资源,这意味着食谱版本将 "win" 到 Chef 15.0.

这可能是一把巨大的脚枪,但它确实有效(至少在 Chef 12.x 和 14.2 中是这样;我还没有测试过其他版本)。

Chef 有一个 "priority map" 和一个 "handler map",用于将资源方法名称(例如 sysctl_param)解析为资源 class 名称(例如 Chef::Resource::Sysctl).您可以使用 these tools 设置哪个资源 class 响应给定的资源方法。

例如:

Chef.resource_priority_map.priority(:sysctl_param, [MyCookbook::SysctlParamResource])

sysctl_param 'net.ipv4.tcp_syncookies' do
  value 1
end

这将导致自定义资源 (MyCookbook::SysctlParamResource) 优先于内置资源。无论资源来源如何,您都应该能够使用相同的方法:两本食谱,一本食谱和一本内置等。

您可以获得 class 可以响应特定方法的 es 的列表 Chef.resource_handler_map.list(node, :my_resource_name). You can verify how resources are resolved to classes by calling Chef::ResourceResolver.resolve(:my_resource_name)