こいつら微妙に違う。
共通して言えるのは
「証明書の更新が必要な時に動く」こと。
--pre-hook | 更新作業前に1度だけ実行 |
--deploy-hook | 証明書ごとに実行 |
--post-hook | 更新作業後に1度だけ実行 |
たとえば証明書が複数有り……
- 両方更新が無ければ何もせずに終了する。
- 1枚だけ更新があれば pre → deploy → post の順に実行される。
- 複数更新があれば pre → 複数回 deploy → post の順に実行される。
ここで重要なのは pre と post は 1回しか実行されないことと deploy は複数回実行されること。
使い分けとしては、証明書をサービスごと (例えば httpd と postfix と dovecot) に分けるのであれば、各サービスごとに deploy で証明書のコピーとプロセスの再起動を行えば良い。
pre と post はあまり使わないかも。
無理矢理使うのであれば、証明書の更新の際にメールを送るようにしたいとき、deploy で複数メールを送ると何通もメールが届くので、
preで一時ファイルをクリア
↓
deployでRENEWED_DOMAINSやRENEWED_LINEAGEを追記モード (>>) で一時ファイルにリダイレクト
↓
postで一時ファイルをcatしてメールする
なんて方法がある。
なお、/etc/letsencrypt/renewal-hooks/ の下に pre、deploy、post ディレクトリがあるが、この中にスクリプトを入れておくとそれぞれのタイミングでそのディレクトリの中に有るスクリプトを実行してくれる。
また、オプションで --pre-hook、--deploy-hook、--post-hook により実行するスクリプトを指定出来るが、それらと /etc/letsencrypt/renewal-hooks/ の下に有る pre/deploy/post は共存可能である。
deploy では
RENEWED_DOMAINS:更新されたドメイン名の一覧 (半角スペース区切り)
RENEWED_LINEAGE:新しい証明書と暗号鍵を含む live サブディレクトリ名
の環境変数が利用可能なので有効活用しよう。
ただし
FreeBSD の certbot (py27-certbot-0.25.1,1) では変数がセットされたりされなかったりと不安定だったので、RENEWED_LINEAGE については直打ちで対処しよう。
他には CERTBOT_* なんて環境変数もあるが、ろくに使えないので使わない方がいい。
特に CERTBOT_DOMAIN は証明書のコモンネームを保持していると思いきや、証明書で SANs を使うと一番最後にオーセンティケーターで承認したドメイン名が保存されているのでコモンネームと一致しない。
コモンネームを取得したいのであれば RENEWED_LINEAGE を / で区切った一番最後の文字列を取得すると良い。
echo ${RENEWED_LINEAGE} | awk -F/ '{print $NF}'
└ G兄
└ G兄
└ G兄
└ G兄
└ G兄
└ G兄
└ G兄
└ G兄
└ 山銀
└ G兄