当来自两个食谱的两个不同资源具有相同的名称时,如何指定要调用的资源?

时间:2018-07-10 17:38:23

标签: chef chef-recipe

我有一个菜谱,它调用名为sysctl_param的自定义资源:

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

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

如何强制Chef使用自定义sysctl_param资源而不是内置资源?请假设“重命名自定义资源”不是一个选项-即使重命名是一个选项,我也想知道以下问题的答案:“当资源命名冲突时,如何选择运行哪个资源?”。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这可能是一个强大的步枪,但它可以工作(至少在Chef 12.x和14.2中;我尚未在其他版本上进行测试)。

Chef具有“优先级映射”和“处理程序映射”,用于将资源方法名称(例如sysctl_param)解析为资源类名称(例如Chef::Resource::Sysctl)。您可以使用these tools来设置哪个资源类响应给定的资源方法。

例如:

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

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

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

您可以使用Chef.resource_handler_map.list(node, :my_resource_name)获取可以响应特定方法的类的列表。您可以通过调用Chef::ResourceResolver.resolve(:my_resource_name)来验证如何将资源解析为类。