HalNiの雑記

備忘録を兼ねて。サーバマシンとかネットワークとか

シェルスクリプト を用いて rsync の結果を Slack に通知

はじめに

んにちは初めまして,v_7zrgu0 こと Harukaと申します.
ファイルサーバを運用する場合,ディスクの冗長化に加えてデータそのものの冗長化も重要です.メインのサーバで運用しているデータは定期的に他のマシンでも保存しておくべきです.
自動バックアップまではファイルサーバを自前で運用している人ならしていると思いますが,ログをちゃんと見ている人は多くないのではないでしょうか.
なので ログを簡単に確認できるよう,チャットツールであるSlackを用いてバックアップの結果を通知させようと思います.

今回はファイルサーバのデータを自動バックアップし,結果をSlackで通知させるところまでを解説していきます.

f:id:v_7zrgu0:20190623151919j:plain
今回設定したメイン・バックアップサーバ Broadwell-EPはまだ現役だと信じたい

環境としては,rsync・crontabをopenSUSE Leap 15.1上で動かしています

rsync Version 3.1.3
openSUSE Leap 15.1

Slack Version 3.4.2

前提条件を挙げるとキリがありませんが,とりあえずメインサーバのストレージをバックアップサーバにcifsを用いるなりしてマウントしておいてください.

f:id:v_7zrgu0:20190626142234p:plain
完成図はこんな感じ(雑)

rsyncの設定

ずはメインサーバからバックアップサーバにデータをクローンさせるためのrsyncシェルスクリプトで記述します.

引数の説明として,

--log-file : ログファイルを出力する
-a : アーカイブモード
--delete : 転送元で削除されたファイルは転送先でも削除

を指定しています.
記述例:

#!/bin/sh

sudo rsync --log-file=/home/user/Documents/log/rsync/`date +"%Y%m%d-%H%M"`.log -a --delete --progress /mnt/fsv01/ /mnt/fsv01_backup/

Slack Appの追加

にSlackの使用したいチームにIncoming WebHooksを追加します.

f:id:v_7zrgu0:20190623163519p:plain
Incoming WebHooksでは生成されたURLに投げるだけで送信できる

生成されたURLを使用します.

ログの送信設定

SlackでIncoming WebHooksの追加後,バックアップサーバからLogファイルをSlackに送信するためのスクリプトを作成します.
rsyncのログデータから最後の結果のみ出力したいので,tellコマンドでLogの末尾のみを取り出しています.

記述例:

#!/bin/sh

data=`ls -1t ~/Documents/log/rsync/*.log | head -1`
cp $data ~/Documents/notification/raw.txt
tail -n 2 ~/Documents/notification/raw.txt > ~/Documents/notification/result.txt

URL='https://hooks.slack.com/services/**************
CHANNEL=${CHANNEL:-'#random'}
BOTNAME=${BOTNAME:-'Notification'}
EMOJI=${EMOJI:-':suse_geeko:'}
HEAD=${HEAD:-"Backup report\n"}
MESSAGE='```'`cat ~/Documents/notification/result.txt`'```'

payload="payload={
    \"channel\": \"${CHANNEL}\",
    \"username\": \"${BOTNAME}\",
    \"icon_emoji\": \"${EMOJI}\",
    \"text\": \"${HEAD}${MESSAGE}\"
}"
curl -s -S -X POST --data-urlencode "${payload}" ${URL} > /dev/null

Cronへの登録

記のスクリプトをCrontabを用いて定期的に自動実行させます.
今回の設定では毎週金曜日の23時にバックアップを実行,実行結果を土曜日朝7時にSlackへ通知するようしています
rsyncは管理者権限で実行するため,スーパーユーザでcronを編集します

sudo crontab -e  

5 23 * * 5 sh /home/user/Documents/backup.sh

毎週金曜日の23時5分にシェルスクリプトを実行させます.

また,slackへの送信はユーザモードでcrontabを実行します

crontab -e  

0 7 * * 6 sh /home/user/Documents/send_log.sh

毎週土曜日の7時ちょうどにシェルスクリプトを実行させます.

結果

ェルスクリプトが実行されると自動的にSlackへ投稿されます.

f:id:v_7zrgu0:20190623161037j:plain
Slackにこんな感じで通知が来る

これでメインサーバからバックアップサーバへのrsyncが正常に行われているのか,チームメンバであれば誰でも簡単に確認できます.やったね!

もっとこれが知りたいなどがあれば,Twitterに DMやリプでも飛ばしてください.
また間違いや訂正すべきことがありましたら,教えていただけるとありがたいです.
最後まで読んでいただき,ありがとうございました.

参考文献

・atmarkit : Linux基本コマンドTips rsync
https://www.atmarkit.co.jp/ait/articles/1702/02/news031.html

・Qiita : cronの設定方法
https://qiita.com/hikouki/items/e744b3a4d356d2af12cf

・Incoming Webhooks
https://api.slack.com/incoming-webhooks

・Qiita : [10分で出来る]シェルスクリプトの結果をslackに投稿
https://qiita.com/tt2004d/items/50d79d1569c0ace118d6