チャット上のHubotを通じて運用を自動化するChatOpsという運用スタイルが注目されています。ローカルでチャット上で動くHubotを試すために、HipChatクローンのKandanとHubotを動作するDockerfileを書いてみました。
構成
- Ubuntu 14.04
- Docker 1.3.0
- Kandan 1.2
- hubot 2.4.7
- hubot-kandan adapter 1.0
Dockerfile
Dockerfileを以下のように作成します。
ソースコードはこちら@githubで公開しています。
Dockerfileの構成
Dockerfileの構成は以下の通りです。
docker-kandan-hubot ├──Dockerfile ├──hubot │ ├──hubot-scripts.json │ ├──hubot.conf │ ├──hubot.sh │ └──package.json ├──kandan │ ├──database.yml │ └──kandan.conf ├──sources.list └──sshd.conf
Dockerfile
Dockerfile以外にもいくつかファイルはありますが、今回はDockerfileのみ説明します。
$ docker-kandan-hubot $ vi Dockerfile FROM ubuntu:14.04 MAINTAINER hideakihal # install basic package ADD sources.list /etc/apt/sources.list ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && \ apt-get -y install \ openssh-server \ supervisor \ build-essential \ curl \ unzip \ git-core \ ruby1.9.1-dev \ ruby-bundler \ libxslt-dev \ libxml2-dev \ libpq-dev \ libsqlite3-dev \ gcc \ g++ \ make && \ curl -sL https://deb.nodesource.com/setup | bash - && \ apt-get install -y nodejs && \ apt-get clean # root user RUN echo 'root:root' | chpasswd # install sshd RUN mkdir -p /root/.ssh /var/run/sshd RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config RUN sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config RUN sed -ri 's/PermitRootLogin without-password/PermitRootLogin yes/g' /etc/ssh/sshd_config # hubot user RUN useradd -m -s /bin/bash hubot RUN echo 'hubot:hubot' | chpasswd RUN echo 'hubot ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/hubot ENV HOME /home/hubot # install Kandan USER hubot WORKDIR /home/hubot RUN wget https://github.com/kandanapp/kandan/archive/v1.2.tar.gz RUN tar xvf v1.2.tar.gz RUN mv kandan-1.2/ kandan RUN echo 'gem: --no-rdoc --no-ri' >> /home/hubot/.gemrc WORKDIR /home/hubot/kandan RUN sudo gem install execjs RUN sudo sed -ri "s/gem 'pg'/gem 'sqlite3'/g" /home/hubot/kandan/Gemfile RUN bundle install --without development test ADD kandan/database.yml /home/hubot/kandan/config/database.yml RUN RAILS_ENV=production bundle exec rake db:create db:migrate kandan:bootstrap RUN sed -ri 's/config.serve_static_assets = false/config.serve_static_assets = true/g' \ /home/hubot/kandan/config/environments/production.rb RUN RAILS_ENV=production bundle exec rake assets:precompile RUN RAILS_ENV=production bundle exec rake kandan:boot_hubot RUN RAILS_ENV=production bundle exec rake kandan:hubot_access_key | awk '{print $6}' > hubot-key # install Hubot WORKDIR /home/hubot RUN wget https://github.com/github/hubot/archive/v2.4.7.zip RUN unzip v2.4.7.zip WORKDIR /home/hubot/hubot-2.4.7 RUN sudo npm install -g mime@1.2.4 qs@0.4.2 RUN npm install RUN make package WORKDIR /home/hubot/hubot-2.4.7/hubot RUN git clone https://github.com/kandanapp/hubot-kandan.git node_modules/hubot-kandan RUN npm install faye RUN npm install ntwitter ADD hubot/package.json /home/hubot/hubot-2.4.7/hubot/package.json ADD hubot/hubot-scripts.json /home/hubot/hubot-2.4.7/hubot/hubot-scripts.json RUN sed -ri 's/"version": "1.0",/"version": "1.0.0",/g' node_modules/hubot-kandan/package.json USER root ADD hubot/hubot.sh /etc/profile.d/hubot.sh RUN awk '{print "export HUBOT_KANDAN_TOKEN="$0}' /home/hubot/kandan/hubot-key >> /etc/profile.d/hubot.sh # add supervisor config file RUN mkdir -p /var/log/supervisor /etc/supervisor/conf.d ADD sshd.conf /etc/supervisor/conf.d/sshd.conf ADD kandan/kandan.conf /etc/supervisor/conf.d/kandan.conf ADD hubot/hubot.conf /etc/supervisor/conf.d/hubot.conf RUN awk '{print " HUBOT_KANDAN_TOKEN="$0}' /home/hubot/kandan/hubot-key >> /etc/supervisor/conf.d/hubot.conf # expose ports EXPOSE 22 3000 # define default command CMD supervisord -n
インストール
GitHubにあるソースコードを取得して、Dockerイメージをビルドします。
$ git clone https://github.com/hideakihal/docker-kandan-hubot.git $ sudo docker build -t kandan-hubot docker-kandan-hubot
コンテナを起動します。KandanとSSHの使用ポートである3000と22を起動時に指定します。
$ sudo docker run -d -p 22 -p 3000:3000 kandan-hubot
ブラウザから、以下のアドレスにアクセスすると、Kandanのログイン画面に接続することができます。
http://<your-host-ip>:3000
デフォルトでユーザ名「Admin」、パスワード「kandanappadmin」でログインできます。
ログインすると、Hubotがチャットに参加していることが確認できます。
動作確認のため、「@hubot ping」や「@hubot pug me」などを投稿すると、hubotが応答してくれます。
Hubotスクリプトの追加
Hubotのスクリプトを追加した場合、Hubotの再起動が必要になります。今回supervisorによりHubotを起動しているため、以下のコマンドを実行し、Hubotを再起動します。
$ ssh root@localhost -p <your-container-22port> password:root # supervisorctl restart hubot
おわりに
Dockerを使ってKandan上でHubotを動かす環境を作ることができました。ローカルで試してみたい場合や、Hubotのスクリプトをチャット上で検証してみたい場合などに使えるか思います。
※SlackとKandanを比較した場合、Slackの出来がいいため、どうしてもという理由がない限りSlackを使ったほうがいいようです。