いんふら女子めも

('ω')ノ★ 現役インフラエンジニアです.

Grafanaのトップ画面をユーザーグループごとに変えたい

Grafana便利だよね

Grafana便利ですよね。最近はGrafanaを使って監視ダッシュボードの開発をメインにしているので、Grafana職人なのかなって思うくらい使っています。

今回は、ユーザー(グループ)ごとに見せたいダッシュボードを変えたいときの実例について書きます。管理者と閲覧者に見せる画面を変えて閲覧権限を制限したりなどができるかと思います。

やりたいこと

管理者と閲覧者のトップページ(ログイン後の画面)を変えて、アクセスできるダッシュボードに制限をかけたいと思います。
イメージは以下のようなものを想定しています。
f:id:akngo22:20190814110149p:plain

お試し環境

今回は、Grafana6.16で試しました。

手順

①管理者でログインしユーザーを作成する

「configuration」⇒「users」⇒「invite」をクリックして、必要事項を入力します。
※ユーザー名とロールは必須事項となっているので入力してください。ユーザー追加は招待形式なので、E-mailで招待をもらいたい場合はメールアドレスを入力する必要があります。
f:id:akngo22:20190813175848j:plain

②作成したユーザーを認証する

ユーザーを作成すると「Pending Invites」一覧に表示されると思うので、ユーザー右の「Conpy Invite」をクリックしコピーされたURLにアクセスします。
※おそらくURLがlocalhostになっているので、IPアドレスでGrafanaGUI画面にアクセスしている場合はURLを書き換えてください。
f:id:akngo22:20190813180611j:plain
ログインするためのパスワードを入力し「Sign Up」をクリックすると、追加したユーザーでログインできると思います。
f:id:akngo22:20190813180824j:plain
管理者のページでユーザーが「Pending Invites」からユーザー一覧に表示されていることを確認します。
f:id:akngo22:20190813180846j:plain

③チームを作成する

Grafanaはユーザーをチームというユーザーグループで管理するようになっており、チーム別にトップ画面を変更することができます。先ほど作成したユーザーは閲覧者のため、Viewerというチームを作成することとします。
「Teams」タブ⇒「New team」をクリックし、チーム名を入力した後「Create」します。
f:id:akngo22:20190813182054j:plain

チームが作成されたらユーザーを追加します。
「Add member」⇒「Add to team」でユーザーを追加していきます。
f:id:akngo22:20190814102139j:plain
一覧に表示されればOKです。
f:id:akngo22:20190814102231j:plain

④チームの設定を変更する

ここでチームのホームダッシュボードを変更します。
「Teams」タブから作成したチームをクリックします。
f:id:akngo22:20190814103426j:plain
「Settings」タブ⇒「Home dashboard」で変更可能です。
※ホームダッシュボードは、スターを付けているダッシュボードからしか選択できない仕様なので、ドロップダウンリストに表示されない場合はダッシュボードにスターを付けてから実施してください。
f:id:akngo22:20190814103542j:plain

⑤ログインして確認

作成したユーザーでログインし、ホーム画面が指定したダッシュボードになっていればOKです。ログインユーザーは閲覧権限しかないので、パネルを編集しようとしてもできないようになっています。
f:id:akngo22:20190814104609j:plain

ダッシュボードの閲覧権限変更したい

このままだとダッシュボードの権限はデフォルトのままなので、トップページ変更したとしても他のダッシュボードにアクセスできてしまいます。そのため、ダッシュボードをフォルダごとで閲覧権限を変更しておきます。(※ダッシュボードごとにも権限を変更することは可能ですが、面倒なのでフォルダごとにやります。)
イメージとしては閲覧者と管理者用のフォルダを作成し、管理者用のフォルダには閲覧者の権限を外すようにします。
f:id:akngo22:20190814113330j:plain

①フォルダを作成する

画面右上の「▼」をクリックし、「New Folder」を選択します。
フォルダ作成したらダッシュボードの格納フォルダを変更します。(ダッシュボードのSettingsから変更可能)
f:id:akngo22:20190814113547j:plain

②フォルダ権限を変更する

フォルダのSettingsから「Permissions」タブを選択し、今回は管理者用のフォルダなので閲覧者の権限を外すためViewerの「×」をクリックします。これで管理者フォルダに格納されているダッシュボードはロールがViewerの場合見れないようになりました。
f:id:akngo22:20190814114606j:plain

とはいえ全部GUIでやるのめんどくさい

めんどくさいので、GrafanaAPIでできるようにシェルスクリプト書きます。流れとしては、トークン取得からユーザー作成、チーム作成、チームにメンバー追加、ダッシュボードの検索、作成チームのトップ画面変更までをスクリプト化しました。

#!/bin/bash

#obtain api token
API_TOKEN=`curl -X POST -H "Content-Type: application/json" -d '{"name":"api-test-key","role":"Admin"}' http://[admin_user]:[admin_pass]@localhost:3000/api/auth/keys | jq -r .key`
echo $API_TOKEN

#create user
USER_ID=`curl -X POST -u '[admin_user]:[admin_pass]' -H "Content-Type: application/json" -d '{"name":"test-user","email":"test-user@localhost","login":"test-user","password":"hogehoge"}' http://localhost:3000/api/admin/users | jq -r .id`
echo $USER_ID

#create team
TEAM_ID=`curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer ${API_TOKEN}" -d '{"name":"test-team","email":"test-team@localhost"}' http://localhost:3000/api/teams | jq -r .teamId`
echo $TEAM_ID

#add team member
curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer ${API_TOKEN}" -d '{"userId":'$USER_ID'}' http://localhost:3000/api/teams/$TEAM_ID/members

#search dashboard
DASHBOARD_ID=`curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer ${API_TOKEN}" http://localhost:3000/api/search?query=VM%20information | jq -r .[].id`

#star the dashboard
curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer ${API_TOKEN}" http://localhost:3000/api/user/stars/dashboard/$DASHBOARD_ID

#update team preference
curl -X PUT -H "Content-Type: application/json" -H "Authorization: Bearer ${API_
TOKEN}" -d '{"theme":"dark","homeDashboardId":'$DASHBOARD_ID',"timezone":""}' ht
tp://localhost:3000/api/teams/$TEAM_ID/preferences

GrafanaAPIを使ってスクリプト書くとき、気を付けたいのがものによって認証方法が違うことです。APIトークンを使う(管理者権限がいらない)Bearer認証とAdmin情報が必要な(管理者権限のいる)Basic認証の2つがあります。
上記のスクリプトの場合、ユーザー作成のときはBasic認証でそれ以外はBearer認証となっています。見分け方は基本的にリクエスト例のAuthorizationがBearerかBasicかで判断することができますが、時々公式ドキュメントが間違えているのでうまくいかない場合は認証方法を変更してみてください。
grafana.com

おしまい。