研究室では,サーバ監視にSensuを使っています.
そのagentであるsensu-clientをインストールするために,構成管理ツールのAnsibleを使っています.
今回は,Ansibleの実行対象を記述したInventoryからKibanaのダッシュボードを生成してみます.
Kibana
ここでは,Kibana 3.1.2を使います.
(Kibana 4はjsonファイル形式のダッシュボードを使えないようなので.)
インストール先は/opt/kibana
で,config.json
のdefault_route
を変更します.
このdashborads.json
に,sensu-clientの一覧を表示するようにします.
/** @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
を用いています.
---
- 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への検索クエリに必要です.
{
"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のforを用います.
各ダッシュボードへのリンクと,IPアドレスのリストを生成します.
...
"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でも同様のことをやりたいので,ノウハウある方は教えてください!