Можно ли передать атрибуты chef в пользовательский класс в рецепте и использовать возвращенный вывод в том же рецепте? - PullRequest
0 голосов
/ 06 января 2020

Фон

У меня определены следующие атрибуты:

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)

Это подразумевает, что использование класса не проблема в том, что проблема может быть связана с передачей структуры данных в класс. Странно для меня в этом случае, почему шеф-повар правильно отображает вывод класса в самом рецепте, но у него есть проблема с ним при работе с шаблоном?

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

...