3

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

我有一个管理用户帐户和 ssh 身份的 ruby​​ 脚本,它目前每小时在一个 cron 上运行,出于显而易见的原因,我想把它变成一个 Chef 食谱(我希望它在所有机器上都存在)。

我可以看到两种方法:

将脚本转换为模板,配方只需将模板渲染到给定路径,然后注册一个 cronjob

或者

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

想法?

4

2 回答 2

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 校验和确定这一点。

有一些例外 - 执行、脚本和 ruby​​_block 资源不是幂等的,除非您提供某种有条件的限定符。

此外,Chef 在使用服务器时没有“一次性”或“一次性”食谱运行列表。最近在 Chef 邮件列表上有一个关于该主题的线程。

于 2011-02-06T20:00:06.133 回答
2

两者都是可行的。
您提到的选项是:

1)

将脚本转换为模板,配方只需将模板渲染到给定路径,然后注册一个 cronjob

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

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

或 2)

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

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

如果你的主厨客户端是守护进程,或者主厨独奏在 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 平台)。如果你使用 chef-solo,你需要用你自己的数据包文件替换 'search(:users, 'groups:sysadmin')' -回购)。

于 2011-06-28T00:36:45.263 回答