`execute` как бродячий пользователь, а не root, с chef-solo?

10

Я пытаюсь запустить следующую команду chef:

# 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 :: строка 205 по умолчанию) произошла ошибка: Errno :: ENOENT: Нет такого файла или каталога - npm install -gq zombie должен mocha coffee-script

Вход в vagrant через vagrant sshи запуск команды вручную работает отлично. Вход в систему с правами root, sudo -iзапуск и выполнение команды завершаются неудачно по той же причине, что и рецепт шеф-повара (npm устанавливается локально только для бродячего пользователя, а не для пользователя root: это то, что я хочу).

Итак ... как я могу указать этот executeблок chef для запуска как бродячий пользователь, а не как 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без него? Это проблема?

neezer
источник

Ответы:

13

Чтобы выполнить скрипт или команду от имени пользователя, вам нужно объединить su -l и bash -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 не будет работать.

SKARAB
источник
6

Вы можете использовать environmentдля установки переменных среды HOME и USER в вашем блоке execute.

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

Я часто использую это для установки бродячих плагинов в качестве бродячего пользователя внутри моих виртуальных машин. Вы также можете установить другие переменные окружения, если это необходимо, любой командой, которую вы пытаетесь выполнить.

Михаэль Гетц
источник
Это очень чистый ответ ИМХО.
Бен
2

Похоже, что 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
narced133
источник
Просто попробовал это; без кости По-прежнему не удается с той же ошибкой в ​​посте. Любые другие предложения?
neezer
Можно попытаться указать команду непосредственно на символьную ссылку npm, а не пытаться получить правильный путь. command "/home/vagrant/.local/bin/npm install -g q zombie should mocha coffee-script
narced133
Я могу подтвердить, что «путь» ничего не делает, но указание команды непосредственно на двоичный файл делает свое дело. Это похоже на ошибку в Chef.
FRKT