chef在运行结束时删除目录

时间:2014-06-17 14:09:37

标签: chef

所以我希望厨师在整个运行完成后清除目录。我认为这样做的方法是通过通知,但我没有太多运气。我有下面的代码,我认为会删除缓存目录(/ 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

2 个答案:

答案 0 :(得分:1)

厨师食谱按照run_list中指定的顺序执行。如果您想要最后执行某些操作,请将该配方放在run_list的末尾。使用通知是不可取的,因为:

  1. 这不直观
  2. 不保证
  3. 这不直观

    想象一下,您是团队中另一位审核此代码的开发人员。为什么s3_file会删除文件缓存路径?没有评论等。此外,在更大,更复杂的应用程序中,您可能会收到多个资源的通知。根据我的经验,人类在可视化间接水平方面非常糟糕,并且经常会造成不必要的痛苦。

    不保证

    Chef中有两种通知 - delayedimmediate。如果调用资源报告上次操作更新了立即通知,则可以保证立即通知。但是,在其他所有操作完成后,延迟通知。如果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目录。这很尴尬。