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


研究室では，サーバ監視に[Sensu](http://sensuapp.org/)を使っています．
そのagentであるsensu-clientをインストールするために，構成管理ツールの[Ansible](http://www.ansible.com/)を使っています．
今回は，Ansibleの実行対象を記述した[Inventory](http://docs.ansible.com/intro_inventory.html)から[Kibana](https://www.elastic.co/products/kibana)のダッシュボードを生成してみます．

  - [研究室でAnsible使ってる話 - Qiita](http://qiita.com/hiconyan/items/ddf5d3e34a18a2028566)

## Kibana

ここでは，[Kibana 3.1.2](https://www.elastic.co/downloads/past-releases/kibana-3-1-2)を使います．
(Kibana 4はjsonファイル形式のダッシュボードを使えないようなので．)

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

```javascript:/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]`の各ホストのダッシュボードを生成します．

```hosts
[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にありますので，参照して下さい．

  - [ansible-playbooks/kibana at master · hico-horiuchi/ansible-playbooks](https://github.com/hico-horiuchi/ansible-playbooks/tree/master/kibana)

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

```yml: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](https://www.elastic.co/products/elasticsearch)への検索クエリに必要です．

```javascript+jinja: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`では，[Jinja2](http://jinja.pocoo.org)の[for](http://jinja.pocoo.org/docs/dev/templates/)を用います．
各ダッシュボードへのリンクと，IPアドレスのリストを生成します．

```javascript+jinja: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](https://qiita-image-store.s3.amazonaws.com/0/58742/88bb4fa3-74c5-fd86-d80c-36ef658c56bb.png "dashboards.png")

![server.png](https://qiita-image-store.s3.amazonaws.com/0/58742/c7987312-2386-4604-d292-613b93edb997.png "server.png")