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

Ресурс Chef bash не выполняется от имени указанного пользователя

Я пишу поваренную книгу Chef для установки Hubot. В рецепте я делаю следующее:

bash "install hubot" do
  user hubot_user
  group hubot_group
  cwd install_dir
  code <<-EOH
    wget https://github.com/downloads/github/hubot/hubot-#{node['hubot']['version']}.tar.gz && \
    tar xzvf hubot-#{node['hubot']['version']}.tar.gz && \
    cd hubot && \
    npm install
  EOH
end

Однако, когда я пытаюсь запустить chef-client на сервере, на котором установлена ​​кулинарная книга, я получаю разрешение на запись в каталог пользователя, который запускает chef-client, а не пользователя hubot. По какой-то причине npm пытается работать под неправильным пользователем, а не под пользователем, указанным в ресурсе bash.

Я могу бежать sudo su - hubot -c "npm install /usr/local/hubot/hubot" вручную, и это дает желаемый результат (устанавливает hubot в качестве пользователя hubot). Однако похоже, что chef-client не выполняет команду как пользователь hubot. Ниже вы найдете исполнение шеф-клиента. Заранее спасибо.

Saving to: `hubot-2.1.0.tar.gz'

     0K ......                                                100%  563K=0.01s

2012-01-23 12:32:55 (563 KB/s) - `hubot-2.1.0.tar.gz' saved [7115/7115]

npm ERR! Could not create /home/<user-chef-client-uses>/.npm/log/1.2.0/package.tgz
npm ERR! Failed creating the tarball.
npm ERR! couldn't pack /tmp/npm-1327339976597/1327339976597-0.13104878342710435/contents/package to /home/<user-chef-client-uses>/.npm/log/1.2.0/package.tgz
npm ERR! error installing hubot@2.1.0 Error: EACCES, permission denied '/home/<user-chef-client-uses>/.npm/log'

...

npm not ok
---- End output of "bash"  "/tmp/chef-script20120123-25024-u9nps2-0" ----
Ran "bash"  "/tmp/chef-script20120123-25024-u9nps2-0" returned 1

Проблема (вероятно) не в том, что Chef запускает команду от имени неправильного пользователя, а в том, что оболочка, запускающая ваш сценарий, не является оболочкой входа в систему. Это означает, что некоторые переменные среды (например, HOME) не будут установлены так, как вы ожидаете, что заставит npm попытаться записать файлы в неправильное место.

Проблема обсуждается в выпуск CHEF-2288. Пока это еще не решено, вы можете попробовать добавить HOME=/home/hubot-user в вашем блоке кода до вызова npm.

Взято из комментария в ПОВАР-2288:

environment ({ 'HOME' => ::Dir.home('USERNAME'), 'USER' => 'USERNAME' })

Сработало у меня!

В твоем случае:

environment ({ 'HOME' => ::Dir.home(hubot_user), 'USER' => hubot_user })

После: https://serverfault.com/a/432916/129232

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