Назад | Перейти на главную страницу

Как правильно передавать переменные в шаблоны шеф-повара?

Глядя на эту официальную документацию: https://docs.chef.io/resource_template.html Я вижу примеры передачи переменных в ресурс Template, которые используют "{", "({" или "(" для определения области видимости переменных.

Я не могу найти место, объясняющее разницу или почему я бы использовал одну форму вместо другой. Есть ли какая-то практическая разница при запуске рецепта?

Пример 1:

template '/tmp/config.conf' do
  source 'config.conf.erb'
  variables(
  :config_var => node['configs']['config_var']
)
end

Пример 2:

template '/tmp/config.conf' do
  source 'config.conf.erb'
  variables{
  :config_var => node['configs']['config_var']
}
end

Пример 3:

template '/tmp/config.conf' do
  source 'config.conf.erb'
  variables({
  :config_var => node['configs']['config_var']
})
end

Это рубиновая вещь, а не вещь повара.

Когда вы используете ( :key => value ) вы передаете подразумеваемый хеш. Ruby решает, что то, что он видит внутри скобок, похоже на хэш, и автоматически преобразуется в хеш.

Когда вы используете { }, вы фактически проходите блок. Затем Ruby выполняет блок и передает результаты блока обратно в качестве аргументов. Я обнаружил, что эта нотация с наибольшей вероятностью доставит вам неприятности.

Когда вы используете ({ :key => value }) вы явно передаете хеш методу. Скобки явно определяют аргументы метода, а квадратные скобки - это стандартная нотация для определения хэша (никакой магии рубина для автоматического определения хеш-кода аргументов).

Я бы сказал, что не существует однозначного наилучшего / правильного способа, но руководства по стилю рубин, кажется, предпочитают первую версию.