Ubuntu16.04LTSでcronからのletsencryptがたまにエラーを出す件

やったのはほとんど僕ではなくY.H氏なのだけど、同じことでハマる人もいるだろうし、文章化しておきます。

Ubuntu16.04LTS(x86_64)の環境で、Apache(apache2)を使い、Let’s EncryptのSSL証明書を取得して、HTTPSを実現しています。

Let’s Encryptの証明書の期限は短いので、更新処理はcronで日次でやることにしています。

rootのcrontabはこんな感じです(mm,hhには適当な時間を指定します)。

mm hh * * * /usr/bin/letsencrypt –text –apache renew 2>&1 >/dev/null

ところが、毎日ではないのだけど、エラーが出るのですよね。

2018-10-28 10:10:01,111:WARNING:letsencrypt.cli:Attempting to renew cert from XXX produced an unexpected error: The apache plugin is not working; there may be problems with your existing configuration.The error was: NoInstallationError(). Skipping.
1 renew failure(s), 0 parse failure(s)
そういう時に、rootで同じコマンドを実行したら、何事もなく終了します。

#  /usr/bin/letsencrypt –text –apache renew
letsencryptが適切にログを吐いてくれれば、ズバリな原因が特定できると思いますが、そこまで具合は良くないようです。–verboseというオプションはあるようで、いくらか詳しくは出ます。

個人的にはライブラリのパスかなにかの違いかなあ、と思っていましたが、どうもPATHがダメみたいですね。まあcronのソースはありますし、見てみました。

まずpathnames.hに以下のように定義されています。

#ifndef _PATH_DEFPATH
# define _PATH_DEFPATH “/usr/bin:/bin”
#endif
そして、cron.cのmainのわりと最初の方に、こんな感じで書いています。
#if defined(POSIX)
setenv(“PATH”, _PATH_DEFPATH, 1);
#endif
makeするときに-DPOSIXと渡していますので、たぶんこれでPATHが設定されてるんですね。これ以上追いかけていないので、さらに更新されてたらすみません。

そういうわけで、とりあえずcronのPATHは”/usr/bin:/bin”みたいです。なぜこういう縛りがあるのでしょう、よく分からないです。

おそらくそんなPATHなので、apachectlか何かを呼ぶのに失敗しているのでは、という推測をされていました。apachectlは/usr/sbinにありますし。要はそこにPATHを通してあげたら良いのでしょう。方法はいくつかありそうですが、crontabの冒頭に書けばいいそうです。それは知らなかった。

というわけでcrontabを以下のようにしておけば良いのです。この件だと/sbinは要らないかも。

PATH=/sbin:/bin:/usr/sbin:/usr/bin
mm hh * * * /usr/bin/letsencrypt –text –apache renew 2>&1 >/dev/null

こんな感じにしておくと、エラーが出ずに動くようになりました。色々と勉強になりました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です