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
Respostas:
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
.fonte
Ok, eu descobri. Eu tive que criar um script separado contendo apenas os comandos que eu queria executar como root.
Então, no meu script pós-recebimento, faça:
E finalmente no meu visudo:
Espero que isso ajude outra pessoa
fonte
Eu tenho um arquivo
/etc/sudoers.d/root_group
que apenas possui a linha%root ALL=(ALL) NOPASSWD: ALL
e adiciono contas à raiz do grupo para permitir que elas sejam usadassudo
sem 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: ALL
e adicionar as contas relevantes ao my_new_group.fonte