git post-receiveフックでコマンドをルートとして実行する方法


12

私は最近、Upstartサービスとして実行されているWebアプリのサーバーにリモートgitリポジトリを設定しました。post-receiveフックを使用して、アプリケーションコードを更新し、upstartサービスを停止してから再起動するために必要なアクションをトリガーしたいと思います。これは私の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

ここで読んだ情報:askUbuntu.comに基づいて、ルートとして実行するupstartコマンドを取得する方法は、visudoファイルを編集することです。関連するスニペットは次のとおりです。

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

しかし、リモートにgit pushすると、次のような出力が得られます。

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

正しいユーザーが受信後スクリプトを実行していることを確認しました(上記のようにadmin)。

誰かがgit post-receive hookスクリプトでUpstartジョブを停止してから開始するのを手伝ってもらえますか?Python、PHP、またはnode.jsのJavaScriptスクリプトは、bashよりも簡単にupstartコマンドを実行できる場合も受け入れられます(私はbash初心者です)

私は私の認証ログを見て、これは私が持っているものです:

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

NOPASSWDの後、コロンは間違って見えます。また、ログを確認しましたか?「/var/log/auth.log」
エリオット・フリッシュ

回答:


6

コンマを使用して、sudoersファイル内のコマンドを区切る必要があります。現在、単一のコマンドを承認しています:/sbin/start myapp-service /sbin/stop myapp-service

書く必要がありますadmin ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service, /sbin/stop myapp-service


ヒントをありがとう。今日はこれを後で試します。それが機能する場合、上記の私自身ではなく、あなたの答えを受け入れます。
djheru

うまくいったおかげで。複数のコマンドを承認する代わりに、別のスクリプトルートを使用するつもりだと思います。
djheru 14

5

わかった。ルートとして実行したいコマンドのみを含む別のスクリプトを作成する必要がありました。

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

次に、私の受信後スクリプトで以下を実行します。

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

そして最後に私のvisudoで:

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

これが誰かの助けになることを願っています


私は確かに私はこの便利ないつか見つけることができますよ
jbo5112

1

/etc/sudoers.d/root_group行があるだけのファイルがあり%root ALL=(ALL) NOPASSWD: ALL、グループルートにアカウントを追加してsudo、パスワードなしで使用できるようにします。

ユーザーアカウントがグループ "root"に属していることを考慮しなかったファイルのアクセス許可には、セキュリティ上の影響があると確信していますが、懸念がある場合は、別のグループを使用できます。行を変更して%my_new_group ALL=(ALL) NOPASSWD: ALL、関連するアカウントをmy_new_groupに追加するだけです。


ありがとうございますが、パスワードなしで実行できるコマンドがスクリプト内のupstart stopおよびstart呼び出しのみになるように設定しようとしています。
djheru 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.