如何在相同配方的 Chef 资源块之间传递变量

How to pass variable between Chef resource blocks of same recipe

我们有一个包含几个资源块的 Chef 食谱。第一个资源块在 bash 中,获取逻辑卷的 UUID 值并存储到变量 $uuid.

# Get UUID value
bash 'get uuid' do
  cwd "/"
  code <<-EOH
    uuid=$(blkid -o value -s UUID /dev/vg_volgroup/lv_logicalvolume)
  EOH
end

我们需要将变量$uuid传递给我们的第二个资源块:

# Mount directory, format, update fstab
  mount node['mount_dir'] do
    dump 1
    pass 2
    device #{uuid}
    device_type :uuid
    fstype node['fstype']
    options node['options']
    action [ :mount, :enable]
  end

不幸的是,这不起作用。 $uuid 的值未传递到第二个资源块。

是否有更合适的方法从第二个资源块中引用 $uuid?我问的可能吗?

UUID 是 filesystem2 Ohai data 的一部分:

filesystem2:
  by_device:
    /dev/md1:
      ...
      uuid:                f49a3dc8-a0b6-4e1c-8cd3-926fa7d8ee29

不需要运行blkid

但是,如果您确实需要在块中计算某些内容并稍后使用它,您可以在块之前声明 uuid 变量并使用 ruby_block 代替。您还可以在 ruby 块中使用节点变量。无论如何,您将受到 Chef 的 two pass model 的影响,并且需要进一步的解决方法(如惰性属性)。

还有一个使用辅助方法的选项,但由于 UUID 是 Ohai 数据的一部分,我看不出有任何理由尝试(在这种情况下)。