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
Antworten:
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
.quelle
Ok, ich habe es herausgefunden. Ich musste ein separates Skript erstellen, das nur die Befehle enthielt, die ich als root ausführen wollte.
Dann mache ich in meinem Post-Receive-Skript:
Und schließlich in meinem Visudo:
Hoffe das hilft jemand anderem
quelle
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 siesudo
ohne 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: ALL
und fügen Sie die entsprechenden Konten zu my_new_group hinzu.quelle