certbot-autoのバージョンが上がったらvirtualenvがないと言われて処理されなかった件

certbot-autoのバージョンが上がったらvirtualenvがないと言われて処理されなかった件

このブログを運営してるドメインはCentOS7上のdonabeneko.jpだけども、Let’s Encryptで取得した無料のSSL/TLSサーバ証明書(DV証明書)を利用して、HTTPS通信ができるようにしている。

証明書の有効期限は90日しかないので、証明書の更新を失念して失効しないように自動更新を設定する。自動更新するためにはCertbotクライアントを利用して、cronで自動実行させる(私は毎週月曜日の早朝に自動実行させている)。

自動実行時に叩くのはcertbot-autoというコマンドで、これで週1回「証明書の有効期限が残り30日を切ってるかどうかを確認」して「有効期限が近ければ証明書を更新、そうでないならスキップ」を行う。処理の結果はメールで送ってくるので、それで結果を確認できるようにする。

さて、本題。

いつものように月曜早朝に処理結果を記すメールが届いたのだけど、これまでとはまったく違う内容で慌てた。

まずは最終行に目が釘付けになってしまい、1行目をスルー。「大晦日(先週の月曜日)には動いてたのになんでや!」という状態。ともかくはvirtualenvがないと言われるので、サーバにSSHして確かめる。virtualenvはpip(Pythonのパッケージ管理ツール)でインストールできるのだけど、インストールリストを確認すると(少なくともリスト上で)存在はしている。が、コマンドとして利用しようとしたら「そんなもんはない」などと言われる。

あちこちググって調べたのだが、どうもバージョンが古かったり、複数のバージョン違いが混在していると動かなくトラブルがあるらしいことは理解する。私の場合はバージョンが古いからだろうということで、アップグレードコマンドを叩く。

virtualenvが機能するようになったと思われたので、certbot-autoをテストモードで起動。ところがエラーが山のように出てうまく動かない。いろいろと調べたのだけど、どうにもならなかったもので「あ、一度virtualenvをアンイストールして入れ直したらどうかな?」などと安直に思ったのが運の尽き。

アンイストールしようとしたvirtualenvは完全に削除されないままリスト上に残り、コマンドとしては完全に死んでしまう。

そこから数時間。pipでのインストールはキャッシュを利用するということを知り、そのキャシュがおかしかったという結論に行き着いた。そういうわけで叩いたコマンドはこれ。ついでにsetuptoolsも強制的に再インストール。

ついでなので、他のパッケージも強制再インストールした。そうして2019/01/07段階での最新版は、以下のようになった(今回関連してないやつは記述なし)。

「これでだめならどうしよう……」などと思いつつ、証明書更新のテストを行う。

上記コマンドがうまく行ったときには、すでに寝る時間もなく(ちなみに動けばよかったのでWebrootプラグインのエラーはスルー)。この段階で早朝届いたメールを見直して、「ああ、certbot-autoがアップグレードしたらvirtualenvも最新版にしないとダメだったのか」ということに気が付く。

本当にちゃんと復帰できたかどうかは、来週の月曜日まで持ち越し。そこでまたエラーが出たら大変だけど、まぁ大丈夫でしょう。ともかくは本当、焦った。今回の件でいろいろと知見を得たのでヨシとしたい。