O recurso bash do chef não está sendo executado como usuário especificado

11

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, npmestá 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
Arthur Maltson
fonte
Espere, você está dizendo que está executando o chef-client como um usuário não root?
Cjc 23/01/12
É um usuário que possui direitos sudo. É o mesmo que eu usei para inicializar o nó.
Arthur Maltson
Mas você está fazendo "sudo chef-client", certo?
Cjc
Você provavelmente deveria estar executando o chef como root.
9788 Mike Fiedler
O Chef está sendo executado como usuário root.
Arthur Maltson

Respostas:

8

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-userseu bloco de código antes que o npm seja chamado.

zts
fonte
4

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 })

claptimes
fonte
2
Isso pressupõe que o hubot_userjá foi criado antes da execução do chef-cliente. Isso ocorre porque o Dir.homecomando é 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.
Russ Bradberry 27/05
Para a pergunta feita, esta resposta funciona perfeitamente.
veja
1
não na primeira inicialização da máquina, isso não acontece. só funciona se o usuário já existir na máquina.
22426 Russ Russberry
Em segundo lugar, isso não é uma solução se o chef também estiver gerenciando o usuário em questão, porque esse código é executado na fase de compilação, antes de qualquer execução da receita. existem hacks maiores em torno dele, possivelmente para empurrá-lo para o segundo estágio, mas ...... fazer 'HOME' => "/ home / # {hubut_user}" funcionará, pois é apenas uma passagem de string - mas é claro que não toque mágico.
afiado
1

Depois: /server//a/432916/129232

Para executar um script ou comando como usuário, você precisa combinar su -l e bash -i , por exemplo:

 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

Devido a alguns erros , o chef não define adequadamente o ambiente para o usuário especificado em execução .

Skarab
fonte