我有两个 LWRP。第一个涉及创建磁盘卷、对其进行格式化并将其安装在虚拟机上,我们将此资源称为 cloud_volume
。第二个资源(它的作用并不重要)需要新格式化的卷的 UUID,这是必需的属性,我们将此资源称为 foobar
。
资源 cloud_volume
和 foobar
用于类似以下的配方。
volumes.each do |mount_point, volume|
cloud_volume "#{mount_point}" do
size volume['size']
label volume['label']
action [:create, :initialize]
end
foobar "#{mount_point}" do
disk_uuid node[:volumes][mount_point][:uuid] # This is set by cloud_volume
action [:do_stuff]
end
end
所以,当我做主厨运行时,我得到一个
Required argument disk_identifier is missing!
异常。在做了一些挖掘之后,我发现配方是在两个阶段处理的,一个编译阶段和一个执行阶段。看起来问题出在编译时,因为那是未设置
node[:volumes][mount_point][:uuid]
的时间点。不幸的是,我无法使用 OpsCode 具有 here 的技巧,因为 cloud_volume LWRP 中正在使用通知(因此它会陷入文档中显示的反模式)
所以,毕竟这一切,我的问题是,有没有办法绕过在编译时知道
disk_uuid
的值的要求? 最佳答案
更简洁的方法是使用 Lazy Attribute Evaluation 。这将在执行期间评估 node[:volumes][mount_point][:uuid]
而不是编译
foobar "#{mount_point}" do
disk_uuid lazy { node[:volumes][mount_point][:uuid] }
action [:do_stuff]
end
关于ruby - 有没有办法将资源的属性解析延迟到 "execute"阶段?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14633509/