如何确定目录中的任何文件是否已更改
How to determine if any file in a directory has changed
Chef 有没有办法确定它是否更改了给定目录中的任何文件?如果更新 conf.d 目录中的任何设置,我想重新启动服务器进程。
我确定可以将 md5sums 列表写入每个 chef-client 运行 上的文件,并将当前迭代与之前的迭代进行比较。但这是解决看似常见情况的相当多的代码。有没有更好的方法?
您可以使用 inotify-tools 包中的 inotifywait 实用程序
Chef 提供了一个名为 notifications 的概念。
这允许您定义一个资源的更改触发另一个资源的执行。提到的在配置文件更改后重新启动服务可能是最常见的用例。
template "/etc/foo/conf.d/example.conf" do
notifies :restart, "service[foo]"
end
service "foo" do
supports :restart => true, :reload => true
action :enable
end
默认情况下,通知是 :delayed
,这意味着它们在 Chef 运行 结束时触发。这可以帮助您避免例如为每个更改的配置文件重新启动一次的服务。如果您想要立即通知,请使用
notifies :restart, "service[foo]", :immediately
当然,您不仅可以将 Chef 的通知用于服务,还可以用于任何资源。 documentation.
中给出了更多示例
Chef 有没有办法确定它是否更改了给定目录中的任何文件?如果更新 conf.d 目录中的任何设置,我想重新启动服务器进程。
我确定可以将 md5sums 列表写入每个 chef-client 运行 上的文件,并将当前迭代与之前的迭代进行比较。但这是解决看似常见情况的相当多的代码。有没有更好的方法?
您可以使用 inotify-tools 包中的 inotifywait 实用程序
Chef 提供了一个名为 notifications 的概念。
这允许您定义一个资源的更改触发另一个资源的执行。提到的在配置文件更改后重新启动服务可能是最常见的用例。
template "/etc/foo/conf.d/example.conf" do
notifies :restart, "service[foo]"
end
service "foo" do
supports :restart => true, :reload => true
action :enable
end
默认情况下,通知是 :delayed
,这意味着它们在 Chef 运行 结束时触发。这可以帮助您避免例如为每个更改的配置文件重新启动一次的服务。如果您想要立即通知,请使用
notifies :restart, "service[foo]", :immediately
当然,您不仅可以将 Chef 的通知用于服务,还可以用于任何资源。 documentation.
中给出了更多示例