以前、slackとhubotでShellScriptをSlackから実行しようという記事を書きました。
さくらvps+hubot+Slackでslack botをつくる
今回は対話形式のコマンド実行ではなく、cronで定期的にShellScriptを実行、Slackに出力結果を報告しようという試みです。
意外とこの類いのコピペでパクれるリスペクトできる参考ソースが調べても出てこなかったので、途中で挫折仕掛けましたw
API叩いてcrontabで回すという無難な方法もありましたが、せっかくつくったhubotを活躍させたかったので頑張りました。
注意: この記事を執筆している時は確かに動いていたのですが、LogWatchの出力テキストに何かしらの問題があるらしく、正しく実行されない可能性があるようです。Slack APIのAttachment APIを利用した場合もやってみたのですが、同様でした。原因はよくわかっていません。。
なお筆者はCoffeeScriptに関して無知な模様(:3」∠)
node-cronというパッケージを使用するので、npm install node-cron
でインストールしておいてください。
logwatch.coffee
cron = require('cron').CronJob
module.exports = (robot) ->
new cron '*/1 * * * *', () =>
@exec = require('child_process').exec
command = "/YourHubotName/scripts/shell/logwatch.sh"
@exec command, (error, stdout, stderr) ->
robot.send {room: "logwatch"}, stdout
, null, true, "Asia/Tokyo"
CoffeeScriptは、cronがちゃんと動作するかすぐに確認したかったので1分ごとにcronを回すよう指定しています。
cronの時間指定方法は通常のcronと同じなので各自自由に設定してください。
slackのchannel指定についてですが、# をつけても実行されるようですが、private channelの場合は実行されないようです。(# はそもそもpublic channelという意味??)
hubot-slackのバージョンによってもchannel指定が異なるようですが、その辺は私の環境ではハマらなかったのでハマった方は各自調べてください。m( )m
logwatch.sh
# !/bin/bash
logwatch --print
logwatchでログを出力するだけのカンタンなスクリプトです。
これで“一分ごとにlogwatch --print
の出力結果をSlackのlogwatchチャンネルに投稿する”というタスクをhubotに担当させることができました。
logwatchは今までメールで出力を送信していたのですが、Slackに送信できるようになったので煩わしさが減りました\(^o^)/
追記:Slackに投稿されるテキストが長すぎると分割されて投稿されるようです。ダブって投稿されているなあ〜と思ったらlogwatchの出力テキストが長すぎたためでした。
追記の追記:Attachmentsがhubot-slack v3.3.0から使えるらしいです!
hubot-slackでattachmentsを使う
GMOクラウドサポートガイド さんが親切に説明されています。
logwatchの設定ファイルでPrint=Yesを設定するとメール送信が停止されます。
実行権限を変更するやり方だと何らかの拍子に権限が変わるからあんまり良くないという記事をどっかで見かけたので、私はこのやり方でメール停止しました。
CoffeeScriptなんか嫌いです(泣)
slackでShellScriptを実行するという記事を前回書きましたが、“特定のチャンネルで、特定のユーザーのみ”という条件を加えるには一工夫いるようです。
少し調べてみたのですが、まだ良くわかっていないので追々手をつけていきたいと思います。