Subscribed unsubscribe Subscribe Subscribe

SlackとHubotを連携して、Slackからサーバー上のシェルを実行してみる

keiwt.hatenablog.com

上記に続きとして、hubot経由でサーバー上のシェルを実行してみようと思います。 社内の開発フローにHubotを導入してChatOpsにします。
ChatOpsについては以下を参照ください。

codeiq.jp

Hubot経由でコマンドを実行するにはchild_process APIを使用します

Child Process | Node.js v6.4.0 Documentation

Hubotスクリプトのソース

child_process = require('child_process')
module.exports = (robot) ->
  robot.respond /結合を最新化しろ$/i, (msg) ->
    child_process.exec 'sh 実行したいシェル名.sh', (error, stdout, stderr) ->
      msg.send(stdout)
      msg.send(stderr)
      msg.send(error)

※通常は日本語にはしません

シェルのソース

#! /bin/sh
cd /home/xxxxxxx
git pull origin master

bashでない理由は以下の通りです

www.trendmicro.co.jp

実行してみる

f:id:keiwt:20150408121715p:plain

シェルに引数を渡したい場合

Hubotスクリプトのソース

child_process = require('child_process')

module.exports = (robot) ->
  robot.respond /納品しろ (.*) (.*)$/i, (msg) ->
    repo = msg.match[1]
    branch = msg.match[2]
    child_process.exec "sh 実行したいシェル名.sh #{repo} #{branch}", (error, stdout, stderr) ->
      msg.send(stdout)
      msg.send(stderr)
      msg.send(error)

※変数を使用するのでchild_process.execの第1引数はダブルクォーテーションにしてください。
※ちなみにコマンドの実行者はHubotの起動コマンドを実行したユーザーになります

シェルのソース

#! /bin/sh
cd /home/xxxxxx/xxxxx/$1/
git push origin $2
echo '納品が完了しました。'

※$1,$2はそれぞれ第1引数と、第2引数です
※ちなみにユーザー名とパスワードの入力はHubotを起動しているウィンドウから入力します

シェル内で特定の文字列が含まれているか知りたい場合

if [[  $string = *特定の文字列*  ]]; then
  echo ${string}
fi

実行してみる

f:id:keiwt:20150408122617p:plain

あとは、サーバー上で実行したいコマンドをシェルに書いていけば、何でも自動化できます。

なぜ、ChatOpsにするのか

手順をコードに落とし込んで、Hubot経由で実行することにより、  
誰でも同じ操作をできますし、
何回も行っていることを自動化することにより、  
より重要なことに割く時間を増やすことができます。
※属人性・重複作業を排除

また、エンジニアではない人でもできることが増え、
あの人がいないとという状態になりにくくなります。

slack上で誰が何をしているかが手に取るように分かるので、
情報共有が常にされている状態になります。
そのため、方向性の軌道修正等も早く行え、
手戻りが少なくなります。

次回はAPIを実行したり、データ解析等をやってみようと考えています。