Фон
У меня определены следующие атрибуты:
node[:infrastructure][:webserver][:custom_options]
node[:infrastructure][:webserver][:verticals]
Это хеши значений, которые я хочу обработать в рамках моего рецепта. У меня есть класс CustomOptionsMap
, который принимает пользовательские параметры и вертикали в качестве аргументов своего конструктора, а затем обрабатывает их. Я использую это так:
options = CustomOptionsMap.new(selections, verticals).data
options
здесь должно возвращаться урезанное ха sh значений, которые я затем отправил бы в свой шаблон для соответствующего использования. Когда я print options
получаю вложенный ха sh Я ожидаю.
Я хочу передать этот результат в шаблон, поэтому сначала я определяю его как атрибут:
node.default[:infrastructure][:webserver][:configuration_options] = options.data
Когда я print node[:infrastructure][:webserver][:configuration_options]
, я получаю те же вложенные хеши, что и раньше, поэтому все выглядит хорошо.
Затем я определяю шаблон и передаю параметры вместе с некоторыми другими, которые я ранее определил:
# Create the multisite configuation
template "/etc/nginx/sites-available/conf/01-multisite.conf" do
source '01-multisite.conf.erb'
owner 'root'
group 'root'
mode '0644'
variables(
server_name: node[:infrastructure][:webserver][:server_name],
fastcgi_backend: node[:infrastructure][:webserver][:fastcgi_backend],
configurations: node[:infrastructure][:webserver][:configuation_options]
)
notifies :reload, 'service[nginx]', :delayed
end
Когда я выполняю список выполнения, я получаю следующую ошибку компиляции рецепта:
undefined method `fetch' for nil:NilClass
Журнал ошибок показывает, что ха sh данных, которые я передаю в класс в рецепт не передается, как ожидалось.
Вопрос
Я пытаюсь выяснить, как лучше всего отладить это. Первое, что я хотел бы знать, это то, возможно ли использовать собственный класс в рецепте, как я описал, и ожидать, что возвращаемые данные будут доступны для использования в другом месте в рецепте? Мне любопытно, что вывод ошибки от chef указывает, что он попадает в класс, а затем вызывает из него указанную c строку:
63>> verticals_data = @website_data.fetch(vertical)
Это подразумевает, что использование класса не проблема в том, что проблема может быть связана с передачей структуры данных в класс. Странно для меня в этом случае, почему шеф-повар правильно отображает вывод класса в самом рецепте, но у него есть проблема с ним при работе с шаблоном?
Обратите внимание, что я не включил код для класса, потому что я не знал, будет ли это полезно. Если это так, я, конечно, могу отредактировать и включить его.