問題点
Capistranoを使ってRailsアプリケーションをデプロイしていたところ、
カスタムで作成したApache再起動タスクでエラーが起きた。
** Execute deploy:restart
01 sudo systemctl restart apache2
01 sudo
01 :
01 a terminal is required to read the password; either use the -S option to read from standard input or configur...
01
cap aborted!
おぉん…。
調べた結果、ptyをtrueにする必要があるとのことで、それを試してみる。
# Default value for :pty is false
set :pty, true
再度、自動デプロイを実行。
** Execute deploy:restart
00:00 deploy:restart
01 sudo systemctl restart apache2
01 [sudo]password for username:
passw.. # パスワードが丸見え…
おぉん…パスワード丸見えやね。
しかも正しいパスワードを入れてEnterを押下してもその後反応なし。
解決法
sshkit-sudoというGemのお力を借りしました。
とりあえずGemfileを記述して、bundle install
も忘れずに。
gem 'sshkit-sudo'
Capfileにsshkit/sudo
を追加。
require 'sshkit/sudo'
そして従来はexecute :sudo
としていたところを、以下のようにexecute! :sudo
とします。
- execute :sudo, 'systemctl restart apache2'
+ execute! :sudo, 'systemctl restart apache2'
ついでにptyはいらないっぽいので、再度コメントアウトしておきます。
# Default value for :pty is false
# set :pty, true
ここまで設定したら、Capistranoで自動デプロイを実行します。
** Execute deploy:restart
00:00 deploy:restart
01 sudo systemctl restart apache2
01 [sudo]password for username:
# パスワードを入力...
✔︎ 01 username@host 0.030s
** Invoke...
対話的にパスワードを入力し、無事にapache再起動タスクが完了しました。
余談
前回の記事でご紹介しましたが、Capistranoは非対話型・非ログインシェルを割り当てています。
公式のREADMEにも、「sudoを使わない方がスムーズに自動デプロイできるよ」という趣旨の記述があり、やんわりとsudoの使用が非推奨になっています。
今回はGemの力をお借りして実装しましたが、できればsudoを使わない方が公式に則った安全策と言えそうです。sudoを使わない、あるいは使ったとしても対話しないような方法についても、今後調査してみたいと思います。