首先,厨师可以(并且这是一种很好的做法)以特定的时间间隔为特定角色运行食谱吗?
我有一个管理用户帐户和 ssh 身份的 ruby 脚本,它目前每小时在 cron 上运行一次,出于显而易见的原因,我想将其转换为 Chef 配方(我希望它在所有机器上都存在)。
我可以看到两种方法:
要么将脚本转换为模板,配方只会将模板渲染到给定的路径,然后注册一个 cronjob
或者
将脚本分解为资源、提供者等,并让 Chef 每小时运行一次。
想法?
最佳答案
您可以将 Chef-client 作为守护进程(-d 选项,在 init 脚本中使用)运行,或者在 upstart 、 runit/daemontools 或 bluepill 等服务管理工具下运行。您当然也可以从 cron 启动它 - 只需确保不在那里运行守护程序模式:)。
Chef 的资源提供者采取幂等操作将资源配置为处于所需状态。这意味着如果 Chef 已经在系统上运行,它只会在资源与配方所说的不匹配时修改资源。例如,如果您有一个食谱,上面写着:
package "haproxy"
service "haproxy" do
action [:enable, :start]
end
template "/etc/haproxy/haproxy.cfg" do
source "haproxy.cfg.erb"
end
该软件包将在第一次运行 Chef 时安装并且不会再次修改,除非该软件包已从系统中删除,或者您修改了资源。同样,haproxy 服务将被启用(通过您平台的服务管理工具,通常是/etc/rc*.d 中的符号链接(symbolic link))然后启动(例如,通过/etc/init.d/haproxy start)。最后,只有当模板的内容发生变化时,Chef 才会呈现模板的新版本。对于模板,它根据 SHA256 校验和确定这一点。
有一些异常(exception) - 执行、脚本和 ruby_block 资源不是幂等的,除非您提供某种限定符条件。
此外,Chef 在使用服务器时没有“一次性”或“一次性”食谱运行列表。最近有一个关于这个话题的 thread on the Chef mailing list。
关于cron - 厨师 - 重复的食谱执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4913521/