Доступ к атрибутам 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