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
Respuestas:
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
.fuente
Ok, lo descubrí. Tuve que crear un script separado que contenga solo los comandos que quería ejecutar como root.
Luego, en mi script posterior a la recepción, haga lo siguiente:
Y finalmente en mi visudo:
Espero que esto ayude a alguien más
fuente
Tengo un archivo
/etc/sudoers.d/root_group
que solo tiene la línea%root ALL=(ALL) NOPASSWD: ALL
, y agrego cuentas a la raíz del grupo para permitirles usarsudo
sin 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: ALL
y agregue las cuentas relevantes a my_new_group.fuente