В Chef 10 у меня есть несколько ролей, которые устанавливают настраиваемые атрибуты узлов, например
"appname": "my_rails_app"
Затем атрибут используется для загрузки переменных приложения в кулинарную книгу оболочки. Например, для каждого приложения Rails существуют разные переменные и количество переменных.
app = Chef::EncryptedDataBagItem.load('deploy', node.appname)
В Chef 11 мой запуск завершается неудачно, потому что 'node.appname' не устанавливается до тех пор, пока не будет выполнен успешный запуск Chef. Это означает, что создание сервера превратилось в двухэтапный процесс - запуск с базовой ролью, затем кулинарная книга загрузочной оболочки.
Я понимаю, почему это поведение было изменено, но мне любопытно, как обойти это, не переписывая свои кулинарные книги, и по-прежнему придерживаться DRY.
ОБНОВИТЬ
Спасибо, это интересно, но я не уверен, что это сработает. Например, общая поваренная книга развертывания, которая также зависит от имени приложения, включена в рецепт my_rails_app. Так выглядит пробежка
Роль - где установлен атрибут
"appname": "my_rails_app"
Поваренная книга оболочки приложения - загрузка переменных
include_recipe "deploy"
app = Chef::EncryptedDataBagItem.load('deploy', node.appname)
Развернуть кулинарную книгу - загрузить ключи SSH
app = Chef::EncryptedDataBagItem.load('deploy', node.appname)
Поваренная книга развертывания - это то, что убивает шеф-повар.
Атрибуты по умолчанию, уже определенные в файлах атрибутов cookbooks, могут быть снова разрешены во время запуска клиента Chef с node.from_file
:
# set the attribute
node.set[:appname] = "my_rails_app"
# optionally reload node so attribute is available during this chef-client run
node.from_file( run_context.resolve_attribute('your-railapp-cookbook', 'default') )
# and log it.
Chef::Log.info( "appname [#{node[:appname]}]" )
Это раздел, вырванный из мои ответы об использовании атрибутов:
Если вы делаете это, возможно, вам придется подумать о сохранение узла обратно на сервер, если это достаточно важная контрольная точка в вашем процессе, чтобы гарантировать дополнительные обратные вызовы на сервер шеф-повара.