Программно сделать бродягу собственность в шеф-повар Соло рецепт


У меня есть рецепт шеф-повара (Соло), который генерирует 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 2

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'], так что с его помощью вы можете контролировать, где на что ссылаются.