Como executar comandos como root no gancho pós-recebimento do git


12

Recentemente, configurei um repositório Git remoto em um servidor para um aplicativo Web em execução como um serviço Upstart. Eu gostaria de usar o gancho pós-recebimento para acionar ações necessárias para atualizar o código do aplicativo e parar e reiniciar o serviço inicial. Este é o meu arquivo repo.git / hooks / post-receive:

#!/bin/bash
export GIT_WORK_TREE=/var/www/current/myapp/
echo "Checking out new files and restarting app"
echo $USER
git checkout -f
sudo /sbin/stop myapp-service
sudo /sbin/start myapp-service

Com base nas informações que li aqui: askUbuntu.com , a maneira de obter os comandos iniciados para executar como root é editar meu arquivo visudo. Aqui está o trecho relevante:

%sudo   ALL=(ALL:ALL) ALL
admin   ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service /sbin/stop myapp-service

Mas quando eu git push para o controle remoto, recebo saída como:

$ git commit -am "test" && git push prod master
[master 59ffccd] test
 1 file changed, 1 insertion(+), 1 deletion(-)
Counting objects: 11, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 544 bytes, done.
Total 6 (delta 4), reused 0 (delta 0)
remote: Checking out new files on production and restarting app
remote: admin
remote: 
remote: sudo: no tty present and no askpass program specified
remote: Sorry, try again.

Verifiquei se o usuário correto está executando o script pós-recebimento (admin, como ecoado acima).

Alguém pode me ajudar a parar e iniciar o trabalho Upstart em um script de gancho pós-recebimento do git? Os scripts javascript em Python, PHP ou node.js também seriam aceitáveis ​​se eles pudessem executar o comando upstart mais facilmente do que o bash (eu sou um novato no bash)

Eu olhei no meu log de autenticação e é isso que eu tenho:

Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): auth could not identify password for [admin]
Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): conversation failed
Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): auth could not identify password for [admin]
Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): conversation failed
Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): auth could not identify password for [admin]
Apr 24 19:35:21 myhost01 sudo:    admin : 3 incorrect password attempts ; TTY=unknown ; PWD=/home/admin/myapp.git ; USER=root ; COMMAND=/s$
Apr 24 19:35:21 myhost01 sudo: unable to execute /usr/sbin/sendmail: No such file or directory
Apr 24 19:35:21  myhost01 sudo: pam_unix(sudo:auth): conversation failed

O cólon parece errado após o NOPASSWD. Além disso, você verificou os logs? "/var/log/auth.log"
Elliott Frisch

Respostas:


6

Você precisa separar os comandos no arquivo sudoers usando vírgulas. Neste momento, está a autorizar um único comando: /sbin/start myapp-service /sbin/stop myapp-service.

Você precisa escrever admin ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service, /sbin/stop myapp-service.


Obrigado pela dica. Vou tentar isso hoje mais tarde. Se funcionar, aceitarei sua resposta, e não a minha acima.
djheru

Graças que funcionou. Acho que ainda vou seguir a rota de script separada, em vez de autorizar vários comandos.
djheru

5

Ok, eu descobri. Eu tive que criar um script separado contendo apenas os comandos que eu queria executar como root.

#!/bin/bash
sudo /sbin/stop myapp-service
sudo /sbin/start myapp-service

Então, no meu script pós-recebimento, faça:

#!/bin/bash
export GIT_WORK_TREE=/var/www/current/myapp/
set -x
echo "Checking out new files on production and restarting app"
echo $USER
git checkout -f
sudo /home/admin/restart-myapp

E finalmente no meu visudo:

%sudo   ALL=(ALL:ALL) ALL
admin   ALL=(ALL) NOPASSWD: /home/admin/restart-myapp

Espero que isso ajude outra pessoa


Eu tenho certeza que vou encontrar este um dia útil
jbo5112

1

Eu tenho um arquivo /etc/sudoers.d/root_groupque apenas possui a linha %root ALL=(ALL) NOPASSWD: ALLe adiciono contas à raiz do grupo para permitir que elas sejam usadas sudosem uma senha.

Tenho certeza de que há implicações de segurança nas permissões de arquivo que não consideram as contas de usuário no grupo "raiz", mas se você estiver preocupado, um grupo diferente pode ser usado. Basta alterar a linha %my_new_group ALL=(ALL) NOPASSWD: ALLe adicionar as contas relevantes ao my_new_group.


Obrigado, mas estou tentando configurá-lo para que os únicos comandos que possam ser executados sem uma senha sejam a parada inicial e inicie as chamadas no script.
djheru
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.