Como executar comandos como root no gancho git post-receive

10

Recentemente, configurei um repositório do git remoto em um servidor para um aplicativo da Web executado como um serviço do Upstart. Gostaria de usar o gancho pós-recebimento para acionar ações necessárias para atualizar o código do aplicativo e parar e, em seguida, reiniciar o serviço iniciante. 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

Baseado na informação que eu li aqui: askUbuntu.com , a maneira de obter os comandos upstart para executar como root é editar meu arquivo visudo. Aqui está o snippet relevante:

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

Mas quando eu aperto o controle remoto, recebo uma 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.

Eu verifiquei se o usuário correto está executando o script de pós-recebimento (admin, conforme ecoado acima).

Alguém pode me ajudar a parar e iniciar o trabalho do Upstart em um script de gancho post-receive do git? Scripts de javascript em Python, PHP ou node.js também seriam aceitáveis se pudessem executar o comando upstart mais facilmente que o bash (sou um novato do 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
    
por djheru 25.04.2014 / 02:13

3 respostas

4

Você precisa separar os comandos em seu arquivo sudoers usando vírgulas. No momento, você está autorizando 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 .

    
por 25.04.2014 / 10:26
4

Ok, eu percebi. 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 de 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 alguém

    
por 25.04.2014 / 03:52
1

Eu tenho um arquivo em /etc/sudoers.d/root_group que tem apenas a linha %root ALL=(ALL) NOPASSWD: ALL e adiciono contas à raiz do grupo para permitir que usem sudo sem uma senha.

Tenho certeza de que há implicações de segurança para as permissões de arquivos que não consideravam as contas de usuário no grupo "root", mas, se estiver preocupado, um grupo diferente pode ser usado. Basta alterar a linha para %my_new_group ALL=(ALL) NOPASSWD: ALL e adicionar as contas relevantes a my_new_group.

    
por 25.04.2014 / 03:03