【发布时间】: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