Я пишу поваренную книгу шеф-повара для установки 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. Ниже вы найдете выполнение chef-client. Заранее спасибо.
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.источник
Взято из комментария в CHEF-2288 :
environment ({ 'HOME' => ::Dir.home('USERNAME'), 'USER' => 'USERNAME' })
Работал на меня!
В твоем случае:
environment ({ 'HOME' => ::Dir.home(hubot_user), 'USER' => hubot_user })
источник
hubot_user
он уже был создан до запуска chef-client. Это потому, чтоDir.home
команда запускается при загрузке файла, а не при выполнении рецепта. При создании новой машины это, скорее всего, произойдет до запуска любого из ваших пользовательских рецептов создания и приведет к сбою.После: /server//a/432916/129232
Чтобы выполнить скрипт или команду от имени пользователя, вам нужно объединить su -l и bash -i , например:
Из-за некоторых ошибок chef неправильно устанавливает среду для указанного пользователя при выполнении .
источник