Доступ к атрибутам Node в библиотеке шеф-поваров

Я хотел бы создать библиотеку шеф-повара, которая:

  • Предоставляет несколько функций с именами.
  • Доступ к атрибутам node

Эта библиотека предназначена для взаимодействия с внешней системой и получения от нее некоторых входов. Мне нужно получить доступ к атрибутам node, чтобы позволить пользователю переопределять входы, полученные от внешней системы:

Желаемое использование (рецепт)

inputs = MyLib.get_inputs

Библиотека (что у меня есть)

Это вдохновлено те документы.

class Chef::Recipe::MyLib
  def self.get_inputs
    override_inputs = node.fetch(:mylib, Hash.new).fetch(:override_inputs, nil)

    unless override_inputs.nil?
      return override_inputs
    end

    # Do stuff and return inputs (no problem here)
    # ...
  end
end

Проблема

Сейчас я получаю:

undefined local variable or method `node' for Chef::Recipe::Scalr:Class

Ответ 1

У вас нет доступа к объекту node в библиотеке, если вы не передадите его в инициализатор:

class MyHelper
  def self.get_inputs_for(node)
    # Your code will work fine
  end
end

Затем вы вызываете его с помощью:

inputs = MyHelper.get_inputs_for(node)

Альтернатива, вы можете создать модуль и смешать его с рецептом шеф-повара DSL:

module MyHelper
  def get_inputs
    # Same code, but you'll get "node" since this is a mixin
  end
end

Chef::Recipe.send(:include, MyHelper)

Затем у вас есть доступ к методу get_inputs прямо в рецепте:

inputs = get_inputs

Обратите внимание, что это метод экземпляра по сравнению с методом класса.

Короче говоря, библиотеки не имеют доступа к объекту node, если не заданы в качестве параметра. Модули будут, если они будут смешаны с рецептом DSL. Кроме того, объект node фактически является переменной экземпляра, поэтому он недоступен на уровне класса (т.е. self.).

Ответ 2

Я думаю, что здесь есть проблема, поскольку область Node находится под Chef:: Recipe. Поэтому попробуйте исключить MyLib в определении и посмотреть, работает ли он. У меня есть библиотека, определенная таким образом, которая работает:

class Chef
  class Recipe
    def my_library_method
      #access node stuff here should be fine
    end
  end
end