Vagrant + ElasticSearch + Kibana + Logstashに自分の現場参戦メモを投入してみた

なんとなくVagrantで構築したElasticSearch + Kibanaの環境にLogstashで自分の現場参戦メモを投入してみた。
ただ、参戦数が少なすぎて何の発見もなく普通にExcelでグラフ書けばいいじゃん的な結果に。

f:id:htktnushi:20151114161054p:plain

Vagrantのセットアップとミドルウェアのインストール

ansibleのplaybookベースなのでVirtualBoxVagrantをインストールした状態であれば下記ファイル群を置いて
vagrant up
すればElasticSearchとKibanaとLogstashが入る。

この状態であれば同一ホスト内でElasticSearchには
http://localhost:9200/
VagrantのホストOSからKibanaには
http://10.3.8.4:5601/
でアクセスできる。


Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos65"
  config.vm.box_url = "http://www.lyricalsoftware.com/downloads/centos65.box"
  config.vm.network :private_network, ip: "10.3.8.4"
  config.vm.synced_folder ".", "/vagrant", :mount_options => [ "dmode=775", "fmode=664" ]
  config.vm.provision "shell", :path => "provision.sh"
  config.vm.provider "virtualbox" do |v|
    v.memory = 1024
  end
end


provision.sh

#!/usr/bin/env bash

if ! [ `which ansible` ]; then
  yum install -y ansible
fi

ansible-playbook -i /vagrant/ansible/hosts /vagrant/ansible/playbook.yml


ansible/hosts

127.0.0.1 ansible_connection=local


ansible/playbook.yml

---
- hosts: 127.0.0.1
  connection: local
  sudo: yes

  vars:
    src_dir: /usr/local/src
    jdk_ver: 1.8.0
    kibana_file_base: kibana-4.2.0-linux-x64
    kibana_install_dir: /opt

  tasks:
    - name: install Java
      yum: name=java-{{jdk_ver}}-openjdk state=present

    - name: import key for repository of ElasticSearch
      rpm_key: key=https://packages.elastic.co/GPG-KEY-elasticsearch state=present
    - name: add repository of ElasticSearch
      copy: src=elasticsearch.repo dest=/etc/yum.repos.d/elasticsearch.repo owner=root group=root mode=0644
    - name: install ElasticSearch
      yum: name=elasticsearch state=present
    - name: enable ElasticSearch
      service: name=elasticsearch state=started enabled=yes

    - name: import key for repository of Logstash
      rpm_key: key=https://packages.elasticsearch.org/GPG-KEY-elasticsearch state=present
    - name: add repository of Logstash
      copy: src=logstash.repo dest=/etc/yum.repos.d/logstash.repo owner=root group=root mode=0644
    - name: install Logstash
      yum: name=logstash state=present
    - name: enable Logstash
      service: name=logstash state=started enabled=yes

    - name: download Kibana
      get_url: url=https://download.elastic.co/kibana/kibana/{{kibana_file_base}}.tar.gz dest={{src_dir}}/{{kibana_file_base}}.tar.gz
    - name: unarchive Kibana
      command: tar zxvf {{src_dir}}/{{kibana_file_base}}.tar.gz -C {{src_dir}}
    - name: install Kibana
      command: mv {{src_dir}}/{{kibana_file_base}} {{kibana_install_dir}}/kibana creates={{kibana_install_dir}}/kibana
    - name: setup init.d for Kibana
      copy: src=kibana.init dest=/etc/rc.d/init.d/kibana owner=root group=root mode=0755
    - name: enable Kibana
      service: name=kibana state=started enabled=yes


ansible/elasticsearch.repo

[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1


ansible/logstash.repo

[logstash-2.0]
name=Logstash repository for 2.0.x packages
baseurl=http://packages.elasticsearch.org/logstash/2.0/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1


ansible/kibana.init

#!/bin/sh

### BEGIN INIT INFO
# Provides:          kibana
# Required-Start:    $local_fs $remote_fs $network
# Should-Start:      $time
# Required-Stop:     $local_fs $remote_fs $network
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Short-Description: Kibana 4
# Description:       Service controller for Kibana 4
### END INIT INFO

INSTALLED_DIR=/opt/kibana
EXEC_SCRIPT="$INSTALLED_DIR/bin/kibana"
LOG_DIR=/var/log/kibana
PID_DIR=/var/run
PID_FILE="$PID_DIR"/kibana.pid
LOG_FILE="$LOG_DIR"/kibana.log

test -d $LOG_DIR || mkdir $LOG_DIR

# Source function library.
. /etc/init.d/functions

RETVAL=0

case "$1" in
    start)
        if [ ! -f "$PID_FILE" ]; then
          echo -n "Starting Kibana"
          nohup $EXEC_SCRIPT 0<&- &> $LOG_FILE &
          echo $! > $PID_FILE
          success
        else
          echo -n "Kibana is already running"
          RETVAL=1
          failure
        fi
        echo
        ;;
    stop)
        if [ -f "$PID_FILE" ]; then
          echo -n "Stopping Kibana"
          test -f $PID_FILE && cat $PID_FILE | xargs kill -s SIGKILL && rm -f $PID_FILE
          success
        else
          echo -n "Kibana is not running"
          RETVAL=1
          failure
        fi
        echo
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    reload)
        $0 restart
        ;;
    status)
        status kibana
        RETVAL=$?
        ;;
*)
echo "Usage: $0 {start|stop|status|restart|reload}"
exit 1
;;
esac
exit $RETVAL

データの流し込み

ElasticSearchが立ち上がっている状態で(この時点ではKibanaとLogstashのサービスは起動していなくてよい)下記のファイルを置いてvagrant内で/vagrant/ansible/_dataに移動して、以下を実行すると同フォルダの「sample_data_hello.tsv」の中身がElasticSearchに投入される。
cat sample_data_hello.tsv | /opt/logstash/bin/logstash -f 01-hellolog.conf

その後Kibanaをサービスとして起動して「 http://10.3.8.4:5601/ 」にアクセスするといろいろいじれる。


ansible/_data/01-hellolog.conf

input { stdin {} }

filter {
  if [message] =~ "^@" {
    drop {}
  }
  if [message] =~ "^\s*$" {
    drop {}
  }
  csv {
    separator => "	"
    columns => [ status, date, day, time, place, seat, title, note ]
  }
  date {
    match => [ date, "YYYY/MM/dd" ]
  }
}

output {
  elasticsearch { hosts => [ "localhost:9200" ] }
#  stdout { codec => rubydebug }
}

※注:「separator」の中身はタブ。
※注:冒頭に全角「@」がある行と空行は無視している。


ansible/_data/sample_data_hello.tsv

	2014/04/29	火	15:00	サンシティ越谷市民ホール 大ホール	ファミリー席 2Fn列n番	Berryz工房デビュー10周年記念コンサートツアー2014春 ~ リアルBerryz工房 ~
	2015/10/15	木	18:20	TOKYO FM HALL	n列n番	カントリー・ガールズ 山木梨沙バースデーイベント2015	(お見送り:山木)
	2015/10/30	金	17:00	千葉大学 西千葉キャンパス	かたらいの森前ステージ 立ち見	カントリー・ガールズ Special Live ~千の葉に舞うMUSIC!~
(郵送待ち)	2015/12/07	月	18:30	武道館	ファミリー席	モーニング娘。’15 コンサートツアー秋 ~PRISM~

※注:各項目タブ区切り。「ステータス、日付、曜日、開演時刻、会場、座席、タイトル、備考」の順。

スポンサードリンク