Chef 12.5 自定义资源 - 访问食谱中的资源

Chef 12.5 自定义资源 - 访问食谱中的资源

我正在编写一本使用 Chef 12.5 中提供的自定义资源的食谱。我有一个使用模板资源的自定义资源,因此有一个通知重新加载相关服务。

但是相关服务是在主配方中进行管理的。目前,此操作失败,因为它抱怨没有服务。

在以前的版本中使用 LWRP 时,这是由于使用使用内联资源,并且我相信您可以通过不在 LWRP 中包含此功能来回避这个特定问题。

现在我没有在自定义资源中包含此行,但此行为仍然存在。有什么方法可以关闭此行为吗?

或者是否有其他方法可以将服务“包含”在多个资源中,这样我就不必在很多地方使用完全相同的代码?

答案1

根据 delerious010 的回答,我和一位同事针对这种特殊情况想出了一个更好的解决方法:

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

显然,这个例子只管理一个资源,但应该允许您拥有多个资源,并且只通知您想要的资源。

编辑:请注意,这依赖于一个错误(https://github.com/chef/chef/issues/4669),Chef 开发人员会修复此问题。因为在 12.9.38 中,对资源集合的搜索向上递归到外部 run_contexts,所以此代码仍将有效,但不再需要(并且将正确处理多重嵌套子上下文,您需要在根中而不是父 run_context 中获取资源)。这里最好的解决方案应该是升级。

答案2

在 Chef 12.5 中,use_inline_resources 默认处于启用状态。这样一来,每当更新子资源时,LWRP 都会被标记为已更改。因此,您可以始终在“父”LWRP 上定义资源通知。

或者,如果您希望为 LWRP 的所有实例定义通知子句,则您可以随时直接在操作块中创建通知:

notifies_delayed(:restart, resources("service[rsyslog]"))

然而,请记住任何在 LWRP 中修改资源会导致服务重新启动。不过,可以使用对资源的调用来定义notifies子资源的属性。不太确定,因为我还没有测试过。

答案3

在 12.9.38 中,添加了从子资源集合 / use_inline_resources 提供程序向外部资源集合发出通知的功能:

https://github.com/chef/chef/commit/0ca27b6f30ccd327505bd3a44bd319fb3eba956b

这是现在通知的默认行为,因此您只需要升级。

相关内容