AnsibleでKibanaのダッシュボードを自動生成

  • 9
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

研究室では,サーバ監視にSensuを使っています.
そのagentであるsensu-clientをインストールするために,構成管理ツールのAnsibleを使っています.
今回は,Ansibleの実行対象を記述したInventoryからKibanaのダッシュボードを生成してみます.

Kibana

ここでは,Kibana 3.1.2を使います.
(Kibana 4はjsonファイル形式のダッシュボードを使えないようなので.)

インストール先は/opt/kibanaで,config.jsondefault_routeを変更します.
このdashborads.jsonに,sensu-clientの一覧を表示するようにします.

/opt/kibana/config.json
/** @scratch /configuration/config.js/5
 *
 * ==== default_route
 *
 * This is the default landing page when you don't specify a dashboard to load. You can specify
 * files, scripts or saved dashboards here. For example, if you had saved a dashboard called
 * `WebLogs' to elasticsearch you might use:
 *
 * default_route: '/dashboard/elasticsearch/WebLogs',
 */
default_route     : '/dashboard/file/dashboards.json',

Ansible Inventory

実際に使っているInventoryの一部をお見せします,ホスト名は気にしないで下さい.
[kibana]に対してplaybookを実行し,[sensu-client]の各ホストのダッシュボードを生成します.

[kibana]
192.168.11.250

[sensu-client]
air          ansible_ssh_host=air.eng.kagawa-u.ac.jp
rewrite      ansible_ssh_host=rewrite.eng.kagawa-u.ac.jp
clannad      ansible_ssh_host=clannad.eng.kagawa-u.ac.jp
planetarian  ansible_ssh_host=planetarian.eng.kagawa-u.ac.jp
kanon        ansible_ssh_host=planetarian.eng.kagawa-u.ac.jp

Ansible Playbook

ここでは,使用しているplaybookの一部を紹介します.
全体はGitHubにありますので,参照して下さい.

with_itemsを使って[sensu-client]の各ホストのダッシュボードを生成します.
一覧であるdashboards.jsonも生成しますが,こちらはテンプレート内でforを用いています.

kibana.yml
---
- hosts: kibana
  sudo: yes
  gather_facts: no
  tasks:

    - name: create each server.json
      template:
        src=templates/server.json.j2
        dest=/opt/kibana/app/dashboards/{{ item }}.json
        owner=root
        group=root
        mode=0644
      with_items: groups['sensu-client']

   - name: create dashboards.json
      template:
        src=templates/dashboards.json.j2
        dest=/opt/kibana/app/dashboards/dashboards.json
        owner=root
        group=root
        mode=0644

server.json.j2では,ホスト名である{{ item }}を使います.
ダッシュボードのタイトルや,Elasticsearchへの検索クエリに必要です.

server.json.j2
{
  "title": "{{ item }}",
  "services": {
    "query": {
      "list": {
        "0": {
          "id": 0,
          "color": "#bc3539",
          "alias": "",
          "pin": false,
          "type": "lucene",
          "enable": true,
          "query": "key:\"{{ item }}.cpu.usage\""
        },
...

dashboards.json.j2では,Jinja2forを用います.
各ダッシュボードへのリンクと,IPアドレスのリストを生成します.

dashboards.json.j2
...
"rows": [
    {
      "title": "dashboards",
      "height": "500px",
      "editable": false,
      "collapse": false,
      "collapsable": false,
      "panels": [
        {
          "error": false,
          "span": 4,
          "editable": false,
          "type": "text",
          "loadingEditor": false,
          "mode": "markdown",
          "content": "
            {% for host in groups['sensu-client'] %}
              - [{{ host }}](index.html#/dashboard/file/{{ host }}.json) ({{ hostvars[host]['ansible_ssh_host'] }})\n
            {% endfor %}\n",
          "style": {},
          "title": "sensu metrics"
        }
      ],
      "notice": false
    }
  ],
...

結果

AnsibleのInventoryから,sensu-clientのダッシュボードと,その一覧を生成できました.
他にも,Railsのダッシュボードを生成したり,一緒に静的ファイルの転送をしたりしています.
Kibana 4でも同様のことをやりたいので,ノウハウある方は教えてください!

dashboards.png

server.png