Grafana便利だよね
Grafana便利ですよね。最近はGrafanaを使って監視ダッシュボードの開発をメインにしているので、Grafana職人なのかなって思うくらい使っています。
今回は、ユーザー(グループ)ごとに見せたいダッシュボードを変えたいときの実例について書きます。管理者と閲覧者に見せる画面を変えて閲覧権限を制限したりなどができるかと思います。
やりたいこと
管理者と閲覧者のトップページ(ログイン後の画面)を変えて、アクセスできるダッシュボードに制限をかけたいと思います。
イメージは以下のようなものを想定しています。
お試し環境
今回は、Grafana6.16で試しました。
手順
①管理者でログインしユーザーを作成する
「configuration」⇒「users」⇒「invite」をクリックして、必要事項を入力します。
※ユーザー名とロールは必須事項となっているので入力してください。ユーザー追加は招待形式なので、E-mailで招待をもらいたい場合はメールアドレスを入力する必要があります。
②作成したユーザーを認証する
ユーザーを作成すると「Pending Invites」一覧に表示されると思うので、ユーザー右の「Conpy Invite」をクリックしコピーされたURLにアクセスします。
※おそらくURLがlocalhostになっているので、IPアドレスでGrafanaGUI画面にアクセスしている場合はURLを書き換えてください。
ログインするためのパスワードを入力し「Sign Up」をクリックすると、追加したユーザーでログインできると思います。
管理者のページでユーザーが「Pending Invites」からユーザー一覧に表示されていることを確認します。
③チームを作成する
Grafanaはユーザーをチームというユーザーグループで管理するようになっており、チーム別にトップ画面を変更することができます。先ほど作成したユーザーは閲覧者のため、Viewerというチームを作成することとします。
「Teams」タブ⇒「New team」をクリックし、チーム名を入力した後「Create」します。
チームが作成されたらユーザーを追加します。
「Add member」⇒「Add to team」でユーザーを追加していきます。
一覧に表示されればOKです。
④チームの設定を変更する
ここでチームのホームダッシュボードを変更します。
「Teams」タブから作成したチームをクリックします。
「Settings」タブ⇒「Home dashboard」で変更可能です。
※ホームダッシュボードは、スターを付けているダッシュボードからしか選択できない仕様なので、ドロップダウンリストに表示されない場合はダッシュボードにスターを付けてから実施してください。
⑤ログインして確認
作成したユーザーでログインし、ホーム画面が指定したダッシュボードになっていればOKです。ログインユーザーは閲覧権限しかないので、パネルを編集しようとしてもできないようになっています。
ダッシュボードの閲覧権限変更したい
このままだとダッシュボードの権限はデフォルトのままなので、トップページ変更したとしても他のダッシュボードにアクセスできてしまいます。そのため、ダッシュボードをフォルダごとで閲覧権限を変更しておきます。(※ダッシュボードごとにも権限を変更することは可能ですが、面倒なのでフォルダごとにやります。)
イメージとしては閲覧者と管理者用のフォルダを作成し、管理者用のフォルダには閲覧者の権限を外すようにします。
①フォルダを作成する
画面右上の「▼」をクリックし、「New Folder」を選択します。
フォルダ作成したらダッシュボードの格納フォルダを変更します。(ダッシュボードのSettingsから変更可能)
②フォルダ権限を変更する
フォルダのSettingsから「Permissions」タブを選択し、今回は管理者用のフォルダなので閲覧者の権限を外すためViewerの「×」をクリックします。これで管理者フォルダに格納されているダッシュボードはロールがViewerの場合見れないようになりました。
とはいえ全部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
おしまい。