厨师 - 重复的食谱执行

时间:2011-02-06 13:15:30

标签: cron chef chef-recipe

首先,可以(并且这是一个好习惯)厨师在特定角色的指定时间间隔运行食谱吗?

我有一个管理用户帐户和ssh身份的ruby脚本,它目前每小时运行一次cron,我想把它变成一个主厨配方,原因很明显(我希望它能在所有机)。

我可以看到两种方法:

将脚本转换为模板,配方只是将模板呈现给给定路径,然后注册cronjob

OR

将脚本分解为资源,提供程序等,让Chef每小时运行一次。

想法?

2 个答案:

答案 0 :(得分:8)

您可以将chef-client作为守护程序(-d选项,在init脚本中使用)运行,或者在upstartrunit / 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中的符号链接),然后启动(例如,通过/etc/init.d/haproxy start)。最后,只有当模板内容发生变化时,Chef才会呈现模板的新版本。对于模板,它根据SHA256校验和来确定。

有一些例外 - 如果没有提供某种有条件的限定符,execute,script和ruby_block资源就不是幂等的。

此外,使用服务器时,Chef没有“一次性”或“一次性”配方运行列表。最近有一个关于这个主题的thread on the Chef mailing list

答案 1 :(得分:2)

两者都是可行的 你提到的选择是:

1)

  

将脚本变成一个   模板,配方会简单   将模板渲染到给定路径   然后注册一个cronjob

这很容易上手(对你的脚本没有真正的改变,只是确保它在那里)

请记住,厨师每次都会运行每一份食谱......正如jtimberman所说:“如果资源与配方不匹配,它只会修改资源”。因此,您的配方应该在更改时覆盖新模板。

或2)

  

将脚本分解为资源,   供应商等,让厨师运行它   每小时。

此选项更像厨师,可能更可靠,更具可扩展性 - 尤其是当您将更多基础设施置于厨师管理之下时。

如果您的厨师客户端被守护,或者厨师独奏是在cron上运行的话,那将会很棒。

在这种情况下,您可以使用“用户”,“组”和“文件”等资源设置配方(复制ssh密钥)。有关详细信息,请参阅此处:http://wiki.opscode.com/display/chef/Resources#Resources-File

然后,您最好的选择是使用'数据包'(json数据)来存储用户详细信息,并根据该用户安装您的用户。这正是opscode在这个配方中所做的事情(在./recipe/sysadmins.rb中寻找灵感): https://github.com/opscode/cookbooks/tree/master/users

请注意,他们正在使用chef-server(或opscode平台)。如果您正在使用厨师独奏,则需要将“搜索(:用户,'群组:系统管理员')'替换为您自己的数据包文件,该文件可以在厨师独奏的地方找到(可下载,或在您的厨师中) -repo)。