LoginSignup
9
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-04-28

研究室では,サーバ監視に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

9
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9