我有一个菜谱,它调用名为sysctl_param
的自定义资源:
sysctl_param 'net.ipv4.tcp_syncookies' do
value 1
end
但是,从厨师14开始,sysctl_param
是内置资源。因此,当我针对Chef 14测试食谱时,它使用的是Chef内置的sysctl_param
资源,而不是我的自定义资源。这破坏了我的一些测试,因为内置资源的行为与自定义行为略有不同。
如何强制Chef使用自定义sysctl_param
资源而不是内置资源?请假设“重命名自定义资源”不是一个选项-即使重命名是一个选项,我也想知道以下问题的答案:“当资源命名冲突时,如何选择运行哪个资源?”。
答案 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)
来验证如何将资源解析为类。