厨师是否会通知:行动,资源':之前'根本应该工作吗?

时间:2016-11-25 14:00:52

标签: notifications chef

我最近尝试执行一项简单的任务:如果不存在,请通过将分发从Web位置(内部仓库)中拉出来安装一个包,并在不再需要时删除它。

了解:在通知之前,我想出了以下优雅代码(在此示例变量" pkg"保留分发图像的名称," pkg_src_location"是我的网站存储库的URL,& #34; name_of_package"被命名为已安装的包):

local_image = "#{Chef::Config['file_cache_path']}/#{pkg}"

remote_file 'package_image' do
  path local_image
  source "#{pkg_src_location}/#{pkg}"
  action :nothing
end

package name_of_package do
  source local_image
  notifies :create, 'remote_file[package_image]', :before
  notifies :delete, 'remote_file[package_image]', :delayed
end

我很惊讶它不起作用......其实' package'资源正在融合而没有' remote_file'被创建 - 由于源local_image没有到位而失败...

我做了一个简单的测试:

log 'before' do
  action :nothing
end

log 'after' do
  action :nothing
end

log 'at-the-end' do
  action :nothing
end

log 'main' do
  notifies :write, 'log[before]', :before
  notifies :write, 'log[at-the-end]', :delayed
  notifies :write, 'log[after]', :immediately
end

我学到的是“主要'实际上是两次融合!一旦第一次遇到,再一次,在'之前资源是融合的......

   Recipe: notify_test::default
     * log[before] action nothing (skipped due to action :nothing)
     * log[after] action nothing (skipped due to action :nothing)
     * log[at-the-end] action nothing (skipped due to action :nothing)
     * log[main] action write

     * log[before] action write

     * log[main] action write

     * log[after] action write

     * log[at-the-end] action write

是错误还是功能?如果这是“功能”,这是一个非常糟糕的问题,而厨师根本就不应该这样做。它的工作方式毫无用处,只会浪费人们的时间......

任何有更深入的厨师理解的人都能评论吗?是否有任何方法可以制作':之前'工作?也许我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

经过一番重新思考后,我发现了这里出了什么问题:

如果必须更新实际资源,则触发before通知,在chef inner中这意味着将实际资源状态与所需资源状态进行比较('\ load_current_resource \ in providers)。

在这里你愿意安装一个包,厨师会向系统询问这个包及它的版本,然后将这个结果与你提供的来源进行比较。

问题就在这里,你无法与源软件包进行比较,因为它没有安装。

对于您的情况,最好的办法是将文件留在系统上并删除通知。

如果要在升级数据库系统之前启动数据库备份,或者如RFC for :before中所述,在升级其程序包之前停止服务,则可能会引起前通知。

但它不应该用于触发另一个提供“调用”资源属性的资源。

答案 1 :(得分:0)

更具体一点,before时间使用“为什么运行”系统来猜测资源是否需要更新。在这种情况下,包资源开始时无效,因此whyrun无法判断是否需要更新。