所以我希望厨师在整个运行完成后清除目录。我认为这样做的方法是通过通知,但我没有太多运气。我有下面的代码,我认为会删除缓存目录(/ var / chef / cache),但它似乎永远不会运行。
日志记录表示目录资源已被跳过,因为在编译阶段该操作没有任何意义(这是有意义的),但操作最终不会通过通知运行。我错过了什么?
directory "delete the dir #{Chef::Config["file_cache_path"]}" do
recursive true
path "#{Chef::Config["file_cache_path"]}"
action :nothing
end
s3_file "download tarball" do
<details>
notifies :delete, "directory[#{prefix} delete the dir #{Chef::Config["file_cache_path"]}]", :delayed
end
答案 0 :(得分:1)
厨师食谱按照run_list
中指定的顺序执行。如果您想要最后执行某些操作,请将该配方放在run_list
的末尾。使用通知是不可取的,因为:
想象一下,您是团队中另一位审核此代码的开发人员。为什么s3_file
会删除文件缓存路径?没有评论等。此外,在更大,更复杂的应用程序中,您可能会收到多个资源的通知。根据我的经验,人类在可视化间接水平方面非常糟糕,并且经常会造成不必要的痛苦。
Chef中有两种通知 - delayed
和immediate
。如果调用资源报告上次操作更新了立即通知,则可以保证立即通知。但是,在其他所有操作完成后,延迟通知。如果Chef Client Run(CCR)无法成功完成,则不会触发这些通知。因此,使用延迟通知将某些内容推送到CCR的“结尾”并不能保证执行。
正如HolgerJust在评论部分指出的那样,Chef 11将尝试运行延迟通知,但这仍然不是Chef客户保证的行动。
此外(以及关于promises的真实要点)是,如果资源报告它已被上一个操作更新,则Chef仅触发通知。考虑:
user 'sethvargo' do
# ...
notifies :restart, 'service[tomcat]'
end
# ...
service 'tomcat' do
action :nothing
end
第一次执行此运行时,它将创建名为“sethvargo”的用户,该用户将:restart
操作发送到tomcat服务。但是,在后续运行中,用户“sethvargo”已经存在,因此通知不会触发。
在您的特定示例中,如果s3_file
报告其未通过上一次操作更新(也就是说它不会改变系统状态),则通知将不会触发。这可能看起来并不可怕,直到我告诉您updated_by_last_action
是食谱开发者必须代理的属性。此外,这是许多社区食谱过去没有设置的属性。 s3_file
资源很可能无法正确记录其状态,因此不会触发通知。
最后一点:
删除Chef::Config[:file_cache_path]
可能是一个坏主意。如果您需要删除特定文件,只需删除该文件即可。或者告诉Chef不要使用资源上的backup false
备份文件。
答案 1 :(得分:0)
对于流浪的chef_solo配置器,重启流浪者配置阶段的目的是什么,确保厨师/缓存有最新的烹饪书,如果有“流浪汉”,“流浪汉提供”,“图书管理员 - 厨师更新“,”流浪汉条款“?
我发现,即使由于图书管理员和厨师更新,烹饪书的内容和元数据也会发生变化,厨师/缓存仍然存在于“流浪者提供”请求之间。
解决方法是shell进入机器并删除留下的Chef目录。这很尴尬。