Come eseguire i comandi come root in git hook post-ricezione


12

Di recente ho configurato un repository git remoto su un server per un'app Web in esecuzione come servizio Upstart. Vorrei utilizzare l'hook post-ricezione per attivare le azioni necessarie per aggiornare il codice dell'applicazione e interrompere, quindi riavviare il servizio di avvio. Questo è il mio repo.git / hooks / file post-ricezione:

#!/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

Sulla base delle informazioni che ho letto qui: askUbuntu.com , il modo per ottenere i comandi upstart da eseguire come root è modificare il mio file visudo. Ecco il frammento pertinente:

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

Ma quando spingo sul telecomando, ottengo un output come:

$ 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.

Ho verificato che l'utente corretto stia eseguendo lo script post-ricezione (admin, come indicato sopra).

Qualcuno può aiutarmi a interrompere e quindi avviare il processo Upstart in uno script hook post-ricezione git? Gli script javascript Python, PHP o node.js sarebbero anche accettabili se fossero in grado di eseguire il comando upstart più facilmente di bash (sono un principiante bash)

Ho guardato nel mio registro di autenticazione e questo è quello che ho:

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

I due punti sembrano sbagliati dopo NOPASSWD. Inoltre, hai controllato i registri? "/var/log/auth.log"
Elliott Frisch

Risposte:


6

Devi separare i comandi nel tuo file sudoers usando le virgole. In questo momento, si sta autorizzando un singolo comando: /sbin/start myapp-service /sbin/stop myapp-service.

Hai bisogno di scrivere admin ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service, /sbin/stop myapp-service.


Grazie per il consiglio. Ci proverò più tardi oggi. Se funziona, accetterò la tua risposta, piuttosto che la mia sopra.
djheru,

Grazie ha funzionato. Penso che continuerò a seguire una route di script separata invece di autorizzare più comandi.
djheru,

5

Ok, l'ho capito. Ho dovuto creare uno script separato contenente solo i comandi che volevo eseguire come root.

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

Quindi, nel mio script post-ricezione:

#!/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 infine nel mio visudo:

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

Spero che questo aiuti qualcun altro


Sono sicuro che un giorno lo troverò utile
jbo5112,

1

Ho un file /etc/sudoers.d/root_groupche ha solo la linea %root ALL=(ALL) NOPASSWD: ALLe aggiungo account alla radice del gruppo per consentirne l'uso sudosenza una password.

Sono sicuro che ci sono implicazioni di sicurezza per le autorizzazioni dei file che non hanno considerato gli account utente nel gruppo "root", ma se sei preoccupato, puoi usare un gruppo diverso. Basta cambiare la riga %my_new_group ALL=(ALL) NOPASSWD: ALLe aggiungere gli account pertinenti a my_new_group.


Grazie, ma sto provando a configurarlo in modo che gli unici comandi che possono essere eseguiti senza password siano l'arresto iniziale e l'avvio delle chiamate nello script.
Djheru,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.