Я пытаюсь запустить следующую команду шеф-повара:
# install zombiejs, q (promises), should, coffee-script & mocha
execute "install q and zombiejs" do
cwd "/home/vagrant"
user "vagrant"
action :run
command "npm install -g q zombie should mocha coffee-script"
end
Но он продолжает терпеть неудачу, потому что не может найти npm
:
выполнить [install q and zombiejs] (chef-redtail :: default line 205) произошла ошибка: Errno :: ENOENT: нет такого файла или каталога - npm install -g q zombie should mocha coffee-script
Вход в vagrant через vagrant ssh
и запуск команды вручную работает отлично. Вход в систему как root через sudo -i
и выполнение команды не выполняется по той же причине, что и рецепт шеф-повара (npm устанавливается локально только для бродячего пользователя, а не для root: это то, что я хочу).
Итак ... как я могу указать этого шеф-повара execute
блокировать запуск как бродячий пользователь, а не root?
ОБНОВИТЬ: Я думаю, это резюмирует мою проблему:
(ssh) /vagrant git:backbone ❯ whoami
vagrant
(ssh) /vagrant git:backbone ❯ which npm
/home/vagrant/.local/bin/npm
(ssh) /vagrant git:backbone ❯ echo $PATH
/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i echo $PATH
/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i which npm
npm not found
через http://tickets.opscode.com/browse/CHEF-2517
ЕЩЕ ОДИН ОБНОВЛЕНИЕ: Так я только что заметил это несоответствие:
(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i echo $PATH
/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i export
HOME=/home/vagrant
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LOGNAME=vagrant
MAIL=/var/mail/vagrant
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
SHELL=/bin/zsh
SSH_AUTH_SOCK=/tmp/ssh-uJUopA4146/agent.4146
SUDO_COMMAND='/bin/zsh -c export'
SUDO_GID=1001
SUDO_UID=1000
SUDO_USER=vagrant
TERM=xterm
USER=vagrant
Обратите внимание на разницу в PATH
? Экспорт не имеет /home/vagrant/.local/bin
каталог, указанный в нем ... почему первое эхо вернется PATH
с ним и второй экспортный возврат PATH
без этого? Это проблема?
Чтобы выполнить сценарий или команду от имени пользователя, вам необходимо объединить su -l и баш -i:
execute "npm_install" do
command "su vagrant -l -c 'cd /shared-with-host/helperScripts/ && bash -i npm install -g q zombie should mocha coffee-script'"
action :run
end
Из-за некоторые ошибки, chef неправильно настроил среду для указанного пользователя в выполнять. Решение narced133 не сработает.
Ты можешь использовать environment
для установки переменных среды HOME и USER в блоке выполнения.
execute "install q and zombiejs" do
cwd "/home/vagrant"
user "vagrant"
action :run
environment ({'HOME' => '/home/vagrant', 'USER' => 'vagrant'})
command "npm install -g q zombie should mocha coffee-script"
end
Я часто использую это для установки бродячих плагинов в качестве бродячего пользователя внутри своих виртуальных машин. Вы также можете установить другие переменные среды, если это необходимо для любой команды, которую вы пытаетесь выполнить.
Похоже, Chef работает как бродячий пользователь, но не выполняет поиск в том же PATH, что и ваша оболочка. Войти с помощью vagrant ssh
и беги which npm
. Он вернет что-то вроде /path/to/bin/npm
. Заменить /path/to/bin/
ниже, чтобы Chef начал поиск в соответствующем каталоге.
execute "install q and zombiejs" do
cwd "/home/vagrant"
user "vagrant"
action :run
path ["/path/to/bin/"]
command "npm install -g q zombie should mocha coffee-script"
end