【问题标题】:Chef - Custom Resource - How to notify only if the content of the ressource updates a file?Chef - 自定义资源 - 如何仅在资源内容更新文件时通知?
【发布时间】:2022-11-12 17:04:52
【问题描述】:

我不确定我是否正确理解了基于自定义资源通知其他资源的概念。我有一个资源:

get_api_calls 'www.myapi.com' do
  request '<myrequest>'
  target_path '/<my>/<target>/<filepath>
  notifies :reload, 'service[apache]', :delayed
end

这个演示资源是虚构的,但显示了我想要做什么。在后台,它查询 API,下载必要的文件并将其存储到 my_target_filepath 中。每次我从上面执行 Chef 代码时,它都会重新加载 Apache。这是有道理的,因为我告诉 DSL 每次执行时都要重新加载资源。但我不想要这种行为。如果仅从 API 下载和更新文件,我想通知重新加载 Apache。

我的意思是文件资源最终的行为相同。它在后台更新或创建一个文件并仅通知另一个资源,而不是在每次执行时都通知它而不更改某些内容。

如何为我的资源实现该行为?

【问题讨论】:

  • 我们需要查看您的 get_api_calls 资源定义,但我猜它没有使用converge_if_changed 也没有在converge_by 周围进行适当的保护,因此它总是标记为更新,因此在每次调用时都会触发通知。关于您在 load_current_resource 中所做的事情的可能性太多,因此没有代码就无法回答。
  • @Tensibai,你是对的。最初,我为每个 ruby​​ 代码执行使用了一个 Ruby 块,以避免在编译阶段执行它,并且只在配方中的正确时间执行它。我错了,不使用 Ruby 块,API 交互的工作方式几乎相同。我删除了 Ruby 块,并在我的文件属性执行中删除了 run_context 指令,它起作用了!

标签: chef-infra lwrp chef-custom-resource


【解决方案1】:

我在整个 API 交互中使用了 Ruby 块。从文件资源中删除块和 run_context 解决了这个问题。

【讨论】:

    【解决方案2】:

    实现此目的的一种方法是在 get_api_calls 资源中使用一个条件,该条件仅在文件已更新时通知 apache 服务:

    get_api_calls 'www.myapi.com' do
      request '<myrequest>'
      target_path '/<my>/<target>/<filepath>
      notifies :reload, 'service[apache]', :delayed if file_updated?
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多