Назад | Перейти на главную страницу

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

Я пытаюсь запустить следующую команду шеф-повара:

# 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