我正在编写一个使用Chef 12.5中自定义资源的食谱。 我有一个使用模板资源的自定义资源,因此有一个通知重新加载关联的服务。
但是,相关的服务在主配方中进行pipe理。 目前这种方式失败了,因为它抱怨没有服务。
在以前的版本中,当使用LWRP时,这是由于使用use_inline_resources引起的,我相信你可以通过在LWRP中不包括这个函数来解决这个问题。
现在我不在自定义资源中包含此行,但行为存在。 有什么办法可以closures这种行为吗?
另外还有其他一些“包括”多种资源的服务的方式,所以我不必在许多地方有相同的代码?
根据delerious010的回答,我本人和一位同事能够针对这种特殊情况提出更好的解决scheme:
action :create do global_nginx = resources('service[nginx]') template "/etc/nginx/conf.d/#{name.tr(' ', '_')}.conf" do cookbook 'nginx_server' source 'server_block.conf.erb' owner 'root' group 'root' mode '0644' variables( listen: listen, server_name: real_server_name, root: root, index: index, config: config ) notifies :reload, global_nginx, :delayed end end
显然这个例子只有一个资源被pipe理,但应该允许你有多个,只有通知你想要的。
编辑:请注意,这依赖于厨师开发人员将修复的错误( https://github.com/chef/chef/issues/4669 )。 因为在12.9.38资源集合上的search被递增到外部run_contexts这个代码将仍然工作,但将不再是必要的(并将正确处理多个嵌套的子上下文,你需要抓住一个资源在根,而不是只是父母的run_context)。 这里最好的解决scheme应该是升级。
在Chef 12.5中,默认打开use_inline_resources。 这样做的结果是,无论何时更新子资源,LWRP都将被标记为已更改。 因此,您始终可以在“父”LWRP上定义资源通知。
或者,如果您希望为LWRP的所有实例定义通知子句,则可以始终直接在操作块中创build通知:
notifies_delayed(:restart, resources("service[rsyslog]"))
但是请记住,在LWRP中修改的任何资源都将导致服务重新启动。 尽pipe可能使用对资源的调用来定义子资源上的notifies属性。 不完全确定,因为我还没有testing过。
在12.9.38中,通过以下方式添加了从子资源集合/ use_inline_resources提供者通知外部资源集合的能力:
https://github.com/chef/chef/commit/0ca27b6f30ccd327505bd3a44bd319fb3eba956b
这现在是通知的默认行为,所以你只需要升级。