ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

carrierモジュールで雑にHubotからコマンドを打つ

これは 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を支える技術を上梓してメイクマニーしたり、などと言う皮算用をしていたのだが、


チャット経由でデプロイする[新編] - Qiita



DocomoruでBOTと雑に会話する - Qiita


この辺りの記事を読んで衝撃を受け、ぼくがいかに「ボットを運用すると言うこと、あるいはその文化」を舐めてかかっていたかを大いに恥じた。今後ぼくは言葉をつぐみ、名も無いいちHubotユーザとしてインターネットの河原の石になろうと思う。

あ、 明日も bouzuya - Qiita さんの記事です 明日は未定のようでした... 登録して何か書きましょう!是非!