我在我们的networking中设置了一个Chef服务器来pipe理多个节点。 这些节点安装了一个chef-client,每X分钟安装一个守护进程。
问题在于,每次客户端运行时,都会执行所有食谱的食谱,甚至是之前执行的食谱,所以它会占用资源,有时甚至会中断思考(例如服务重新启动)。
我知道,我可以避免执行一个代码或我创build的配方在这里详细: 防止厨师食谱执行以前执行的行动? 但是,这是否意味着我应该修改从opscode存储库下载的任何食谱。
换句话说,是否有可能使厨师服务器(或客户)在第一次执行食谱时将其标记为“执行”?
精心devise的食谱应该是完全幂等的 – 也就是说,它们可以运行多次,随后的运行什么都不做(只要没有改变configuration)。 如果您正处于烹饪书正在重新启动服务的情况下,即使没有任何configuration发生变化,这也意味着烹饪书中存在一个错误。
另一方面,如果configuration已经改变(例如,你已经改变了食谱读取的属性),那么配方可以很好地(合法地)重新启动服务,以便configuration更改生效。
在具体的服务中,重启的方式通常是通过通知机制触发的。 在一个配方中,你将有一个服务资源,看起来像这样:
service "myservice" do action :nothing end
如果配方然后为应用程序生成一个configuration文件,您将有一个template资源向service资源发送一个通知:
template "/etc/myapp.conf" do notifies :restart, "service[myservice]" end
template资源具有内置的逻辑,如果现有的myapp.conf文件与Chef生成的文件相同,那么Chef将不会触发通知来重新启动服务。
您将需要确定这些重新启动是由于您更改configuration而发生的,还是在配方中是否存在导致其始终重新启动服务的错误。