Программно сделать бродягу собственность в шеф-повар Соло рецепт
У меня есть рецепт шеф-повара (Соло), который генерирует 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']
, так что с его помощью вы можете контролировать, где на что ссылаются.