Программно получить свойство Vagrant в сольном рецепте Chef

У меня есть рецепт Chef (соло), который генерирует файл CSS и помещает его куда-нибудь в корневой веб-каталог (в моем случае /vagrant/css на виртуальной машине). Проблема в том, что рецепт должен знать абсолютный путь к каталогу vagrant synced на виртуальной машине — это папка, в которой находится Vagrantfile, и по умолчанию она сопоставляется с /vagrant внутри виртуальной машины.

Я знаю, как установить этот путь:

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 свойства из рецептов Chef?

Я просмотрел документы Vagrant, но, похоже, там есть только одна страница по этой теме, а поскольку он специфичен для Vagrant, в документах Chef нет соответствующей информации.


person scriptin    schedule 03.05.2013    source источник
comment
Я бы тоже хотел это знать. Похоже, раньше для этого существовал какой-то метод, но он больше не работает: github.com/aespinosa/workstation-vagrant/blob/master/ и github.com/xforty/chef-drupal/blob/master/recipes/   -  person Alan Ivey    schedule 29.06.2013
comment
Не совсем понятно, почему вы помещаете файл, созданный на виртуальной машине, обратно в папку, которая монтируется с хост-компьютера. Если вам просто нужно поместить файл в «известное» место, возможно, используйте Chef::Config[:file_cache_path].   -  person CAB    schedule 10.10.2013
comment
Другая мысль; если другим рецептам нужно знать, где заканчивается этот конкретный файл CSS, добавьте атрибут в рецепт css, например default[:cssrecipe][:cssdir] = . В атрибутах json Vagrantfile сделайте это; chef.json = { :cssrecipe =› { :cssdir =› [/vagrant] }}. В файлах атрибутов других рецептов сделайте это; include_attribute css-рецепт. в этих рецептах теперь можно использовать node[:cssrecipe][:cssdir]. Это не менее обременительно при необходимости использовать chef.json в каждом Vagrantfile, но делает взаимосвязь между рецептами гораздо более понятной.   -  person CAB    schedule 10.10.2013
comment
Нет. Вам нужно будет передать значения в объект node   -  person sethvargo    schedule 28.11.2013
comment
Вы нашли решение этой проблемы? Пожалуйста, не забудьте отметить ответ как правильный! :)   -  person sethvargo    schedule 02.01.2014


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

person Mike Fiedler    schedule 15.12.2013