約3年ぶりです。激しく沈黙しておりました。。。
久しぶりの登場ですが、ニッチなネタで攻めたいと思います。
アドウェイズSEのコミュニケーションツールがIRCからSlackに移行が進んでおります。
Slackに移行するにあたり、IRCで使用していたbotの中で、windowsアカウントの
ロック解除など行う機能をSlack用に作り直そうと。。。
Slack上からわざわざアカウントロックを解除する需要があるのか?は考えないことにします!当初ムネリンの記事にあった「OutgoingWebHooks」を使おうかと思いましたが、
汎用性を考慮して「hubot」で行きたいと思います。イメージはこんな感じです。
環境は以下を想定しています。汎用性を考慮して「hubot」で行きたいと思います。イメージはこんな感じです。
- hubotサーバのOSはCentOS 6.6
- hubotは2.16.0
- ADサーバとの接続はrubyを使用(activeldap)
- hubotサーバとADサーバは社内に設置
hubotサーバの構築はこんな感じです。
そのままではyumでインストール出来ないので、リポジトリを追加します。
hubotに必要なものはnode.js と redisですが、hubot関連モジュールのインストールはnpmで行うため、npmもインストールします。
$yum install nodejs redis npm
npmがインストール後に実際のhubotやcoffeeなどをインストールします。
ただしhubot起動時に足らないモジュールを大量にインストールすることになりますが。。。。
$npm install -g coffee-script hubot yo generator-hubot
$mkdir bot_isys$cd bot_isys$yo hubot? =============================================We're constantly looking for ways to make yo better!May we anonymously report usage statistics to improve the tool over time?More info: https://github.com/yeoman/insight & http://yeoman.io=========================================(Y/n)Y? Owner: (User <user@example.com>) user@example.com? Description: (A simple helpful robot for your Company)? Bot adapter: (campfire) slack
次にSlack側にhubot用のユーザを作成します。
「Integrations」から「Hubot」を選択します。
profileの「API Token」の内容をhubotサーバの環境変数に設定する必要があります。
「API Token」を環境変数に設定し、hubotを起動すると。。。。エラーが出ます。
$export HUBOT_SLACK_TOKEN=<API Token>$hubot -a slack
「hubot-slack」のモジュールが見つからないとエラーが出ます。足りないモジュールはnpmコマンドで追加します。
$npm install -g hubot-slack
この作業を数回繰り返し、エラーが出なくなればhubotサーバの構築は完了です 。なおhubotサーバはSlack(インターネット側)へhttps通信が許可されている必要があります。どうもSlackはEC2みたいですね。
Slackとhubotサーバの連携はcoffeeスクリプトを使用します。今回ADサーバへの接続はrubyスクリプトを使用するため、coffeeスクリプト内からrubyスクリプトに引き渡します。
module.exports = (robot) ->robot.hear /bot_isys (.+)/i, (msg) ->Channel = msg.message.user.roomItems = msg.match[1].split(/\s+/)Cmd_arg = Items[0]Username_arg = Items[1]@exec = require('child_process').execcommand = "ruby-script.rb #{Channel} #{Cmd_arg} #{Username_arg}"@exec command, (error, stdout, stderr) ->msg.send error if error?msg.send stdout if stdout?msg.send stderr if stderr?