ようへいの日々精進XP

よかろうもん

Ansible の実行結果を後から見たいなと思ったので fluentd を使ってザクッと Elasticsearch に放り込んでみたメモ

ども、Ansible 一年生のかっぱです。

はじめに

Ansible の実行結果を後から見たいなと思ったので Callback Plugin と fluentd を使ってザクッと Elasticsearch に放り込んでみたメモ。


module の話

今回は Ansible の log_plays.py をちょっと改変して fluent-logger-python と組み合わせて Elasticsearch に放り込んでみた。

ここで Ansible モジュールのお話を少し…と言うほど Ansible のモジュールについての知識は無いので Ansible モジュールの特徴を以下に整理。

  • 言語は問わない(Python 以外でも作れるらしい)
  • 幾つか種類に別れている(Callback / Notification / etc…)
  • 今回扱う Callback プラグインは Chef の Handler みたいなもの(という解釈)

プラグインとモジュールを混同してしまっている…


実装(という程ではないけど)

参考

以下のような構成を Docker でザクッと作る。

f:id:inokara:20150326103151p:plain

Callback module(俺の Ansible Callback module)

長くなったので gist に添付。

fluentd に飛ばすのはとても簡単で以下に記載している fluent-logger-python をインストールしてモジュールを import する。

import os
import time
import json
from fluent import sender #追加
from fluent import event #追加


TIME_FORMAT="%b %d %Y %H:%M:%S"
MSG_FORMAT="%(now)s - %(category)s - %(data)s\n\n"

def log(host, category, data):

(snip)

以下のように setup メソッドで localhost の fluentd に対して接続。

    sender.setup('ansible', host='localhost', port=24224)

そして、以下のように Event メソッドで fluentd にデータを送る。

    event.Event(host, {
       'host': host,
       'category': category,
       'messages': data
    })

簡単。

Ansible を実行する環境でのちょっとした準備と fluentd の実行。

fluent-logger-python を入れておく。

pip install fluent-logger-python

ついでに fluent-plugin-elasticsearch も入れておく。

fluent-gem install fluent-plugin-elasticsearch --no-ri --no-rdoc -V

fluent.conf は以下のように設定。

<source>
  type forward
  bind 0.0.0.0
  port 24224
</source>

<match ansible.**>
  type copy
  <store>
     type stdout
  </store>
  <store>
     type elasticsearch
     include_tag_key true
     tag_key @log_name
     host ${elasticserach_host}
     port ${elasticserach_port}
     logstash_format true
     logstash_prefix ansible
     flush_interval 10s
  </store>
</match>

fluentd を起動。

fluentd -c fluentd.conf -l test.log &

Callback モジュールの指定

幾つか指定方法があるようだが以下のように .ansible.cfg に指定。

[defaults]

callback_plugins = ~/path/to/inventories/callback_plugins/

収束

適当に作った Playbook を実行してみる。

f:id:inokara:20150326095034p:plain

わざと失敗させてみたり。

確認

Elasticsearch でカクニン

f:id:inokara:20150326095236p:plain

おお。

Kibana でカクニン

f:id:inokara:20150326095358p:plain

初 Kibana4 で使い方が解らないけど…おお。

ということで

Ansible の task の結果をザクっと Elasticsearch に放り込んでみた。たまたま OpenSSL のバージョンアップ作業に利用してみたりしたが残念ながら改行は一行で表示されたりして視認性が高いとは言い切れないが証跡を残せるというのは良い。今回はあくまでもザクッと放り込んだだけだが、ちゃんとキー指定を細かく Elasticsearch に放り込んで上げると良いのかなと思った。