我最近尝试执行一项简单的任务:如果不存在,请通过将分发从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
是错误还是功能?如果这是“功能”,这是一个非常糟糕的问题,而厨师根本就不应该这样做。它的工作方式毫无用处,只会浪费人们的时间......
任何有更深入的厨师理解的人都能评论吗?是否有任何方法可以制作':之前'工作?也许我在这里做错了什么?
答案 0 :(得分:0)
经过一番重新思考后,我发现了这里出了什么问题:
如果必须更新实际资源,则触发before通知,在chef inner中这意味着将实际资源状态与所需资源状态进行比较('\ load_current_resource \ in providers)。
在这里你愿意安装一个包,厨师会向系统询问这个包及它的版本,然后将这个结果与你提供的来源进行比较。
问题就在这里,你无法与源软件包进行比较,因为它没有安装。
对于您的情况,最好的办法是将文件留在系统上并删除通知。
如果要在升级数据库系统之前启动数据库备份,或者如RFC for :before中所述,在升级其程序包之前停止服务,则可能会引起前通知。
但它不应该用于触发另一个提供“调用”资源属性的资源。
答案 1 :(得分:0)
更具体一点,before
时间使用“为什么运行”系统来猜测资源是否需要更新。在这种情况下,包资源开始时无效,因此whyrun无法判断是否需要更新。