`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без него? Это проблема?

Ответы:


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 не будет работать.


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

Просто попробовал это; без кости По-прежнему не удается с той же ошибкой в ​​посте. Любые другие предложения?
neezer

Можно попытаться указать команду непосредственно на символьную ссылку npm, а не пытаться получить правильный путь. command "/home/vagrant/.local/bin/npm install -g q zombie should mocha coffee-script
narced133

Я могу подтвердить, что «путь» ничего не делает, но указание команды непосредственно на двоичный файл делает свое дело. Это похоже на ошибку в Chef.
FRKT
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.