Slack
centos7
Slackboard
letsencrypt

Let's Encryptで自動更新したらSlackに通知したかった

More than 3 years have passed since last update.

Let's Encryptの証明書は有効期限が3か月で切れちゃうので、折を見て更新しなければなりません。

都度、ちゃんと思い出して更新作業をすればいいのですが、人は忘れてしまうものです。僕は忘れます。

というわけで、ほっといても月一くらいで勝手に更新していてほしいです。ついでに更新したら更新したよって通知だけでもSlackに送ってほしいです。

Slackへの送信部分は、Slackboard (https://github.com/cubicdaiya/slackboard)を使用させていただきました。

Slackboardについては以下の記事を参照。

ちなみに環境は以下の通りです。


  • CentOS 7.2

  • Slackboard 0.6.2

  • golang 1.5.3

  • Nginx 1.9.9

SlackへPostするIncoming-WebHookは事前に準備しているものとします。


Slackboardの導入


…その前にGo言語

何はともあれSlackへ通知する用にSlackboardを導入しなければなりません。しかしこれGo言語で作られているので、Slackboardに先立ってまずGo言語を使えるようにする必要があります。


console

# wget https://storage.googleapis.com/golang/go1.5.3.linux-amd64.tar.gz

# tar -C /usr/local -xzf go1.5.3.linux-amd64.tar.gz
# export PATH=$PATH:/usr/local/go/bin

/usr/local/go配下に実行ファイルその他が解凍されます。


そしてSlackboard

go getというコマンドが割と便利で、GitHubからcloneしてさらにはビルドまでしてくれます。


console

# mkdir /usr/local/slackboard

# cd /usr/local/slackboard
# export GOPATH=`pwd`
# go get -u github.com/cubicdaiya/slackboard/...

すると、/usr/local/slackboard/binの中にCLIやサーバプログラムが出来上がります。

続いて設定ファイルを作成します。iniに似ていますが、TOMLという形式だそうです。

slack_urlにはSlack側で設定したWebHookのURLを指定します。channelusernameは適宜変更してください。


/usr/local/slackboard/bin/slackboard.toml

[core]

port = "29800"
slack_url = "https://hooks.slack.com/services/....."

[[tags]]
tag = "letsencrypt"
channel = "#general"
username = "Let's Encrypt"


コマンドラインでサーバを起動することは当然可能ですが、どうせならやっぱりサービス化したいですね。したいです。


/usr/lib/systemd/system/slackboard.service

[Unit]

Description=Slackboard/Slack Proxy Server
After=network.target

[Service]
ExecStart=/usr/local/slackboard/bin/slackboard -c /usr/local/slackboard/bin/slackboard.toml

[Install]
WantedBy=multi-user.target


ユニットファイルが書けたら、サービスを有効化し、起動します。


console

# systemctl enable slackboard

# systemctl start slackboard


自動更新させる

Let's Encryptのサイトにはcronで毎月行わせるサンプルが載っていましたので、それに従います。ただし、毎月1日とかみんなやりそうなので、ここは他に譲って20日とかにします。


更新用スクリプト

まずは、更新して結果をSlackboard経由で通知するスクリプトを作成します。ここではwebrootプラグインを使用します。


letsencrypt-update.sh

#!/bin/bash

SLACKBOARD=/usr/local/slackboard/bin/slackboard-cli

if ! /path/to/letsencrypt-auto certonly --renew-by-default --webroot -w /var/www/html -d example.com ; then
# NG
echo "Let's Encrypt certificates auto renewal failed." | $SLACKBOARD -t letsencrypt -s localhost:29800 -l crit 1>/dev/null 2>/dev/null
exit 1
else
# OK
systemctl reload nginx
echo "Let's Encrypt certificates auto renewal succeeded." | $SLACKBOARD -t letsencrypt -s localhost:29800 -l info 1>/dev/null 2>/dev/null
exit 0
fi



crontabに追加

毎月20日、朝5時に更新用のスクリプトを走らせるようにします。


console

# crontab -e



crontab

0 5 20 * * /path/to/letsencrypt-update.sh


失敗時にだけ通知したり、新しい有効期限を通知内容に含めたり、文言等はいい感じに調整するのもよいでしょう。Let's EncryptのAPIや他のクライアントを使うともっと柔軟な通知や更新ができるかもしれませんね。