`Execute 'як бродячий користувач, а не root, з шеф-поваром?


10

Я намагаюся запустити таку команду шеф-кухаря:

# 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:

виконати [встановити q і zombiejs] (chef-redtail :: рядок за замовчуванням 205) сталася помилка: Errno :: ENOENT: Немає такого файлу чи каталогів - npm install -gq zombie should mocha coffee-script

Вхід у бродягу за допомогою 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без нього? Це питання?

Відповіді:


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

Через деякі помилки шеф-кухар не встановлює належним чином середовище для вказаного користувача у виконанні . Рішення narced133 не працюватиме.


6

Ви можете використовувати 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

Я часто використовую це для встановлення бродячих плагінів як бродячого користувача всередині моїх віртуальних машин. Ви також можете встановити інші змінні середовища, якщо це потрібно будь-якою командою, яку ви намагаєтеся виконати.


Це дуже чиста відповідь ІМХО.
Ben Liyanage

2

Здається, що шеф-кухар виконує як бродячий користувач, але не шукає ту саму ПАТ, як ваша оболонка. Вхід за допомогою vagrant sshта запустіть which npm. Це поверне щось подібне /path/to/bin/npm. Замініть /path/to/bin/нижче, щоб змусити шефа шукати відповідний каталог.

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 symlink, а не намагатися отримати шлях правильно. command "/home/vagrant/.local/bin/npm install -g q zombie should mocha coffee-script
narced133

Я можу підтвердити, що "шлях" нічого не робить, але вказівка ​​команди безпосередньо на бінарний робить трюк. Це здається помилкою в шеф-кухаря.
ФРКТ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.