我有两个 LWRP。第一个涉及创建磁盘卷、对其进行格式化并将其安装在虚拟机上,我们将此资源称为 cloud_volume 。第二个资源(它的作用并不重要)需要新格式化的卷的 UUID,这是必需的属性,我们将此资源称为 foobar

资源 cloud_volumefoobar 用于类似以下的配方。

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/

10-16 20:30