我在我们的网络中设置了一个 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 将不会触发重新启动服务的通知。
您需要确定这些重启是否由于您更改配置而发生,或者配方中是否存在导致其始终重新启动服务的错误。