※こちらは旧サイトです(新サイトはこちら)
長らく買ったまま放置してたDash Buttonを何かに使おうと思って、ボタンをぽちったらSSL証明書(LetsencryptのDV証明書)の更新を行うようにしてみました
実際のところ、ただ更新するだけならBitbucketとDroneを経由する必要はありませんが、もともと手動でタグ付けを行っていた環境があったのと、いつ更新したかをgitのログで管理出来る仕組みをそのままにしたかったので、このようにしました
ハックというほどの事でもないですが、WiFi設定とMacアドレスが確認出来る所までやります
ウチの環境はMACアクセス制限をかけてたので、上記の記事を参考に、Fingアプリを使いました
pyenv経由でやったほうが後々何かと役に立つので、anyenvでpyenvを入れます
※anyenvのインストール手順はリンク先の通りなのでここでは割愛します
// pyenvを入れる
$ anyenv install pyenv
$ exec $SHELL -l
// virtualenvも使えるようにする
$ git clone https://github.com/yyuu/pyenv-virtualenv ~/.anyenv/envs/pyenv/plugins/pyenv-virtualenv
// Pythonを入れる
$ pyenv install 3.6.2
// パスなどは任意
$ cd /path/to/project
$ pyenv virtualenv 3.6.2 dash-button
こちらのライブラリを使わせてもらいます
$ pip install amazon-dash
単純なechoのみのymlを作成し、動作を確認します
$ vim amazon-dash.yml
settings:
delay: 10
devices:
xx:xx:xx:xx:xx:xx: ← Dash ButtonのMACアドレス
name: Nescafe
user: pi
cmd: echo "hoge"
// 権限はrootにする必要がある
$ sudo chown root:root amazon-dash.yml
$ sudo amazon-dash run
hoge ← Dash Buttonを押してhogeが出たらOK
(※設定ファイルをリポジトリ管理しない場合は飛ばして下さい)
letsencryptとHSTSでDockerコンテナ内にある自サイトをSSL化してみた時のメモの手順にあるように、設定ファイルはiniにしてあるので、このiniファイルのバージョン管理と同時に、このリポジトリにタグが切られたらWebサーバ側のSSL更新フラグを立てるようにします
(※設定ファイルをリポジトリ管理しない場合は、.drone.ymlの「script」の内容を、amazon-dash.ymlで実行して先に進んで下さい)
Drone自体の構築は、JenkinsからDroneに乗り換えてみた話などを参考にしてください
Droneの「Settings」にアクセスし、「Repository Hooks」の「tag」のみにチェックが入っているのを確認して保存
.drone.ymlは以下のように作成します
pipeline:
ssl-update:
host: "[certbot-autoを実行するホスト]"
username: "drone"
port: 22
image: appleboy/drone-ssh
secrets: [ ssh_key ]
script:
- "echo '1' > /var/tmp/cert-update"
- "chmod 666 /var/tmp/cert-update"
when:
event: tag
やっている事は単純で、certbot-auto
を実行するホスト側の/var/tmp/cert-update
ファイルに、「1」というフラグを立てに行っているだけです。
なので、Dashボタンが押されたら即、/var/tmp/cert-update
を更新しに行くように作成しても同じですので、
リポジトリ管理しない方はDash Button側のymlでそのように作成します
先ほど立てたフラグを検知してcertbot-auto
を実行するスクリプトをcronで回します
$ crontab -l
0 18 * * * script -a /path/to/log/ssl-`date +\%Y\%m\%d`.log -c /path/to/cron.sh
$ cat cron.sh
#!/bin/bash
STATUS=`cat /var/tmp/ssl-update`
if [[ "1" == ${STATUS} ]]; then
echo "0" > /var/tmp/ssl-update
echo "+++ Try ssh Web1 /etc/letsencrypt/ini/web1.ini Run the certbot."
ssh web1 /usr/local/bin/certbot-auto certonly --config /etc/letsencrypt/ini/web1.ini --non-interactive --agree-tos --expand
echo "+++ Try ssh Web2 /etc/letsencrypt/ini/web2.ini Run the certbot."
ssh web2 /usr/local/bin/certbot-auto certonly --config /etc/letsencrypt/ini/web2.ini --non-interactive --agree-tos --expand
echo "+++ Try ssh Web3 /etc/letsencrypt/ini/web3.ini Run the certbot."
ssh web3 /usr/local/bin/certbot-auto certonly --config /etc/letsencrypt/ini/web3.ini --non-interactive --agree-tos --expand
else
echo "/var/tmp/ssl-update is '0'. Skip for ssl-update."
fi