Программно сделать бродягу собственность в шеф-повар Соло рецепт
У меня есть рецепт шеф-повара (Соло), который генерирует CSS-файл и помещает его куда-то в корневой каталог web (/vagrant/css на VM в моем случае). Проблема в том, что рецепт должен знать абсолютный путь к каталогу Vagrant synced на VM-это папка, в которой находится Vagrantfile, и по умолчанию она сопоставляется с /vagrant внутри VM.
Я знаю , как задать этот путь :
Vagrant.configure("2") do |config|
config.vm.synced_folder ".", "/synced/dir/on/vm"
end
Но проблема в том, как дать рецепту знать, что /synced/dir/on/vm.
В настоящее время я использую это:
Vagrant.configure("2") do |config|
config.vm.provision :chef_solo do |chef|
chef.json = {
"base_directory" => "/vagrant" # THIS IS IT
}
end
end
Это позволяет мне использовать node["base_directory"] внутри кода рецепта, но у этого есть обратная сторона: если бы я написал несколько рецептов, было бы неудобно использовать node["base_directory"] в каждом рецепте. Это намного лучше, чем жесткое кодирование пути, но это заставляет меня использовать один и тот же ключ на chef.json для каждого рецепта.
Кроме того, если бы я хотел поделиться своим рецептом, я бы заставил пользователей использовать эту пару "base_directory" => "/vagrant" ключ/значение в их Vagrantfile.
Существует ли метод API для получения этого синхронизированного каталога путь на виртуальной машине в коде рецепта? или более обобщенно: есть ли способ получить специфичные для бродяг свойства из рецептов шеф-повара?
Я просмотрел документы Vagrant, но там, кажется, есть только одна страница по этой теме, и поскольку она специфична для Vagrant, в Chef docs также нет соответствующей информации.
1 ответ:
Так что, похоже, есть некоторое расхождение в понимании того, как это должно работать.
При написании рецепта обычно используют атрибуты узла, чтобы определить, где вещь будет в конечном итоге - например, ваш каталог web_root.
Я могу представить себе файл атрибутов рецепта, содержащий:
default['base_directory'] = '/var/www/html'Что будет применимо ко многим производственным серверам.
Затем, при написании рецептов, используйте этот атрибут для отправки файлов туда, куда вы хотите их отправить., например:
cookbook_file "#{node['base_directory']/css/myfile.css" do owner "root" ... endКогда Вы делитесь своей кулинарной книгой, любой, кто выполняет это на сервере, имеющем Каталог
/var/www/html, получит ваш файл в правильном месте.В вашем файле Vagrantfile, чтобы переопределить атрибут узла
base_directoryв синхронизированном каталоге, вы можете сделать что-то вроде этого:SYNCED_FOLDER = "/synced/dir/on/vm" Vagrant.configure("2") do |config| config.vm.synced_folder ".", SYNCED_FOLDER config.vm.provision :chef_solo do |chef| chef.json = { "base_directory" => SYNCED_FOLDER } end endОднако вы упомянули, что не хотите указывать
base_directoryв своих рецептах, поэтому я бы спросил, какой атрибут узла вы используете, чтобы управлять целевым местоположением вашего веб-сайта корень?Если вы используете что-то вроде поваренной книги apache2 с сайта сообщества, то для этого уже есть атрибут:
node['apache']['docroot_dir'], так что с его помощью вы можете контролировать, где на что ссылаются.