首先,厨师可以(并且这是一种好习惯)在特定的角色上以指定的时间间隔运行食谱吗?
我有一个管理用户帐户和 ssh 身份的 ruby 脚本,它目前每小时在一个 cron 上运行,出于显而易见的原因,我想把它变成一个 Chef 食谱(我希望它在所有机器上都存在)。
我可以看到两种方法:
将脚本转换为模板,配方只需将模板渲染到给定路径,然后注册一个 cronjob
或者
将脚本分解为资源、提供者等,并让 Chef 每小时运行一次。
想法?
首先,厨师可以(并且这是一种好习惯)在特定的角色上以指定的时间间隔运行食谱吗?
我有一个管理用户帐户和 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 中的符号链接)然后启动(例如,通过 /etc/init.d/haproxy start)。最后,只有当模板的内容发生变化时,Chef 才会渲染模板的新版本。对于模板,它根据 SHA256 校验和确定这一点。
有一些例外 - 执行、脚本和 ruby_block 资源不是幂等的,除非您提供某种有条件的限定符。
此外,Chef 在使用服务器时没有“一次性”或“一次性”食谱运行列表。最近在 Chef 邮件列表上有一个关于该主题的线程。
两者都是可行的。
您提到的选项是:
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')' -回购)。