Как передать переменную между блоками ресурсов 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 из второго блока ресурсов? То, о чем я прошу, вообще возможно?


person Keith    schedule 31.05.2017    source источник


Ответы (1)


UUID является частью filesystem2 данных Ohai:

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

Для этого нет необходимости запускать blkid.

Однако, если вам действительно нужно что-то вычислить в блоке и использовать его позже, вы можете объявить переменную uuid перед блоком и вместо этого использовать ruby_block. Вы также можете использовать переменную узла внутри рубинового блока. В любом случае, на вас повлияет двухпроходная модель Chef, и потребуются дополнительные обходные пути (например, ленивые атрибуты ).

Также есть возможность использовать вспомогательный метод, но поскольку UUID является частью данных Ohai, я не вижу смысла даже пытаться (в данном случае).

person Szymon Szypulski    schedule 01.06.2017
comment
Спасибо Шимон. В итоге я использовал Ohai следующим образом и отлично работает: device node['filesystem2']['by_device']['/dev/mapper/vg_volgroup-lv_logicalvolume']['uuid'] - person Keith; 01.06.2017