Chef 食谱被标记为已执行

Chef 食谱被标记为已执行

我在我们的网络中设置了一个 Chef 服务器,用于管理多个节点。这些节点安装了 chef-client,每隔 X 分钟作为守护进程执行一次。

问题是,每次客户端运行时,它都会执行所有食谱的食谱,甚至是之前执行过的食谱,因此它会消耗资源,有时甚至会破坏思维(例如,服务重新启动)。

我知道我可以避免执行一段代码或我创建的配方,如下所述: 阻止厨师菜谱执行先前执行的操作?但是,这是否意味着我应该修改从 opscode 存储库下载的任何食谱。

换句话说,是否可以让厨师服务器(或客户端)在第一次执行食谱时立即将其标记为“已执行”?

答案1

设计良好的食谱应该是完全幂等的 - 也就是说,它们可以运行多次,后续运行不执行任何操作(前提是配置没有更改)。如果您遇到食谱重新启动服务的情况,即使配置没有更改,则表明食谱中存在错误。

另一方面,如果配置发生了变化(例如,您改变了食谱读取的属性),那么食谱很可能会(合法地)重新启动服务,以便配置更改生效。


在服务的特定情况下,通常通过以下方式触发重启:通知机制。在配方中,您将拥有如下所示的服务资源:

service "myservice" do
  action :nothing
end

如果该配方随后为应用程序生成一个配置文件,您将拥有一个template向资源发送通知的资源service

template "/etc/myapp.conf" do
  notifies :restart, "service[myservice]"
end

template资源具有内置逻辑,如果现有myapp.conf文件与 Chef 生成的文件相同,则 Chef 将不会触发重新启动服务的通知。


您需要确定这些重启是否由于您更改配置而发生,或者配方中是否存在导致其始终重新启动服务的错误。

相关内容