Используя vagrant и chef-solo, как я могу указать, какую версию рубина запускать?

Я использую chef-solo для создания новой бродячей виртуальной машины. Это Убунту 12.10. Chef работает нормально в первый раз, но после этого не запускается.

Проблема в том, что для запуска chef-solo нужно использовать ruby ​​1.9.3, а одна из моих кулинарных книг устанавливает ruby ​​2.0.0. Он связывает новую версию ruby ​​с /usr/local/ruby, поэтому системная версия по-прежнему доступна в /usr/bin/ruby.

Строка shebang в /usr/bin/chef-solo — #!/usr/bin/env ruby.

Есть ли способ установить переменную среды в Vagrantfile перед запуском chef-solo? Или есть другой способ заставить бродягу запускать повар-соло, используя /usr/bin/ruby?

ОБНОВЛЕНИЕ: в настоящее время я использую следующую команду на виртуальной машине в качестве обходного пути:

sudo /usr/bin/ruby /usr/bin/chef-solo --config /tmp/vagrant-chef-1/solo.rb --override-runlist "my_runlist"

Я хотел бы заставить Vagrant запускать что-то подобное, когда я набираю vagrant provision на хосте.


person AndrewF    schedule 16.04.2013    source источник
comment
chef-solo работает на вашей виртуальной машине — вы хотите контролировать, какая версия Ruby используется там или на вашей хост-машине?   -  person cmur2    schedule 16.04.2013
comment
На ВМ. Я добавил разъяснение/обходной путь к вопросу выше.   -  person AndrewF    schedule 16.04.2013


Ответы (2)


/usr/bin/env работает, используя $PATH для поиска исполняемого файла. Вы должны убедиться, что /usr/bin/ruby находится впереди вашего пути. Один из способов убедиться в этом:

export PATH=/usr/bin:$PATH

..а затем попробуйте свой шеф-повар в одиночку.

Вот еще информация из: http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

Часто можно использовать программу /usr/bin/env, чтобы обойти это ограничение, введя уровень косвенности. #! за которым следует /usr/bin/env, за которым следует нужная команда без полного пути, как в этом примере:

!/usr/bin/env ш

Это в основном работает, потому что путь /usr/bin/env обычно используется для утилиты env, и она вызывает первый sh, найденный в $PATH пользователя, обычно /bin/sh, если путь пользователя настроен правильно.

person gabrtv    schedule 16.04.2013
comment
Спасибо, но я не знаю, как установить переменную PATH в контексте запуска vagrant provision. Глобальное добавление /usr/bin перед /usr/local/bin было бы контрпродуктивным и противоречило бы цели соглашения /usr/local. - person AndrewF; 16.04.2013
comment
Да, похоже, установка PATH для vagrant provision действительно то, что вам нужно. Возможно, вы захотите попробовать использовать средство подготовки оболочки, чтобы обернуть одиночный запуск шеф-повара, используя другой путь. - person gabrtv; 16.04.2013
comment
Вместо того, чтобы пытаться изменить то, что делает vagrant (и подходит большинству пользователей), вы можете подумать об использовании менеджера версий ruby, такого как RVM или rbenv, или об установке Chef (Omnibus Installer: opscode.com/chef/install) в инкапсулированной среде в виде двоичного файла, который поставляется вместе с собственной версией Ruby. - person cmur2; 17.04.2013
comment
@ cmur2 Использование rbenv - очень хорошее предложение. На самом деле, в поваренной книге chef-rbenv есть даже «бродячий» рецепт, решающий именно эту проблему. - person AndrewF; 17.04.2013

Используя плагин vagrant omnibus, вы можете установить Chef Omnibus со встроенным Ruby, чтобы гарантировать, что Chef run всегда используют одну и ту же версию Ruby.

Единственная проблема, которую я обнаружил, заключается в том, что если ваши рецепты основаны на системной версии ruby, некоторые настройки не будут работать правильно (например, ruby, установленный в /usr/local/bin, не будет использоваться, если вы shell_out! в кулинарной книге, а установка в /usr/bin будет).

person tnarik    schedule 06.12.2013