drone.ioのssh deploy scriptが失敗する。

投稿者: Anonymous

下記サイトを参考にして、deploy scriptを書きましたが下記エラーにより失敗してしまいます。
http://docs.drone.io/ssh.html

deploy script

sudo rm -rf /var/www/html/[project-name]
sudo mkdir /var/www/html/[project-name]
sudo cp -pr /home/[user-name]/temp/* /var/www/html/[project-name]

エラー

sudo: no tty present and no askpass program specified
sudo: no tty present and no askpass program specified
sudo: no tty present and no askpass program specified
exit status 1

sudoを取るとpermission deniedが出てしまいます。これはおそらく/var/ディレクトリのアクセス権限のせいですが。
本当は、例のようにデプロイする前にnginxをstopしたいのですが、下記のようにrootで起動しているようでできません。

root       517  0.0  0.2  15096  2276 ?        Ss   21:36   0:00 nginx: master process nginx

この場合はどのように書けばいいのでしょうか。またなぜ例ではsudoが記入されていないのでしょうか。

追記
OSはDebianです

解決

sudo: no tty present and no askpass program specified

これは sudo がパスワードを要求しようとしたが、端末(tty)が利用できず、他のパスワード入力手段も設定されていない、というエラーです。今回の場合いずれにせよその場でパスワードを入力することはできないでしょうから、パスワードなしで sudo を実行できるよう設定することで回避するぐらいでしょうか。

もしこの方法を採るのであれば、一連の処理をまとめたスクリプトを書いた上で、SSH に使うユーザーかつそのスクリプトのみをパスワードなしで実行できるようにするとより安全です。

nginx は init スクリプトで起動したのだろうと思います。この場合 service stop nginx service start nginx などとして操作できると思いますが、これも root 権限が必要です。

そしてご想像の通り、drone.io から ssh させるユーザーに適切なアクセス権が与えられていれば、sudo は不要になります。サンプルスクリプトで sudo が使われていないのもそのためでしょう。

まとめると、

  • デプロイ先のパーミッションを適切に設定し、手動で nginx を起動停止するようにする
    → sudo 不要。drone.io のドキュメント通りで動くはず
  • パーミッションそのまま or 現状通り nginx の起動を init に任せる
    → sudo が必要なので、NOPASSWD の設定を行う

のどちらかになるかと思います。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *