べにやまぶろぐ

技術寄りの話を書くつもり

Capistrano でデプロイした後に PHP-FPM 再起動したりしたいときはコマンド限定でノーパス sudo 許可するのも悪くないかも

バージョン : Capistrano 3.2.1

タイトル長いですがそのままです。

Capistrano さんで PHP のアプリとかデプロイするのは良いんですが PHP-FPM (Fast CGI Process Manager) のキャッシュにがっつり乗っちゃって反映されないとき、えーい再起動しちゃえとか思うこと、あると思うんです。それじゃなくても Java AP だったらコンテナ再起動とか。

でもデプロイ先のユーザーってまさか root じゃないでしょうし、sudo にするとしても毎回各サーバー台数分パス手入力するのかっていうとちょっとなと思う訳です。

そんなとき見つけたのがこちら。

Automatically Restart PHP-FPM During Deployments | Steve Grunwell

まさにタイトル通りの記事で、例えば visudo コマンドで

php_app_user  ALL=(ALL) NOPASSWD: /etc/init.d/php-fpm

を追記すれば、php_app_user さんは /etc/init.d/php-fpm のみ sudo がパスレスで実行できるようになります。ノーパス sudo が許可されさえすれば Capistrano のタスク中で

execute "sudo /etc/init.d/php-fpm restart"

などとすれば OK です(要 set :pty, true)。

Ansible で構成管理してたりするときは /etc/sudoers への追記に lineinfile モジュールを使うと便利です。横着して echo '<コマンド>' >> /etc/sudoers などとしても反映されませんでした。

例えば、ただファイル末尾に追記したいだけであれば

- action: 'lineinfile dest=/etc/sudoers insertafter="EOF" line="php_app_user  ALL=(ALL) NOPASSWD: /etc/init.d/php-fpm"'

こんな感じになります。