これは Hubot Advent Calendar 2014 - Adventar の 8 日目の記事です!!!111前日は id:bouzuya さんの 簡単な Hubot スクリプトをもっとつくろう (おみくじ系) - Qiita でした。
早速本題だが、チャットオップスで最初に思いつくのがコマンドをラップする!とかだろうけど、これが意外と考えることが多くて、
- 実行時間が長いといつまでも帰ってこなくて不安では?
- ログの扱いをどうする?
みたいな当たり悩ましい。
ここで、npmにcarrierと言うモジュールがある。
これは標準出力、標準エラー出力のストリームをつなげば、一行ずつイベントを発火してくれると言う代物。この一行ずつと言うのが大変便利で、使い方としてはこれだけで良い。
# Description: # 例えば、 aws-cli のコマンドをhubotから叩く。 # # Configuration # AWS_ACCESS_KEY_ID - AWS アクセスキー # AWS_SECRET_ACCESS_KEY - AWS シークレットキー # # Commands: # hubot aws version - バージョン出す # hubot aws s3-ls - aws s3 ls を叩く carrier = require('carrier') {spawn} = require('child_process') runAwsCommand = (msg, args) -> env = AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY: process.env.AWS_SECRET_ACCESS_KEY cli = spawn '/usr/local/bin/aws', args, {env: env} cOut = carrier.carry(cli.stdout) cErr = carrier.carry(cli.stderr) cOut.on 'line', (l) -> msg.send l cErr.on 'line', (l) -> msg.send "error: #{l}" module.exports = (robot) -> robot.respond /aws version/i, (msg) -> runAwsCommand msg, ['--version'] robot.respond /aws s3-ls/i, (msg) -> runAwsCommand msg, ['s3', 'ls']
というかぶっちゃけ別にストリームは何でも良い。ログも、一行ずつ msg.send でフィードバックしているだけだが、適当なファイルやDBに突っ込んでもかまわないと思う。
まあこれで、とりあえずコマンド実行ログはチャッツでシャエーできる。チャッツオプスだ!
コマンドを雑に実行するにあたり、このcarrierレベルで使いやすいモジュールを、Rubyその他においてぼくは知らないのであった...。
蛇足: ChatOpsとぼくについて
正直、ルビー界隈やレーィルズ界隈の戦闘力のインフレは凄まじく、このままパーフェクトルビーおじさんとして名を挙げることに困難を感じたため、新たなブルーオーシャン市場としてChatOpsとかHubotに目をつけ、名を挙げたり、W○b†DB Pressに特集記事を寄稿したり、Hubotを支える技術を上梓してメイクマニーしたり、などと言う皮算用をしていたのだが、
この辺りの記事を読んで衝撃を受け、ぼくがいかに「ボットを運用すると言うこと、あるいはその文化」を舐めてかかっていたかを大いに恥じた。今後ぼくは言葉をつぐみ、名も無いいちHubotユーザとしてインターネットの河原の石になろうと思う。
あ、 明日も bouzuya - Qiita さんの記事です 明日は未定のようでした... 登録して何か書きましょう!是非!