当两本食谱中的两个不同资源具有相同的名称时,如何指定调用哪一个?
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)
。
我有一个调用名为 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)
。