So führen Sie Befehle als root im Git-Post-Receive-Hook aus

12

Ich habe kürzlich ein Remote-Git-Repo auf einem Server für eine Web-App eingerichtet, die als Upstart-Dienst ausgeführt wird. Ich möchte den Post-Receive-Hook verwenden, um Aktionen auszulösen, die erforderlich sind, um den Anwendungscode zu aktualisieren und den Upstart-Dienst zu stoppen und dann neu zu starten. Dies ist meine Datei 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

Basierend auf den Informationen, die ich hier gelesen habe: askUbuntu.com , besteht die Möglichkeit, die Upstart-Befehle als Root auszuführen, darin, meine Visudo-Datei zu bearbeiten. Hier ist das relevante Snippet:

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

Aber wenn ich auf die Fernbedienung drücke, bekomme ich folgende Ausgabe:

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

Ich habe überprüft, ob der richtige Benutzer das Post-Receive-Skript ausführt (admin, wie oben wiederholt).

Kann mir jemand helfen, den Upstart-Job in einem Git-Post-Receive-Hook-Skript zu stoppen und dann zu starten? Python-, PHP- oder node.js-Javascript-Skripte wären auch akzeptabel, wenn sie den Befehl upstart einfacher ausführen könnten als bash (ich bin ein Bash-Neuling).

Ich habe in meinem Authentifizierungsprotokoll nachgesehen und Folgendes habe ich:

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
quelle
Der Doppelpunkt sieht nach NOPASSWD falsch aus. Haben Sie auch die Protokolle überprüft? "/var/log/auth.log"
Elliott Frisch

Antworten:

6

Sie müssen die Befehle in Ihrer sudoers-Datei durch Kommas trennen. Im Moment autorisieren Sie einen einzelnen Befehl : /sbin/start myapp-service /sbin/stop myapp-service.

Du musst schreiben admin ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service, /sbin/stop myapp-service.

user2313067
quelle
Danke für den Tipp. Ich werde es später heute versuchen. Wenn es funktioniert, akzeptiere ich Ihre Antwort und nicht meine eigene oben.
Djheru
Danke, das hat funktioniert. Ich denke, ich werde immer noch die separate Skriptroute verwenden, anstatt mehrere Befehle zu autorisieren.
Djheru
5

Ok, ich habe es herausgefunden. Ich musste ein separates Skript erstellen, das nur die Befehle enthielt, die ich als root ausführen wollte.

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

Dann mache ich in meinem Post-Receive-Skript:

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

Und schließlich in meinem Visudo:

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

Hoffe das hilft jemand anderem

djheru
quelle
Ich bin sicher, ich werde dies eines Tages nützlich finden
jbo5112
1

Ich habe eine Datei /etc/sudoers.d/root_group, die nur die Zeile enthält %root ALL=(ALL) NOPASSWD: ALL, und ich füge dem Gruppenstamm Konten hinzu, damit sie sudoohne Kennwort verwendet werden können.

Ich bin sicher, dass es Sicherheitsauswirkungen für Dateiberechtigungen gibt, bei denen Benutzerkonten nicht in der Gruppe "root" berücksichtigt wurden. Wenn Sie jedoch Bedenken haben, kann eine andere Gruppe verwendet werden. Ändern Sie einfach die Zeile in %my_new_group ALL=(ALL) NOPASSWD: ALLund fügen Sie die entsprechenden Konten zu my_new_group hinzu.

jbo5112
quelle
Vielen Dank, aber ich versuche, es so einzurichten, dass die einzigen Befehle, die ohne Kennwort ausgeführt werden können, die Upstart-Stopp- und Startaufrufe im Skript sind.
Djheru