こんにちは!ぬぁるです。
僕はこのブログでSSL対応していますが、証明書を自動更新するようにcronに仕込んでいました。
ですがこの自動更新が結構な期間上手くいっておらず、手動で更新する羽目になってました。
めんどくさくて放置していましたが、最近になって調べて原因が判明しましたので、メモしておきたいと思います。
この記事をご覧になっている方の中にも同じ悩みで困っている方にとって少しでも参考になりましたら幸いです。
前提
- Let’s Encryptで証明書を発行している
- サーバーはGCP
- 一般ユーザーのcrontabに以下のように記載
* */10 * * sudo certbot renew
* */10 * * sudo /opt/bitnami/ctlscript.sh restart apache
原因
一般ユーザーでsudoを実行する設定がされていなかった
解決方法
rootのcrontabに書いた(これだけ!)
調べた流れ
面倒ですがlsとかでcronを実行しまくりました。
そうしたら、どうやらcronの中でsudo が動作していないことがわかりました。
エラーログを吐かせてみると、「no tty present and no askpass program specified.」のようなメッセージが表示されました。
日本語では、「端末 (tty) が存在せず、パスワードを尋ねる (askpass) プログラムが指定されていません」のように表示されるようです。
これ全然意味わからんかったのですが、調べてみた自分の解釈としては、
「ターミナルが表示されてない状態だとセキュリティ上危ないからsudoできません」
と設定されているのかな?って感じです。
試しにsudo ls -l >2 [標準エラー出力先ファイル]
みたいなshファイルを作って、それを普通にターミナルから実行してみると問題なく実行できました。
一方でcrontabに上記スクリプトと同様の内容を書いて実行してみると、
やはり「no tty present and no askpass program specified.」というメッセージが表示されました。
cronでsudo を実行するためには
「/etc/sudoers を編集して、端末(TTY)なし・パスワード無しで sudo を実行できるようにする」
設定が必要なようです。
これが僕の環境では設定されていなかったので、sudoが実行されず、
結果として自動更新が動いていなかったというわけです。
上述したように、「/etc/sudoers を編集して、端末(TTY)なし・パスワード無しで sudo を実行できるようにする」
設定をすればいいのですが、root権限で実行する必要のあるものはrootのcrontabに書くほうが自然だとも思いまして、
かつこちらのほうが簡単なので僕はこっちで対応しました。
おわりに
すごく悩まされましたが、やっぱり解決できると清々しい気持ちになれますね〜。