Вопрос: `execute` как бродячий пользователь, а не root, с шеф-поваром?


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

# 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 и zombiejs] (chef-redtail :: default line 205) была ошибка: Errno :: ENOENT: Нет такого файла или каталога - npm install -g q zombie должен 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 без этого? Это проблема?


10
2018-06-27 23:34


Источник




Ответы:


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


13
2017-09-28 11:41





Вы можете использовать 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

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


6
2018-05-21 19:35



Это очень чистый ответ ИМХО. - Ben Liyanage


Похоже, что шеф-повар выполняет роль бродячего пользователя, но не ищет ту же самую PATH, что и ваша оболочка. Вход в систему 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

2
2018-06-28 00:38



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