2011-02-06 80 views
3

首先,可以(并且这是一种很好的做法)厨师在特定角色的指定时间间隔运行食谱?厨师 - 重复性配方执行

我有一个ruby脚本来管理用户帐户和ssh身份,它每小时都在cron上运行,我想将它变成一个厨师配方,原因很明显(我希望它在那里所有机器)。

我可以看到这样做的方法有两种:

要么把脚本到模板,配方只会呈现模板给定的路径,然后注册一个cronjob

OR

将脚本分解为资源,提供者等,并让厨师每小时运行一次。

想法?

回答

8

您可以运行厨师客户端作为一个守护进程(-d选项,在init脚本中使用),或在服务管理工具,如upstartrunit/daemontools或bluepill。你当然也可以从cron启动它 - 只要确保不在那里运行守护进程模式:)。

厨师资源提供者采取幂等动作将资源配置为处于所需状态。这意味着如果Chef已经在系统上运行,它只会修改资源,如果它们与配方所说的不匹配。举例来说,如果你有一个食谱,上面写着:

package "haproxy" 

service "haproxy" do 
    action [:enable, :start] 
end 

template "/etc/haproxy/haproxy.cfg" do 
    source "haproxy.cfg.erb" 
end 

软件包将被安装在第一时间厨师运行,除非包从系统中删除或修改资源不会被再次修改。同样,haproxy服务将启用(通过您的平台的服务管理工具,通常是/etc/rc*.d中的符号链接),然后启动(例如,通过/etc/init.d/haproxy start)。最后,只有当模板的内容发生变化时,厨师才能渲染模板的新版本。对于模板,它基于SHA256校验和来确定。

有几个例外 - 执行,脚本和ruby_block资源不幂等没有你提供某种限定条件。

另外,厨师在使用服务器时没有“一次性”或“一次性”食谱运行列表。最近有一个thread on the Chef mailing list关于这个话题。

+0

感谢您的回答。代理程序作为守护程序运行,我的问题是,即使运行之前并且成功完成,每次运行的厨师都可以运行相同的配方吗? – 2011-02-08 08:46:18

2

两者都可行。
你你提到的选项分别为:

1)

打开脚本转换为 模板,配方只会 呈现模板给定的路径 ,然后注册一个cronjob

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

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

OR 2)

破坏脚本资源化, 提供商等,并有厨师运行 每隔一小时。

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

如果您的厨师客户端是守护进程的,或者厨师独奏在cron上运行,它会很好用。

在这种情况下,您可以使用'user','group'和'file'等资源来设置配方(以复制ssh密钥)。详情请看这里:http://wiki.opscode.com/display/chef/Resources#Resources-File

然后,你最好打赌是使用'数据包'(json数据)来存储用户的详细信息,并基于此安装用户。这正是Opscode公司在这个配方已经做了(看看./recipe/sysadmins.rb灵感): https://github.com/opscode/cookbooks/tree/master/users

要知道他们正在使用的厨师服务器(或Opscode公司平台)。如果您使用的是厨师独奏,则需要使用您自己的数据包文件替换搜索(:用户,组:'sysadmin')',该文件位于厨师独奏可以访问的位置(可下载或在您的厨师-repo)。