logwatchの内容を自動でslackに通知する方法

    皆さん初めまして、ひろーちか(@hir0_chika)と申します。

    「logwatch」は毎日メールでログを通知してくれるので非常に便利ですよね。

    しかし、基本的に一度見たら終わり(エラーなどのログがなければ)なのでメールボックスにどんどんメールが溜まっていってしまいます。

    毎日メールを消すのも面倒なので、今回はlogwatchの内容をメールではなくslackに飛ばすようにしてみたいと思います。

    この記事の内容はCentOS 7.2/Logwatch 7.4.0という環境でテストしています。

    その他の環境では動くとは限りませんのでご了承下さい。

    スポンサーリンク

    slack通知用のスクリプトを準備する

    #はじめに (便利ですよね。仕事柄、何かを監視しつつチャットで話すということをよくおこなっているので、監視の結果を別画面ではなくてslackで表示できたら便利だよねという話になり...

    今回はQiitaから、tt2004dさんの投稿している記事を参考にさせて頂きます。

    1. まず上記URLの通り、SlackのIncoming WebHooksに登録してURLを拾ってきます。

    (https://hooks.slack.com/services/~から始まるURLです)

    2. お好きなディレクトリに、上記リンクにあるスクリプトをコピーして保存します。

    今回は/rootに、「slack_report.sh」という名前で保存してみます。

    スクリプト内でWebHook URL送信チャンネルを指定して保存します。

    あとは送信したいメッセージをechoして、パイプでスクリプトを叩けばslackに通知されます。

    [結果]

    slack-sample

    ※もし、スクリプトを叩いた際に「mktemp: テンプレート `webhooks’ に含まれている X の数が少なすぎます」といった内容のエラーが出る場合は、

    これを

    このように変更してみるとエラーが止まるハズです。本来、mktempでテンプレートを指定する場合、最後の構成部分に少なくとも 3 個の連続する ‘X’ が含まれている必要があるそうです。

    また、スクリプト内の送信チャンネルを「#general」→「@自分のslackアカウント」に変えることで、チャンネルだけでなく個人チャットにも通知できるようになります。

    ちなみに、上記の画像では送信名を「mybot」→「daily_logwatch」、アイコンを「ghost」→「skull」に変更しています。

    logwatch用のトリガースクリプトを準備する

    上記のスクリプトで、任意の文字列をslackに通知する処理はできるようになりましたが、logwatchの内容をslackに通知する処理はできていないのでそれを作ります。

    同じディレクトリに、「slack-daily_logwatch_report.sh」という名前でスクリプトを作ります。

    中身はこんな感じにします↓

    めちゃめちゃシンプル(笑)

    logwatchコマンドを呼んで、その結果をslack_report.shに流しています。

    実際にこのスクリプトを叩いてみて、Logwatchの内容がslackに通知されればokです。

     
    [結果]
    slack-sample2

    通知されない場合は、スクリプト内のパスの記述が間違っていないか、またはパーミッションが足りているかを確認しましょう。

    cronで自動化する

    手動でlogwatchの内容をslackに通知できるようになりましたが、メールのように自動で毎日見れないと意味がありません。よってcronで自動化することにします。

    cronとは、一度設定すれば「指定した時間に指定された処理(ファイルのバックアップなど)」を実行してくれるタイムスケジューラのことです。

    logwatchコマンドはrootユーザのみでしか叩けないので、root権限で動くように「/var/spool/cron/root」を編集します。

    このファイルにタスクを書くと、そのタスクは全てroot権限で実行されるようになっています。ファイルが存在しない場合は新規で作成します。

    まずはテスト用に、「1分毎にlogwatchの内容をslackに通知する」ようにします。これなら1分待つだけで、設定が正常に完了しているか失敗しているかを見極めることができます。

    cronでは、左側の「* * * * *」で「1分毎に実行」を表します。右側には実行するジョブ(スクリプト)を記述します。詳しく知りたい方はググってください。

    PATHを設定しているのは、cronはデフォルトで動かすと「/usr/bin:/bin」しか通ってないので、sbinにあるlogwatchコマンドが見つからないからです。。

    これを設定して1分待ってもslackに通知がない場合は「/var/log/cron」にあるログファイルを見てみましょう。cronはroot権限で動く上にpathも通ってるハズなので、変な環境じゃなければこれで動くハズです。多分。(自信がない)

    上記のテスト設定でうまくいった場合は、もう一度「/var/spool/cron/root」を編集し、日次で動かす設定にします。ぼくは21時に動くように設定しています。

    あとは毎日21時になれば勝手にslackに通知が来ます。

    メールの送信設定を解除する

    さて、めでたくslackに自動で通知を飛ばす設定になったわけですが、残念ながらまだメールは毎日飛んできます。これを解除してひゃっほうしたいと思います。

    「/etc/cron.daily」というディレクトリに日次で動くcronの設定ファイルが入っているので、そこを見てみるとlogwatchの設定ファイルがあるハズです。

    この「0logwatch」を覗いて見ると、「/usr/sbin/logwatch ‐‐output mailを実行しろ」という内容になっています。

    これを毎日実行することで、メールが飛ぶようになっているんですね。

    メールを飛ばさないようにするには、この「0logwatch」から実行パーミッションを抜いてあげればokです。

    以上でslack通知がメール→slackに完全に切り替わりました。お疲れ様です。

    これからもエンジニア向けに、役に立つ記事を書いていきたいと思います。

    スポンサーリンク