厨师食谱标记为执行

我在我们的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而发生的,还是在配方中是否存在导致其始终重新启动服务的错误。