Estou escrevendo um livro de receitas do Chef para instalar o Hubot . Na receita, faço o seguinte:
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
No entanto, quando tento executar o chef-client no servidor que está instalando o livro de receitas, recebo uma permissão negada para gravar no diretório do usuário que executa o chef-client, não no usuário do hubot. Por algum motivo, npm
está tentando executar com o usuário errado, não com o usuário especificado no recurso bash.
Eu sou capaz de executar sudo su - hubot -c "npm install /usr/local/hubot/hubot"
manualmente, e isso obtém o resultado desejado (instala o hubot como usuário do hubot). No entanto, parece que o chef-client não está executando o comando como usuário do hubot. Abaixo, você encontrará a execução do chef-cliente. Agradeço antecipadamente.
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 [email protected] 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
Respostas:
O problema (provavelmente) não é o Chef executando o comando como o usuário errado, mas o shell executando o script não é um shell de logon. Isso significa que algumas variáveis de ambiente (como HOME) não serão definidas da maneira esperada, levando o npm a tentar gravar arquivos no lugar errado.
O problema é discutido na edição CHEF-2288 . Embora isso permaneça excelente, você pode tentar adicionar
HOME=/home/hubot-user
seu bloco de código antes que o npm seja chamado.fonte
Retirado de um comentário no CHEF-2288 :
environment ({ 'HOME' => ::Dir.home('USERNAME'), 'USER' => 'USERNAME' })
Trabalhou para mim!
No seu caso:
environment ({ 'HOME' => ::Dir.home(hubot_user), 'USER' => hubot_user })
fonte
hubot_user
já foi criado antes da execução do chef-cliente. Isso ocorre porque oDir.home
comando é executado quando o arquivo é carregado, não quando a receita é executada. Ao criar uma nova máquina, isso provavelmente ocorrerá antes da execução de qualquer receita de criação de usuário e resultará em falha.Depois: /server//a/432916/129232
Para executar um script ou comando como usuário, você precisa combinar su -l e bash -i , por exemplo:
Devido a alguns erros , o chef não define adequadamente o ambiente para o usuário especificado em execução .
fonte