Cómo ejecutar comandos como root en git hook post-recepción

12

Recientemente configuré un repositorio de git remoto en un servidor para una aplicación web que se ejecuta como un servicio Upstart. Me gustaría usar el enlace posterior a la recepción para activar las acciones necesarias para actualizar el código de la aplicación y detener y luego reiniciar el servicio de arranque. Este es mi archivo repo.git / hooks / post-accept:

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

Según la información que leí aquí: askUbuntu.com , la forma de ejecutar los comandos de arranque como root es editar mi archivo visudo. Aquí está el fragmento relevante:

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

Pero cuando git push al control remoto, obtengo resultados 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.

He comprobado que el usuario correcto está ejecutando el script posterior a la recepción (administrador, como se hizo eco anteriormente).

¿Alguien puede ayudarme a detener y luego iniciar el trabajo Upstart en un script de gancho post-recepción de git? Los scripts de Python, PHP o node.js javascript también serían aceptables si pudieran ejecutar el comando de arranque más fácilmente que bash (soy un novato bash)

Miré en mi registro de autenticación y esto es lo que tengo:

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
djheru
fuente
El colon se ve mal después de NOPASSWD. Además, ¿has revisado los registros? "/var/log/auth.log"
Elliott Frisch

Respuestas:

6

Necesita separar los comandos en su archivo sudoers usando comas. En este momento, estás autorizando a un solo comando: /sbin/start myapp-service /sbin/stop myapp-service.

Usted tiene que escribir admin ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service, /sbin/stop myapp-service.

usuario2313067
fuente
Gracias por el consejo. Probaré esto más tarde hoy. Si funciona, aceptaré tu respuesta, en lugar de la mía anterior.
djheru
Gracias que funcionó. Creo que todavía voy a ir con la ruta de script separada en lugar de autorizar múltiples comandos.
djheru
5

Ok, lo descubrí. Tuve que crear un script separado que contenga solo los comandos que quería ejecutar como root.

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

Luego, en mi script posterior a la recepción, haga lo siguiente:

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

Y finalmente en mi visudo:

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

Espero que esto ayude a alguien más

djheru
fuente
Estoy seguro de que esto será útil algún día
jbo5112
1

Tengo un archivo /etc/sudoers.d/root_groupque solo tiene la línea %root ALL=(ALL) NOPASSWD: ALL, y agrego cuentas a la raíz del grupo para permitirles usar sudosin contraseña.

Estoy seguro de que existen implicaciones de seguridad para los permisos de archivos que no consideraron que las cuentas de usuario estén en el grupo "raíz", pero si le preocupa, se puede usar un grupo diferente. Simplemente cambie la línea %my_new_group ALL=(ALL) NOPASSWD: ALLy agregue las cuentas relevantes a my_new_group.

jbo5112
fuente
Gracias, pero estoy tratando de configurarlo para que los únicos comandos que se pueden ejecutar sin una contraseña sean detener y comenzar llamadas en el script.
djheru